svf-tools 1.0.552 → 1.0.555

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 (355) hide show
  1. package/README.md +11 -1
  2. package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +1 -1
  3. package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +1 -1
  4. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +7 -7
  5. package/SVF-doxygen/html/html/Andersen_8h_source.html +2 -2
  6. package/SVF-doxygen/html/html/Annotator_8h_source.html +1 -1
  7. package/SVF-doxygen/html/html/BreakConstantExpr_8cpp.html +1 -1
  8. package/SVF-doxygen/html/html/BreakConstantExpr_8cpp_source.html +3 -3
  9. package/SVF-doxygen/html/html/BreakConstantExpr_8h_source.html +1 -1
  10. package/SVF-doxygen/html/html/CFLAlias_8cpp_source.html +8 -8
  11. package/SVF-doxygen/html/html/CFLAlias_8h_source.html +2 -2
  12. package/SVF-doxygen/html/html/CFLGraph_8cpp_source.html +1 -1
  13. package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +18 -18
  14. package/SVF-doxygen/html/html/CHGBuilder_8h.html +1 -0
  15. package/SVF-doxygen/html/html/CHGBuilder_8h_source.html +11 -10
  16. package/SVF-doxygen/html/html/CHG_8cpp.html +2 -2
  17. package/SVF-doxygen/html/html/CHG_8cpp_source.html +8 -8
  18. package/SVF-doxygen/html/html/CHG_8h_source.html +3 -3
  19. package/SVF-doxygen/html/html/CPPUtil_8cpp_source.html +17 -17
  20. package/SVF-doxygen/html/html/CPPUtil_8h_source.html +1 -1
  21. package/SVF-doxygen/html/html/CallGraphBuilder_8cpp_source.html +4 -4
  22. package/SVF-doxygen/html/html/ConditionalPT_8h_source.html +1 -1
  23. package/SVF-doxygen/html/html/ConsG_8cpp_source.html +1 -1
  24. package/SVF-doxygen/html/html/ConsG_8h_source.html +1 -1
  25. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +2 -2
  26. package/SVF-doxygen/html/html/ContextDDA_8h_source.html +1 -1
  27. package/SVF-doxygen/html/html/CoreBitVector_8cpp_source.html +1 -1
  28. package/SVF-doxygen/html/html/CxtStmt_8h_source.html +3 -3
  29. package/SVF-doxygen/html/html/DCHG_8cpp.html +2 -2
  30. package/SVF-doxygen/html/html/DCHG_8cpp_source.html +38 -35
  31. package/SVF-doxygen/html/html/DCHG_8h_source.html +9 -10
  32. package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +11 -14
  33. package/SVF-doxygen/html/html/DDAPass_8h_source.html +12 -13
  34. package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +1 -1
  35. package/SVF-doxygen/html/html/DPItem_8h_source.html +2 -2
  36. package/SVF-doxygen/html/html/DataFlowUtil_8cpp_source.html +5 -5
  37. package/SVF-doxygen/html/html/DataFlowUtil_8h_source.html +7 -7
  38. package/SVF-doxygen/html/html/DoubleFreeChecker_8cpp_source.html +2 -2
  39. package/SVF-doxygen/html/html/DoubleFreeChecker_8h_source.html +1 -1
  40. package/SVF-doxygen/html/html/ExeState_8cpp_source.html +3 -3
  41. package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +5 -5
  42. package/SVF-doxygen/html/html/ExtAPI_8h_source.html +4 -4
  43. package/SVF-doxygen/html/html/FileChecker_8h_source.html +1 -1
  44. package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +1 -1
  45. package/SVF-doxygen/html/html/FlowDDA_8h_source.html +1 -1
  46. package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +1 -1
  47. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +1 -1
  48. package/SVF-doxygen/html/html/GEPTypeBridgeIterator_8h_source.html +1 -1
  49. package/SVF-doxygen/html/html/Graph2Json_8cpp_source.html +1 -1
  50. package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +9 -9
  51. package/SVF-doxygen/html/html/ICFGBuilder_8h_source.html +1 -1
  52. package/SVF-doxygen/html/html/ICFGNode_8h_source.html +2 -2
  53. package/SVF-doxygen/html/html/ICFG_8cpp_source.html +5 -5
  54. package/SVF-doxygen/html/html/ICFG_8h_source.html +1 -1
  55. package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +5 -5
  56. package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +1 -1
  57. package/SVF-doxygen/html/html/IRGraph_8h_source.html +2 -2
  58. package/SVF-doxygen/html/html/LLVMLoopAnalysis_8cpp_source.html +3 -3
  59. package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +12 -12
  60. package/SVF-doxygen/html/html/LLVMModule_8h_source.html +20 -18
  61. package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +27 -27
  62. package/SVF-doxygen/html/html/LLVMUtil_8h_source.html +17 -17
  63. package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +2 -2
  64. package/SVF-doxygen/html/html/LeakChecker_8h_source.html +1 -1
  65. package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +3 -3
  66. package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +7 -7
  67. package/SVF-doxygen/html/html/LockAnalysis_8h_source.html +1 -1
  68. package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +10 -10
  69. package/SVF-doxygen/html/html/LockResultValidator_8h_source.html +1 -1
  70. package/SVF-doxygen/html/html/MHP_8cpp.html +2 -2
  71. package/SVF-doxygen/html/html/MHP_8cpp_source.html +11 -11
  72. package/SVF-doxygen/html/html/MHP_8h_source.html +3 -3
  73. package/SVF-doxygen/html/html/MSSAMuChi_8h_source.html +1 -1
  74. package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +5 -5
  75. package/SVF-doxygen/html/html/MTAAnnotator_8h_source.html +3 -3
  76. package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +12 -12
  77. package/SVF-doxygen/html/html/MTAResultValidator_8h_source.html +4 -4
  78. package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +4 -4
  79. package/SVF-doxygen/html/html/MTA_8cpp_source.html +4 -4
  80. package/SVF-doxygen/html/html/MTA_8h_source.html +3 -3
  81. package/SVF-doxygen/html/html/MemPartition_8cpp_source.html +1 -1
  82. package/SVF-doxygen/html/html/MemPartition_8h_source.html +1 -1
  83. package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +6 -6
  84. package/SVF-doxygen/html/html/MemRegion_8h_source.html +1 -1
  85. package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +10 -10
  86. package/SVF-doxygen/html/html/MemSSA_8h_source.html +3 -3
  87. package/SVF-doxygen/html/html/MutablePointsToDS_8h_source.html +2 -2
  88. package/SVF-doxygen/html/html/PCG_8cpp_source.html +6 -6
  89. package/SVF-doxygen/html/html/PCG_8h_source.html +1 -1
  90. package/SVF-doxygen/html/html/PTACallGraph_8cpp_source.html +6 -6
  91. package/SVF-doxygen/html/html/PTACallGraph_8h_source.html +1 -1
  92. package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +1 -1
  93. package/SVF-doxygen/html/html/PersistentPointsToDS_8h_source.html +2 -2
  94. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +2 -2
  95. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +11 -11
  96. package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +1 -1
  97. package/SVF-doxygen/html/html/PointsTo_8cpp_source.html +1 -1
  98. package/SVF-doxygen/html/html/ProgSlice_8cpp_source.html +1 -1
  99. package/SVF-doxygen/html/html/SVF-FE_2BasicTypes_8h.html +2 -0
  100. package/SVF-doxygen/html/html/SVF-FE_2BasicTypes_8h_source.html +110 -109
  101. package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +4 -4
  102. package/SVF-doxygen/html/html/SVFGBuilder_8h_source.html +2 -2
  103. package/SVF-doxygen/html/html/SVFGNode_8h_source.html +1 -1
  104. package/SVF-doxygen/html/html/SVFGOPT_8h_source.html +1 -1
  105. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +4 -4
  106. package/SVF-doxygen/html/html/SVFG_8h_source.html +1 -1
  107. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +61 -61
  108. package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +47 -47
  109. package/SVF-doxygen/html/html/SVFIR_8h_source.html +1 -1
  110. package/SVF-doxygen/html/html/SVFModule_8h_source.html +4 -4
  111. package/SVF-doxygen/html/html/SVFStatements_8cpp_source.html +1 -1
  112. package/SVF-doxygen/html/html/SVFUtil_8cpp_source.html +9 -9
  113. package/SVF-doxygen/html/html/SVFUtil_8h_source.html +49 -52
  114. package/SVF-doxygen/html/html/SVFVariables_8cpp_source.html +2 -2
  115. package/SVF-doxygen/html/html/SVFVariables_8h_source.html +2 -2
  116. package/SVF-doxygen/html/html/SaberAnnotator_8cpp_source.html +2 -2
  117. package/SVF-doxygen/html/html/SaberCheckerAPI_8h_source.html +2 -2
  118. package/SVF-doxygen/html/html/SaberCondAllocator_8cpp_source.html +10 -10
  119. package/SVF-doxygen/html/html/SaberCondAllocator_8h_source.html +4 -4
  120. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +1 -1
  121. package/SVF-doxygen/html/html/SparseBitVector_8h_source.html +1 -1
  122. package/SVF-doxygen/html/html/SrcSnkDDA_8h_source.html +1 -1
  123. package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +34 -34
  124. package/SVF-doxygen/html/html/SymbolTableBuilder_8h_source.html +1 -1
  125. package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +5 -5
  126. package/SVF-doxygen/html/html/SymbolTableInfo_8h_source.html +5 -5
  127. package/SVF-doxygen/html/html/TCT_8cpp_source.html +12 -12
  128. package/SVF-doxygen/html/html/TCT_8h_source.html +8 -8
  129. package/SVF-doxygen/html/html/ThreadAPI_8cpp_source.html +4 -4
  130. package/SVF-doxygen/html/html/ThreadAPI_8h_source.html +4 -4
  131. package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +2 -2
  132. package/SVF-doxygen/html/html/ThreadCallGraph_8h_source.html +2 -2
  133. package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +2 -2
  134. package/SVF-doxygen/html/html/Util_2BasicTypes_8h.html +0 -2
  135. package/SVF-doxygen/html/html/Util_2BasicTypes_8h_source.html +79 -80
  136. package/SVF-doxygen/html/html/VFGNode_8h_source.html +1 -1
  137. package/SVF-doxygen/html/html/VFG_8cpp_source.html +3 -3
  138. package/SVF-doxygen/html/html/VFG_8h_source.html +1 -1
  139. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +1 -1
  140. package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +9 -12
  141. package/SVF-doxygen/html/html/WPAPass_8h_source.html +10 -11
  142. package/SVF-doxygen/html/html/classSVF_1_1ActualINSVFGNode.html +1 -1
  143. package/SVF-doxygen/html/html/classSVF_1_1ActualOUTSVFGNode.html +1 -1
  144. package/SVF-doxygen/html/html/classSVF_1_1ActualParmVFGNode.html +1 -1
  145. package/SVF-doxygen/html/html/classSVF_1_1ActualRetVFGNode.html +1 -1
  146. package/SVF-doxygen/html/html/classSVF_1_1AddrStmt.html +1 -1
  147. package/SVF-doxygen/html/html/classSVF_1_1AddrVFGNode.html +1 -1
  148. package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +7 -7
  149. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +1 -1
  150. package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +1 -1
  151. package/SVF-doxygen/html/html/classSVF_1_1Annotator.html +1 -1
  152. package/SVF-doxygen/html/html/classSVF_1_1ArgumentVFGNode.html +1 -1
  153. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +2 -2
  154. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPStmt.html +1 -1
  155. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +1 -1
  156. package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.html +1 -1
  157. package/SVF-doxygen/html/html/classSVF_1_1BranchVFGNode.html +1 -1
  158. package/SVF-doxygen/html/html/classSVF_1_1BreakConstantGEPs.html +2 -2
  159. package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.html +8 -8
  160. package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +50 -50
  161. package/SVF-doxygen/html/html/classSVF_1_1CHGraph.html +6 -6
  162. package/SVF-doxygen/html/html/classSVF_1_1CallCFGEdge.html +1 -1
  163. package/SVF-doxygen/html/html/classSVF_1_1CallDirSVFGEdge.html +1 -1
  164. package/SVF-doxygen/html/html/classSVF_1_1CallGraphBuilder.html +3 -3
  165. package/SVF-doxygen/html/html/classSVF_1_1CallICFGNode.html +2 -2
  166. package/SVF-doxygen/html/html/classSVF_1_1CallIndSVFGEdge.html +1 -1
  167. package/SVF-doxygen/html/html/classSVF_1_1CallPE.html +1 -1
  168. package/SVF-doxygen/html/html/classSVF_1_1CallSite.html +41 -41
  169. package/SVF-doxygen/html/html/classSVF_1_1CmpStmt.html +1 -1
  170. package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +1 -1
  171. package/SVF-doxygen/html/html/classSVF_1_1CondStdSet.html +1 -1
  172. package/SVF-doxygen/html/html/classSVF_1_1CondVar.html +1 -1
  173. package/SVF-doxygen/html/html/classSVF_1_1ContextCond.html +3 -3
  174. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +4 -4
  175. package/SVF-doxygen/html/html/classSVF_1_1CopyStmt.html +1 -1
  176. package/SVF-doxygen/html/html/classSVF_1_1CopyVFGNode.html +1 -1
  177. package/SVF-doxygen/html/html/classSVF_1_1CoreBitVector.html +2 -2
  178. package/SVF-doxygen/html/html/classSVF_1_1CxtDPItem.html +2 -2
  179. package/SVF-doxygen/html/html/classSVF_1_1CxtProc.html +1 -1
  180. package/SVF-doxygen/html/html/classSVF_1_1CxtStmt.html +1 -1
  181. package/SVF-doxygen/html/html/classSVF_1_1CxtThread.html +1 -1
  182. package/SVF-doxygen/html/html/classSVF_1_1DCHGraph-members.html +1 -1
  183. package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +114 -111
  184. package/SVF-doxygen/html/html/classSVF_1_1DDAPass-members.html +5 -6
  185. package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +42 -79
  186. package/SVF-doxygen/html/html/classSVF_1_1DirectSVFGEdge.html +1 -1
  187. package/SVF-doxygen/html/html/classSVF_1_1DistinctMRG.html +1 -1
  188. package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker.html +2 -2
  189. package/SVF-doxygen/html/html/classSVF_1_1DummyObjVar.html +1 -1
  190. package/SVF-doxygen/html/html/classSVF_1_1DummyValVar.html +1 -1
  191. package/SVF-doxygen/html/html/classSVF_1_1ExeState.html +5 -5
  192. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI-members.html +1 -1
  193. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +8 -8
  194. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI_1_1Operation-members.html +1 -1
  195. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI_1_1Operation.html +5 -5
  196. package/SVF-doxygen/html/html/classSVF_1_1FIObjVar.html +1 -1
  197. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +2 -2
  198. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +1 -1
  199. package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis.html +12 -12
  200. package/SVF-doxygen/html/html/classSVF_1_1FormalINSVFGNode.html +1 -1
  201. package/SVF-doxygen/html/html/classSVF_1_1FormalOUTSVFGNode.html +1 -1
  202. package/SVF-doxygen/html/html/classSVF_1_1FormalParmVFGNode.html +1 -1
  203. package/SVF-doxygen/html/html/classSVF_1_1FormalRetVFGNode.html +1 -1
  204. package/SVF-doxygen/html/html/classSVF_1_1FunEntryICFGNode.html +3 -3
  205. package/SVF-doxygen/html/html/classSVF_1_1FunExitICFGNode.html +4 -4
  206. package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +1 -1
  207. package/SVF-doxygen/html/html/classSVF_1_1GepStmt.html +1 -1
  208. package/SVF-doxygen/html/html/classSVF_1_1GepVFGNode.html +1 -1
  209. package/SVF-doxygen/html/html/classSVF_1_1GepValVar.html +1 -1
  210. package/SVF-doxygen/html/html/classSVF_1_1GlobalICFGNode.html +1 -1
  211. package/SVF-doxygen/html/html/classSVF_1_1ICFG.html +2 -2
  212. package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +13 -13
  213. package/SVF-doxygen/html/html/classSVF_1_1ICFGEdge.html +1 -1
  214. package/SVF-doxygen/html/html/classSVF_1_1ICFGNode.html +1 -1
  215. package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter.html +1 -1
  216. package/SVF-doxygen/html/html/classSVF_1_1IRAnnotator.html +1 -1
  217. package/SVF-doxygen/html/html/classSVF_1_1IndirectSVFGEdge.html +1 -1
  218. package/SVF-doxygen/html/html/classSVF_1_1InterDisjointMRG.html +1 -1
  219. package/SVF-doxygen/html/html/classSVF_1_1InterMSSAPHISVFGNode.html +1 -1
  220. package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode.html +1 -1
  221. package/SVF-doxygen/html/html/classSVF_1_1IntraCFGEdge.html +1 -1
  222. package/SVF-doxygen/html/html/classSVF_1_1IntraDirSVFGEdge.html +1 -1
  223. package/SVF-doxygen/html/html/classSVF_1_1IntraDisjointMRG.html +1 -1
  224. package/SVF-doxygen/html/html/classSVF_1_1IntraICFGNode.html +1 -1
  225. package/SVF-doxygen/html/html/classSVF_1_1IntraIndSVFGEdge.html +1 -1
  226. package/SVF-doxygen/html/html/classSVF_1_1IntraMSSAPHISVFGNode.html +1 -1
  227. package/SVF-doxygen/html/html/classSVF_1_1IntraPHIVFGNode.html +1 -1
  228. package/SVF-doxygen/html/html/classSVF_1_1IteratedDominanceFrontier.html +2 -2
  229. package/SVF-doxygen/html/html/classSVF_1_1LLVMLoopAnalysis.html +3 -3
  230. package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet-members.html +20 -19
  231. package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +95 -54
  232. package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +4 -4
  233. package/SVF-doxygen/html/html/classSVF_1_1LoadStmt.html +1 -1
  234. package/SVF-doxygen/html/html/classSVF_1_1LoadVFGNode.html +1 -1
  235. package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +4 -4
  236. package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +20 -20
  237. package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +9 -9
  238. package/SVF-doxygen/html/html/classSVF_1_1MHP.html +19 -19
  239. package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +12 -12
  240. package/SVF-doxygen/html/html/classSVF_1_1MRSVFGNode.html +1 -1
  241. package/SVF-doxygen/html/html/classSVF_1_1MSSAPHISVFGNode.html +1 -1
  242. package/SVF-doxygen/html/html/classSVF_1_1MTA.html +4 -4
  243. package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +10 -10
  244. package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +15 -15
  245. package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +4 -4
  246. package/SVF-doxygen/html/html/classSVF_1_1MemObj.html +1 -1
  247. package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +13 -13
  248. package/SVF-doxygen/html/html/classSVF_1_1MemSSADF.html +1 -1
  249. package/SVF-doxygen/html/html/classSVF_1_1MutablePTData.html +2 -2
  250. package/SVF-doxygen/html/html/classSVF_1_1NullPtrVFGNode.html +1 -1
  251. package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +1 -1
  252. package/SVF-doxygen/html/html/classSVF_1_1PCG.html +11 -11
  253. package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +1 -1
  254. package/SVF-doxygen/html/html/classSVF_1_1PTACFInfoBuilder.html +4 -4
  255. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraph.html +1 -1
  256. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphEdge.html +4 -4
  257. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphNode.html +2 -2
  258. package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +1 -1
  259. package/SVF-doxygen/html/html/classSVF_1_1PersistentIncDFPTData.html +2 -2
  260. package/SVF-doxygen/html/html/classSVF_1_1PersistentPTData.html +2 -2
  261. package/SVF-doxygen/html/html/classSVF_1_1PhiStmt.html +1 -1
  262. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +16 -16
  263. package/SVF-doxygen/html/html/classSVF_1_1PointsTo.html +3 -3
  264. package/SVF-doxygen/html/html/classSVF_1_1PointsTo_1_1PointsToIterator.html +2 -2
  265. package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +1 -1
  266. package/SVF-doxygen/html/html/classSVF_1_1RaceResultValidator.html +4 -4
  267. package/SVF-doxygen/html/html/classSVF_1_1RetCFGEdge.html +1 -1
  268. package/SVF-doxygen/html/html/classSVF_1_1RetDirSVFGEdge.html +1 -1
  269. package/SVF-doxygen/html/html/classSVF_1_1RetICFGNode.html +1 -1
  270. package/SVF-doxygen/html/html/classSVF_1_1RetIndSVFGEdge.html +1 -1
  271. package/SVF-doxygen/html/html/classSVF_1_1RetPE.html +1 -1
  272. package/SVF-doxygen/html/html/classSVF_1_1RetPN.html +1 -1
  273. package/SVF-doxygen/html/html/classSVF_1_1SVFBasicBlock.html +3 -3
  274. package/SVF-doxygen/html/html/classSVF_1_1SVFFunction.html +61 -61
  275. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +3 -3
  276. package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +4 -4
  277. package/SVF-doxygen/html/html/classSVF_1_1SVFGlobal.html +3 -3
  278. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +123 -120
  279. package/SVF-doxygen/html/html/classSVF_1_1SVFStmt.html +1 -1
  280. package/SVF-doxygen/html/html/classSVF_1_1SVFVar.html +3 -3
  281. package/SVF-doxygen/html/html/classSVF_1_1SaberAnnotator.html +5 -5
  282. package/SVF-doxygen/html/html/classSVF_1_1SaberCheckerAPI.html +4 -4
  283. package/SVF-doxygen/html/html/classSVF_1_1SaberCondAllocator.html +14 -14
  284. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +1 -1
  285. package/SVF-doxygen/html/html/classSVF_1_1SelectStmt.html +1 -1
  286. package/SVF-doxygen/html/html/classSVF_1_1SparseBitVector.html +2 -2
  287. package/SVF-doxygen/html/html/classSVF_1_1StmtVFGNode.html +1 -1
  288. package/SVF-doxygen/html/html/classSVF_1_1StoreStmt.html +1 -1
  289. package/SVF-doxygen/html/html/classSVF_1_1StoreVFGNode.html +1 -1
  290. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +40 -40
  291. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +8 -8
  292. package/SVF-doxygen/html/html/classSVF_1_1TCT.html +19 -19
  293. package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +1 -1
  294. package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +1 -1
  295. package/SVF-doxygen/html/html/classSVF_1_1ThreadAPI.html +4 -4
  296. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +4 -4
  297. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraphBuilder.html +1 -1
  298. package/SVF-doxygen/html/html/classSVF_1_1ThreadForkEdge.html +1 -1
  299. package/SVF-doxygen/html/html/classSVF_1_1ThreadJoinEdge.html +1 -1
  300. package/SVF-doxygen/html/html/classSVF_1_1ThreadMHPIndSVFGEdge.html +1 -1
  301. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +2 -2
  302. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPStmt.html +1 -1
  303. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +1 -1
  304. package/SVF-doxygen/html/html/classSVF_1_1VFG.html +4 -4
  305. package/SVF-doxygen/html/html/classSVF_1_1VFGEdge.html +1 -1
  306. package/SVF-doxygen/html/html/classSVF_1_1VFGNode.html +1 -1
  307. package/SVF-doxygen/html/html/classSVF_1_1ValVar.html +1 -1
  308. package/SVF-doxygen/html/html/classSVF_1_1VarArgPN.html +1 -1
  309. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +1 -1
  310. package/SVF-doxygen/html/html/classSVF_1_1WPAPass-members.html +4 -5
  311. package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +28 -66
  312. package/SVF-doxygen/html/html/functions_b.html +1 -1
  313. package/SVF-doxygen/html/html/functions_func_b.html +1 -1
  314. package/SVF-doxygen/html/html/functions_func_g.html +8 -8
  315. package/SVF-doxygen/html/html/functions_func_r.html +3 -3
  316. package/SVF-doxygen/html/html/functions_g.html +9 -9
  317. package/SVF-doxygen/html/html/functions_r.html +2 -4
  318. package/SVF-doxygen/html/html/namespaceSVF.html +141 -141
  319. package/SVF-doxygen/html/html/namespaceSVF_1_1LLVMUtil.html +49 -49
  320. package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +168 -171
  321. package/SVF-doxygen/html/html/namespaceSVF_1_1cppUtil.html +28 -28
  322. package/SVF-doxygen/html/html/search/all_11.js +1 -1
  323. package/SVF-doxygen/html/html/search/all_13.js +1 -1
  324. package/SVF-doxygen/html/html/search/all_2.js +1 -1
  325. package/SVF-doxygen/html/html/search/all_7.js +3 -3
  326. package/SVF-doxygen/html/html/search/functions_1.js +1 -1
  327. package/SVF-doxygen/html/html/search/functions_10.js +1 -1
  328. package/SVF-doxygen/html/html/search/functions_6.js +3 -3
  329. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01CFLGraph_01_5_01_4.html +3 -3
  330. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +1 -1
  331. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ICFG_01_5_01_4.html +2 -2
  332. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.html +1 -1
  333. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01PTACallGraph_01_5_01_4.html +3 -3
  334. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01SVFG_01_5_01_4.html +4 -4
  335. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01VFG_01_5_01_4.html +4 -4
  336. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1CallSite_01_4.html +3 -3
  337. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1CxtProc_01_4.html +1 -1
  338. package/SVF-doxygen/html/html/svf-ex_8cpp.html +1 -1
  339. package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +1 -1
  340. package/include/DDA/DDAPass.h +0 -3
  341. package/include/SVF-FE/BasicTypes.h +1 -0
  342. package/include/SVF-FE/CHGBuilder.h +1 -0
  343. package/include/SVF-FE/DCHG.h +1 -1
  344. package/include/SVF-FE/LLVMModule.h +17 -0
  345. package/include/Util/BasicTypes.h +0 -1
  346. package/include/Util/ExtAPI.h +2 -2
  347. package/include/Util/ExtAPI.json +3 -3
  348. package/include/Util/SVFUtil.h +1 -13
  349. package/include/WPA/WPAPass.h +0 -3
  350. package/lib/DDA/DDAPass.cpp +0 -7
  351. package/lib/SVF-FE/DCHG.cpp +4 -7
  352. package/lib/SVF-FE/SVFIRBuilder.cpp +63 -23
  353. package/lib/Util/ExtAPI.cpp +1 -1
  354. package/lib/WPA/WPAPass.cpp +0 -10
  355. package/package.json +1 -1
@@ -66,32 +66,32 @@ $(function() {
66
66
  <div class="title">LLVMModule.cpp</div> </div>
67
67
  </div><!--header-->
68
68
  <div class="contents">
69
- <a href="LLVMModule_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">//===----- SVFModule.cpp Base class of pointer analyses ---------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// Copyright (C) &lt;2013-2017&gt; &lt;Yulei Sui&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">// along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment"> * SVFModule.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment"> * Created on: Aug 4, 2017</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment"> * Author: Xiaokang Fan</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Options_8h.html">Util/Options.h</a>&quot;</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &lt;queue&gt;</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFModule_8h.html">Util/SVFModule.h</a>&quot;</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>&quot;</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVF-FE_2BasicTypes_8h.html">SVF-FE/BasicTypes.h</a>&quot;</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="LLVMUtil_8h.html">SVF-FE/LLVMUtil.h</a>&quot;</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="BreakConstantExpr_8h.html">SVF-FE/BreakConstantExpr.h</a>&quot;</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacestd.html">std</a>;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment"> svf.main() is used to model the real entry point of a C++ program, which</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment"> initializes all global C++ objects and then call main().</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="comment"> LLVM may generate two global arrays @llvm.global_ctors and @llvm.global_dtors</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="comment"> that contain constructor and destructor functions for global variables. They</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="comment"> are not called explicitly, so we have to add them in the svf.main function.</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="comment"> The order to call these constructor and desctructor functions are also</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="comment"> specified in the global arrays.</span></div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="comment"> Related part in LLVM language reference:</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="comment"> https://llvm.org/docs/LangRef.html#the-llvm-global-ctors-global-variable</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="comment"> For example, given a &quot;int main(int argc, char * argv[])&quot;, the corresponding</span></div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="comment"> svf.main will be generated as follows:</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="comment"> define void @svf.main(i32, i8**, i8**) {</span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="comment"> entry:</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="comment"> call void @ctor1()</span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="comment"> call void @ctor2()</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;<span class="comment"> %3 = call i32 @main(i32 %0, i8** %1)</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="comment"> call void @dtor1()</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="comment"> call void @dtor2()</span></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="comment"> ret void</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;<span class="comment"> }</span></div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;</div><div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b"> 67</a></span>&#160;<span class="preprocessor">#define SVF_MAIN_FUNC_NAME &quot;svf.main&quot;</span></div><div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="LLVMModule_8cpp.html#aa18802f2f60ef8030c66a42f20f285af"> 68</a></span>&#160;<span class="preprocessor">#define SVF_GLOBAL_CTORS &quot;llvm.global_ctors&quot;</span></div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="LLVMModule_8cpp.html#a9fd6e28e6ed93f65a20a348ab0646320"> 69</a></span>&#160;<span class="preprocessor">#define SVF_GLOBAL_DTORS &quot;llvm.global_dtors&quot;</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;<a class="code" href="classSVF_1_1LLVMModuleSet.html">LLVMModuleSet</a> *LLVMModuleSet::llvmModuleSet = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;<a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> SVFModule::pagReadFromTxt = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;</div><div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ae919327019b5014f64b754dbdeb07f75"> 74</a></span>&#160;<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* LLVMModuleSet::buildSVFModule(<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &amp;mod)</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;{</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; svfModule = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>(mod.getModuleIdentifier());</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; modules.emplace_back(mod);</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; build();</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="keywordflow">return</span> svfModule;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;}</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;</div><div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a1f8e769251c89433311eeb6f98d115e9"> 84</a></span>&#160;<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* LLVMModuleSet::buildSVFModule(<span class="keyword">const</span> std::vector&lt;std::string&gt; &amp;moduleNameVec)</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;{</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; assert(llvmModuleSet &amp;&amp; <span class="stringliteral">&quot;LLVM Module set needs to be created!&quot;</span>);</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; loadModules(moduleNameVec);</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keywordflow">if</span>(!moduleNameVec.empty())</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; svfModule = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>(*moduleNameVec.begin());</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; svfModule = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>();</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; build();</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keywordflow">return</span> svfModule;</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;}</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;</div><div class="line"><a name="l00100"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a2fdc1bd61b8f6cdf6c07a5059b641b04"> 100</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::preProcessBCs(std::vector&lt;std::string&gt; &amp;moduleNameVec)</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;{</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; loadModules(moduleNameVec);</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; prePassSchedule();</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> preProcessSuffix = <span class="stringliteral">&quot;.pre.bc&quot;</span>;</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="comment">// Get the existing module names, remove old extention, add preProcessSuffix</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i &lt; moduleNameVec.size(); i++)</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; {</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> lastIndex = moduleNameVec[i].find_last_of(<span class="stringliteral">&quot;.&quot;</span>);</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> rawName = moduleNameVec[i].substr(0, lastIndex);</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; moduleNameVec[i] = (rawName + preProcessSuffix);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; }</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; dumpModulesToFile(preProcessSuffix);</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; preProcessed = <span class="keyword">true</span>;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; releaseLLVMModuleSet();</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;}</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;</div><div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#af8edfe08027020f14b81b44362c6018e"> 122</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::build()</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;{</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; initialize();</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; buildFunToFunMap();</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; buildGlobalDefToRepMap();</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFModule.html#acfd1ffb4696136de493843786c799e6b">SVFModule::FunctionSetType</a>&amp; functions = svfModule-&gt;getFunctionSet();</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordflow">for</span> (SVFModule::FunctionSetType::const_iterator func_iter = functions.begin(); func_iter != functions.end(); func_iter++)</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; {</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* func = *func_iter;</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a2c61d741afbcfa853b505cd391f29f9b">isUncalledFunction</a> = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a2c61d741afbcfa853b505cd391f29f9b">LLVMUtil::isUncalledFunction</a>(func-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>());</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> isNotRetFunction = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a651b6a1cf3665277d2241220bb145aed">LLVMUtil::functionDoesNotRet</a>(func-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>());</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svffun = <span class="keyword">const_cast&lt;</span><a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>*<span class="keyword">&gt;</span>(func);</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; svffun-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#a3ff1ce3a7e4a9f4037a8bb74ddb5fabf">setIsNotRet</a>(isNotRetFunction);</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; svffun-&gt;setIsUncalledFunction(isUncalledFunction);</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">SVFUtil::isExtCall</a>(func) == <span class="keyword">false</span>)</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; {</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; std::vector&lt;const BasicBlock*&gt; reachableBBs;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <a class="code" href="namespaceSVF_1_1LLVMUtil.html#acf537fc9f72ca46c3b04bea3f2c2fb79">LLVMUtil::getFunReachableBBs</a>(func, reachableBBs);</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a> *exitBB = <span class="keyword">const_cast&lt;</span><a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>*<span class="keyword">&gt;</span>(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a3ef84be7e91335c7b35c395d247f85ae">LLVMUtil::getFunExitBB</a>(func));</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; svffun-&gt;setReachableBBs(reachableBBs);</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; svffun-&gt;setExitBB(exitBB);</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; }</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; }</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">if</span>(preProcessed==<span class="keyword">false</span>)</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; prePassSchedule();</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;}</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a8b5f24c873db1f6a0614d1dac48bb4bb"> 152</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::prePassSchedule()</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;{</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; std::unique_ptr&lt;BreakConstantGEPs&gt; p1 = std::make_unique&lt;BreakConstantGEPs&gt;();</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i &lt; LLVMModuleSet::getLLVMModuleSet()-&gt;getModuleNum(); ++i)</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; {</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> *module = LLVMModuleSet::getLLVMModuleSet()-&gt;getModule(i);</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; p1-&gt;runOnModule(*module);</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; }</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160;</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; std::unique_ptr&lt;UnifyFunctionExitNodes&gt; p2 =</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; std::make_unique&lt;UnifyFunctionExitNodes&gt;();</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i &lt; LLVMModuleSet::getLLVMModuleSet()-&gt;getModuleNum(); ++i)</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; {</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> *module = LLVMModuleSet::getLLVMModuleSet()-&gt;getModule(i);</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a> = module-&gt;begin(), E = module-&gt;end(); <a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a> != E; ++<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; {</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> &amp;fun = *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>;</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keywordflow">if</span> (fun.isDeclaration())</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; p2-&gt;runOnFunction(fun);</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; }</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; }</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;}</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;</div><div class="line"><a name="l00179"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a298966366b02d0a34f409c2c77da3789"> 179</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::loadModules(<span class="keyword">const</span> std::vector&lt;std::string&gt; &amp;moduleNameVec)</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160;{</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="comment">// We read SVFIR from LLVM IR</span></div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keywordflow">if</span>(Options::Graphtxt.getValue().empty())</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; {</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keywordflow">if</span>(moduleNameVec.empty())</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; {</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;no LLVM bc file is found!\n&quot;</span>;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; exit(0);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; }</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="comment">//assert(!moduleNameVec.empty() &amp;&amp; &quot;no LLVM bc file is found!&quot;);</span></div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; }</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="comment">// We read SVFIR from a user-defined txt instead of parsing SVFIR from LLVM IR</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; SVFModule::setPagFromTXT(Options::Graphtxt.getValue());</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <span class="comment">//</span></div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="comment">// To avoid the following type bugs (t1 != t3) when parsing multiple modules,</span></div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="comment">// We should use only one LLVMContext object for multiple modules in the same thread.</span></div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="comment">// No such problem if only one module is processed by SVF.</span></div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="comment">// LLVMContext ctxa,ctxb;</span></div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="comment">// IntegerType * t1 = IntegerType::get(ctxa,32);</span></div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="comment">// IntegerType * t2 = IntegerType::get(ctxa,32);</span></div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="comment">// assert(t1 == t2);</span></div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="comment">// IntegerType * t3 = IntegerType::get(ctxb,32);</span></div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="comment">// IntegerType * t4 = IntegerType::get(ctxb,32);</span></div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="comment">// assert(t3 == t4);</span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="comment">// assert(t1 != t3);</span></div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="comment">//</span></div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; cxts = std::make_unique&lt;LLVMContext&gt;();</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160;</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>&amp; moduleName : moduleNameVec)</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; {</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <a class="code" href="namespaceSVF.html#a86863d104a3930b3a806935d92ddbf30">SMDiagnostic</a> Err;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; std::unique_ptr&lt;Module&gt; mod = parseIRFile(moduleName, Err, *cxts);</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="keywordflow">if</span> (mod == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; {</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() &lt;&lt; <span class="stringliteral">&quot;load module: &quot;</span> &lt;&lt; moduleName &lt;&lt; <span class="stringliteral">&quot;failed!!\n\n&quot;</span>;</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; Err.print(<span class="stringliteral">&quot;SVFModuleLoader&quot;</span>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">llvm::errs</a>());</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; abort();</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; }</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; modules.emplace_back(*mod);</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; owned_modules.emplace_back(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a72502f7f536418621485e90ab98c2016">std::move</a>(mod));</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; }</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160;}</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;</div><div class="line"><a name="l00228"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a9782bf6b7b015fd8fb48f75eb4508d22"> 228</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::initialize()</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160;{</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">if</span> (Options::SVFMain)</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; addSVFMain();</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>&amp; mod : modules)</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; {</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="keywordflow">for</span> (Module::iterator it = mod.begin(), eit = mod.end();</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; it != eit; ++it)</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; {</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *func = &amp;*it;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfFunc = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>(func);</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; svfModule-&gt;addFunctionSet(svfFunc);</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; }</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="keywordflow">for</span> (Module::global_iterator it = mod.global_begin(),</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; eit = mod.global_end(); it != eit; ++it)</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; {</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global = &amp;*it;</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; svfModule-&gt;addGlobalSet(global);</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160;</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">for</span> (Module::alias_iterator it = mod.alias_begin(),</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; eit = mod.alias_end(); it != eit; ++it)</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; {</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <a class="code" href="namespaceSVF.html#a0fd33072b099f61eaa642e94ed0c03fc">GlobalAlias</a> *alias = &amp;*it;</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; svfModule-&gt;addAliasSet(alias);</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; }</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; }</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160;}</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160;</div><div class="line"><a name="l00262"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a0b46a2a5ff2165d17993a071d9cc82c1"> 262</a></span>&#160;std::vector&lt;const Function *&gt; LLVMModuleSet::getLLVMGlobalFunctions(</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global)</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160;{</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="comment">// This function is used to extract constructor and destructor functions</span></div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="comment">// sorted by their priority from @llvm.global_ctors or @llvm.global_dtors.</span></div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="comment">// For example, given following @llvm.global_ctors, the returning sorted</span></div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="comment">// function list should be [ctor3, ctor1, ctor2].</span></div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="comment">// ; Each struct in the array is {priority, function, associated data}</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <span class="comment">//</span></div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="comment">// @llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }]</span></div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <span class="comment">// [{ i32, void ()*, i8* } { i32 1234, void ()* @ctor1.cpp, i8* null },</span></div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="comment">// { i32, void ()*, i8* } { i32 2345, void ()* @ctor2.cpp, i8* null },</span></div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="comment">// { i32, void ()*, i8* } { i32 345, void ()* @ctor3.cpp, i8* null }]</span></div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="comment">// TODO: According to LLVM language reference, if the third field is</span></div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="comment">// non-null, and points to a global variable or function, the initializer</span></div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="comment">// function will only run if the associated data from the current module is</span></div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="comment">// not discarded. However the associated data is currently ignored.</span></div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160;</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160;</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; <span class="comment">// This class is used for the priority queue that sorts the functions by</span></div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="comment">// their priority. Each object of this class stands for an item in the</span></div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="comment">// function array.</span></div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <span class="keyword">class </span>LLVMGlobalFunction</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; {</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> priority;</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *func;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; LLVMGlobalFunction() {};</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; LLVMGlobalFunction(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> _priority, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *_func)</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; : priority(_priority), func(_func) {};</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keywordtype">bool</span> operator&gt;(<span class="keyword">const</span> LLVMGlobalFunction &amp;other)<span class="keyword"> const</span></div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="keywordflow">if</span> (priority != other.priority)</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; {</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keywordflow">return</span> priority &gt; other.priority;</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; }</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; {</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <span class="keywordflow">return</span> func &gt; other.func;</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; }</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; }</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; };</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; std::priority_queue&lt;LLVMGlobalFunction, std::vector&lt;LLVMGlobalFunction&gt;,</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; greater&lt;LLVMGlobalFunction&gt;&gt;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; queue;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; std::vector&lt;const Function *&gt; result;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160;</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="comment">// The @llvm.global_ctors/dtors global variable is an array of struct. Each</span></div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="comment">// struct has three fields: {i32 priority, void ()* @ctor/dtor, i8* @data}.</span></div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="comment">// First get the array here.</span></div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a> *globalFuncArray =</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; SVFUtil::dyn_cast&lt;ConstantArray&gt;(global-&gt;getInitializer()))</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; {</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <span class="comment">// Get each struct in the array.</span></div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; globalFuncArray-&gt;getNumOperands(); ++i)</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; {</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="keywordflow">if</span> (</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a> *globalFuncItem =</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; SVFUtil::dyn_cast&lt;ConstantStruct&gt;(</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; globalFuncArray-&gt;getOperand(i)))</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; {</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="comment">// Extract priority and function from the struct</span></div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a> *priority = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>&gt;(</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; globalFuncItem-&gt;getOperand(0));</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *func = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>&gt;(</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; globalFuncItem-&gt;getOperand(1));</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="keywordflow">if</span> (priority &amp;&amp; func)</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; {</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; queue.push(LLVMGlobalFunction(priority</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; -&gt;getZExtValue(),</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; func));</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; }</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; }</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; }</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; }</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160;</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="comment">// Generate a sorted vector of functions from the priority queue.</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keywordflow">while</span> (!queue.empty())</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; {</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; result.push_back(queue.top().func);</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; queue.pop();</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; }</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160;}</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160;</div><div class="line"><a name="l00352"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a8af6b911b728713f66f7c809d5c0fbf1"> 352</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::addSVFMain()</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160;{</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; std::vector&lt;const Function *&gt; ctor_funcs;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; std::vector&lt;const Function *&gt; dtor_funcs;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> * orgMain = 0;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>* mainMod = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160;</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &amp;mod : modules)</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; {</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="comment">// Collect ctor and dtor functions</span></div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="keywordflow">for</span> (Module::global_iterator it = mod.global_begin(),</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; eit = mod.global_end();</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; it != eit; ++it)</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; {</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global = &amp;*it;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160;</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="keywordflow">if</span> (global-&gt;getName().equals(<a class="code" href="LLVMModule_8cpp.html#aa18802f2f60ef8030c66a42f20f285af">SVF_GLOBAL_CTORS</a>) &amp;&amp;</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; global-&gt;hasInitializer())</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; {</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; ctor_funcs = getLLVMGlobalFunctions(global);</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; }</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (global-&gt;getName().equals(<a class="code" href="LLVMModule_8cpp.html#a9fd6e28e6ed93f65a20a348ab0646320">SVF_GLOBAL_DTORS</a>) &amp;&amp;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; global-&gt;hasInitializer())</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; {</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; dtor_funcs = getLLVMGlobalFunctions(global);</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; }</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; }</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160;</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; <span class="comment">// Find main function</span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> &amp;func : mod)</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; {</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="keywordflow">if</span> (func.getName().equals(<a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a>))</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a> <span class="stringliteral">&quot; already defined&quot;</span>);</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keywordflow">if</span>(func.getName().equals(<span class="stringliteral">&quot;main&quot;</span>))</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; {</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; orgMain = &amp;func;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; mainMod = &amp;mod;</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; }</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; }</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; }</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160;</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="comment">// Only create svf.main when the original main function is found, and also</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="comment">// there are global contructor or destructor functions.</span></div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="keywordflow">if</span> (orgMain &amp;&amp; getModuleNum() &gt; 0 &amp;&amp;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; (ctor_funcs.size() &gt; 0 || dtor_funcs.size() &gt; 0))</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; {</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; assert(mainMod &amp;&amp; <span class="stringliteral">&quot;Module with main function not found.&quot;</span>);</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &amp; <a class="code" href="PEGGrammar_8txt.html#abd600039647a1e73c88e7161fa6eb989">M</a> = *mainMod;</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="comment">// char **</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> * i8ptr2 = PointerType::getInt8PtrTy(M.getContext())-&gt;getPointerTo();</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> * i32 = IntegerType::getInt32Ty(M.getContext());</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; <span class="comment">// define void @svf.main(i32, i8**, i8**)</span></div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160;<span class="preprocessor">#if (LLVM_VERSION_MAJOR &gt;= 9)</span></div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; FunctionCallee svfmainFn = M.getOrInsertFunction(</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a>,</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; Type::getVoidTy(M.getContext()),</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; i32,i8ptr2,i8ptr2</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; );</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *svfmain = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>&gt;(svfmainFn.getCallee());</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *svfmain = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>&gt;(M.getOrInsertFunction(</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a>,</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; Type::getVoidTy(M.getContext()),</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; i32,i8ptr2,i8ptr2</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; ));</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; svfmain-&gt;setCallingConv(llvm::CallingConv::C);</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* block = BasicBlock::Create(M.getContext(), <span class="stringliteral">&quot;entry&quot;</span>, svfmain);</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <a class="code" href="namespaceSVF.html#a94824519e439aeef1568d415b6f7331c">IRBuilder</a> Builder(block);</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="comment">// emit &quot;call void @ctor()&quot;. ctor_funcs is sorted so the functions are</span></div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="comment">// emitted in the order of priority</span></div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="keywordflow">for</span>(<span class="keyword">auto</span> &amp; ctor: ctor_funcs)</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; {</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keyword">auto</span> target = M.getOrInsertFunction(</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; ctor-&gt;getName(),</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; Type::getVoidTy(M.getContext())</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; );</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; Builder.CreateCall(target);</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; }</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <span class="comment">// main() should be called after all ctor functions and before dtor</span></div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="comment">// functions.</span></div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; Function::arg_iterator arg_it = svfmain-&gt;arg_begin();</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> * args[] = {arg_it, arg_it + 1, arg_it + 2 };</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keywordtype">size_t</span> cnt = orgMain-&gt;arg_size();</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; assert(cnt &lt;= 3 &amp;&amp; <span class="stringliteral">&quot;Too many arguments for main()&quot;</span>);</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; Builder.CreateCall(orgMain, llvm::ArrayRef&lt;Value*&gt;(args,args + cnt));</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="comment">// emit &quot;call void @dtor()&quot;. dtor_funcs is sorted so the functions are</span></div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <span class="comment">// emitted in the order of priority</span></div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> &amp;dtor : dtor_funcs)</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; {</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="keyword">auto</span> target = M.getOrInsertFunction(</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; dtor-&gt;getName(),</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; Type::getVoidTy(M.getContext())</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; );</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; Builder.CreateCall(target);</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; }</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="comment">// return;</span></div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; Builder.CreateRetVoid();</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; }</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160;}</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160;</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160;</div><div class="line"><a name="l00454"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ac7c646a78c989807c52263fc35fb3628"> 454</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::buildFunToFunMap()</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160;{</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;</a> funDecls, funDefs;</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <a class="code" href="namespaceSVF.html#a4f21e91ff8eaea5207afe5c60dbd78d7">OrderedSet&lt;string&gt;</a> declNames, defNames, intersectNames;</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;string, Function*&gt;</a> NameToFunDefMapTy;</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;string, Set&lt;Function*&gt;</a>&gt; NameToFunDeclsMapTy;</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160;</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="keywordflow">for</span> (SVFModule::LLVMFunctionSetType::iterator it = svfModule-&gt;llvmFunBegin(),</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; eit = svfModule-&gt;llvmFunEnd(); it != eit; ++it)</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; {</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *fun = *it;</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="keywordflow">if</span> (fun-&gt;isDeclaration())</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; {</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; funDecls.insert(fun);</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; declNames.insert(fun-&gt;getName().str());</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; }</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; {</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; funDefs.insert(fun);</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; defNames.insert(fun-&gt;getName().str());</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; }</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; }</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; <span class="comment">// Find the intersectNames</span></div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <a class="code" href="namespaceSVF.html#a4f21e91ff8eaea5207afe5c60dbd78d7">OrderedSet&lt;string&gt;::iterator</a> declIter, defIter;</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; declIter = declNames.begin();</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; defIter = defNames.begin();</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="keywordflow">while</span> (declIter != declNames.end() &amp;&amp; defIter != defNames.end())</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; {</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; <span class="keywordflow">if</span> (*declIter &lt; *defIter)</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; {</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; declIter++;</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; }</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; {</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <span class="keywordflow">if</span> (!(*defIter &lt; *declIter))</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; {</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; intersectNames.insert(*declIter);</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; declIter++;</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; }</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; defIter++;</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; }</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; }</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160;</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; NameToFunDefMapTy nameToFunDefMap;</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;::iterator</a> it = funDefs.begin(),</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; eit = funDefs.end(); it != eit; ++it)</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; {</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *fdef = *it;</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; <span class="keywordtype">string</span> funName = fdef-&gt;getName().str();</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; nameToFunDefMap[funName] = fdef;</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; }</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160;</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; NameToFunDeclsMapTy nameToFunDeclsMap;</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;::iterator</a> it = funDecls.begin(),</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; eit = funDecls.end(); it != eit; ++it)</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; {</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *fdecl = *it;</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; <span class="keywordtype">string</span> funName = fdecl-&gt;getName().str();</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; NameToFunDeclsMapTy::iterator mit = nameToFunDeclsMap.find(funName);</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="keywordflow">if</span> (mit == nameToFunDeclsMap.end())</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; {</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;</a> decls;</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; decls.insert(fdecl);</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; nameToFunDeclsMap[funName] = decls;</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; }</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; {</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;</a> &amp;decls = mit-&gt;second;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; decls.insert(fdecl);</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; }</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160;</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;::iterator</a> it = funDecls.begin(),</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; eit = funDecls.end(); it != eit; ++it)</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; {</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *fdecl = *it;</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="keywordtype">string</span> funName = fdecl-&gt;getName().str();</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; NameToFunDefMapTy::iterator mit = nameToFunDefMap.find(funName);</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <span class="keywordflow">if</span> (mit == nameToFunDefMap.end())</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; FunDeclToDefMap[svfModule-&gt;getSVFFunction(fdecl)] = svfModule-&gt;getSVFFunction(mit-&gt;second);</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; }</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160;</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;::iterator</a> it = funDefs.begin(),</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; eit = funDefs.end(); it != eit; ++it)</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; {</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *fdef = *it;</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keywordtype">string</span> funName = fdef-&gt;getName().str();</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; NameToFunDeclsMapTy::iterator mit = nameToFunDeclsMap.find(funName);</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="keywordflow">if</span> (mit == nameToFunDeclsMap.end())</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; std::vector&lt;const SVFFunction*&gt;&amp; decls = FunDefToDeclsMap[svfModule-&gt;getSVFFunction(fdef)];</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;::iterator</a> sit = mit-&gt;second.begin(),</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; seit = mit-&gt;second.end(); sit != seit; ++sit)</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; {</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; decls.push_back(svfModule-&gt;getSVFFunction(*sit));</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; }</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; }</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160;}</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160;</div><div class="line"><a name="l00566"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#aaab03cb6ff665bc008c67b866ba81e47"> 566</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::buildGlobalDefToRepMap()</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160;{</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;string, Set&lt;GlobalVariable*&gt;</a>&gt; NameToGlobalsMapTy;</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; NameToGlobalsMapTy nameToGlobalsMap;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SVFModule.html#a4cf1ca2e9f045a0520b0a8a6cd5993f2">SVFModule::global_iterator</a> it = svfModule-&gt;global_begin(),</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; eit = svfModule-&gt;global_end(); it != eit; ++it)</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; {</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global = *it;</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; <span class="keywordflow">if</span> (global-&gt;hasPrivateLinkage())</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <span class="keywordtype">string</span> <a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a> = global-&gt;getName().str();</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; NameToGlobalsMapTy::iterator mit = nameToGlobalsMap.find(name);</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <span class="keywordflow">if</span> (mit == nameToGlobalsMap.end())</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; {</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;GlobalVariable*&gt;</a> globals;</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; globals.insert(global);</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; nameToGlobalsMap[<a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a>] = globals;</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; }</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; {</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;GlobalVariable*&gt;</a> &amp;globals = mit-&gt;second;</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; globals.insert(global);</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; }</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; }</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160;</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="keywordflow">for</span> (NameToGlobalsMapTy::iterator it = nameToGlobalsMap.begin(),</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; eit = nameToGlobalsMap.end(); it != eit; ++it)</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; {</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;GlobalVariable*&gt;</a> &amp;globals = it-&gt;second;</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *rep = *(globals.begin());</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;GlobalVariable*&gt;::iterator</a> repit = globals.begin();</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <span class="keywordflow">while</span> (repit != globals.end())</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; {</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *cur = *repit;</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="keywordflow">if</span> (cur-&gt;hasInitializer())</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; {</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; rep = cur;</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; }</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; repit++;</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; }</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;GlobalVariable*&gt;::iterator</a> sit = globals.begin(),</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; seit = globals.end(); sit != seit; ++sit)</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; {</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *cur = *sit;</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; GlobalDefToRepMap[cur] = rep;</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; }</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; }</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160;}</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160;</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160;<span class="comment">// Dump modules to files</span></div><div class="line"><a name="l00617"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ad5ef9421d501b2747d4fb31d4189b53f"> 617</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::dumpModulesToFile(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> suffix)</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160;{</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>&amp; mod : modules)</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; {</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> moduleName = mod.getName().str();</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> OutputFilename;</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; std::size_t pos = moduleName.rfind(<span class="charliteral">&#39;.&#39;</span>);</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; <span class="keywordflow">if</span> (pos != std::string::npos)</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; OutputFilename = moduleName.substr(0, pos) + suffix;</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; OutputFilename = moduleName + suffix;</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160;</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; std::error_code EC;</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <a class="code" href="namespaceSVF.html#a1c7c7ac12791c0ae386283c0a4f127ba">raw_fd_ostream</a> OS(OutputFilename.c_str(), EC, llvm::sys::fs::OF_None);</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160;</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160;<span class="preprocessor">#if (LLVM_VERSION_MAJOR &gt;= 7)</span></div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; WriteBitcodeToFile(mod, OS);</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; WriteBitcodeToFile(&amp;mod, OS);</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160;</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; OS.flush();</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; }</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160;}</div><div class="ttc" id="namespaceSVF_html_a5ae718cba37d8e34d2946530dc098c8e"><div class="ttname"><a href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">SVF::ConstantArray</a></div><div class="ttdeci">llvm::ConstantArray ConstantArray</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00063">BasicTypes.h:63</a></div></div>
70
- <div class="ttc" id="namespaceSVF_html_a86863d104a3930b3a806935d92ddbf30"><div class="ttname"><a href="namespaceSVF.html#a86863d104a3930b3a806935d92ddbf30">SVF::SMDiagnostic</a></div><div class="ttdeci">llvm::SMDiagnostic SMDiagnostic</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00042">BasicTypes.h:42</a></div></div>
71
- <div class="ttc" id="namespaceSVF_html_aa7a770b5dd5cd0e37d06a1088f252906"><div class="ttname"><a href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">SVF::Module</a></div><div class="ttdeci">llvm::Module Module</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00077">BasicTypes.h:77</a></div></div>
69
+ <a href="LLVMModule_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">//===----- SVFModule.cpp Base class of pointer analyses ---------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// Copyright (C) &lt;2013-2017&gt; &lt;Yulei Sui&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">// along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment"> * SVFModule.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment"> * Created on: Aug 4, 2017</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment"> * Author: Xiaokang Fan</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Options_8h.html">Util/Options.h</a>&quot;</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &lt;queue&gt;</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFModule_8h.html">Util/SVFModule.h</a>&quot;</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>&quot;</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVF-FE_2BasicTypes_8h.html">SVF-FE/BasicTypes.h</a>&quot;</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="LLVMUtil_8h.html">SVF-FE/LLVMUtil.h</a>&quot;</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="BreakConstantExpr_8h.html">SVF-FE/BreakConstantExpr.h</a>&quot;</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacestd.html">std</a>;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment"> svf.main() is used to model the real entry point of a C++ program, which</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment"> initializes all global C++ objects and then call main().</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<span class="comment"> LLVM may generate two global arrays @llvm.global_ctors and @llvm.global_dtors</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<span class="comment"> that contain constructor and destructor functions for global variables. They</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<span class="comment"> are not called explicitly, so we have to add them in the svf.main function.</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="comment"> The order to call these constructor and desctructor functions are also</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;<span class="comment"> specified in the global arrays.</span></div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="comment"> Related part in LLVM language reference:</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="comment"> https://llvm.org/docs/LangRef.html#the-llvm-global-ctors-global-variable</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="comment"></span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<span class="comment"> For example, given a &quot;int main(int argc, char * argv[])&quot;, the corresponding</span></div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<span class="comment"> svf.main will be generated as follows:</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="comment"> define void @svf.main(i32, i8**, i8**) {</span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="comment"> entry:</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="comment"> call void @ctor1()</span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="comment"> call void @ctor2()</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;<span class="comment"> %3 = call i32 @main(i32 %0, i8** %1)</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;<span class="comment"> call void @dtor1()</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160;<span class="comment"> call void @dtor2()</span></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="comment"> ret void</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;<span class="comment"> }</span></div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;</div><div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b"> 67</a></span>&#160;<span class="preprocessor">#define SVF_MAIN_FUNC_NAME &quot;svf.main&quot;</span></div><div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="LLVMModule_8cpp.html#aa18802f2f60ef8030c66a42f20f285af"> 68</a></span>&#160;<span class="preprocessor">#define SVF_GLOBAL_CTORS &quot;llvm.global_ctors&quot;</span></div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="LLVMModule_8cpp.html#a9fd6e28e6ed93f65a20a348ab0646320"> 69</a></span>&#160;<span class="preprocessor">#define SVF_GLOBAL_DTORS &quot;llvm.global_dtors&quot;</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160;<a class="code" href="classSVF_1_1LLVMModuleSet.html">LLVMModuleSet</a> *LLVMModuleSet::llvmModuleSet = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;<a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> SVFModule::pagReadFromTxt = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160;</div><div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ae919327019b5014f64b754dbdeb07f75"> 74</a></span>&#160;<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* LLVMModuleSet::buildSVFModule(<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &amp;mod)</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160;{</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; svfModule = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>(mod.getModuleIdentifier());</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; modules.emplace_back(mod);</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; build();</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="keywordflow">return</span> svfModule;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160;}</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160;</div><div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a1f8e769251c89433311eeb6f98d115e9"> 84</a></span>&#160;<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* LLVMModuleSet::buildSVFModule(<span class="keyword">const</span> std::vector&lt;std::string&gt; &amp;moduleNameVec)</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;{</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; assert(llvmModuleSet &amp;&amp; <span class="stringliteral">&quot;LLVM Module set needs to be created!&quot;</span>);</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; loadModules(moduleNameVec);</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keywordflow">if</span>(!moduleNameVec.empty())</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; svfModule = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>(*moduleNameVec.begin());</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; svfModule = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>();</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; build();</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="keywordflow">return</span> svfModule;</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;}</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;</div><div class="line"><a name="l00100"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a2fdc1bd61b8f6cdf6c07a5059b641b04"> 100</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::preProcessBCs(std::vector&lt;std::string&gt; &amp;moduleNameVec)</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;{</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; loadModules(moduleNameVec);</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; prePassSchedule();</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> preProcessSuffix = <span class="stringliteral">&quot;.pre.bc&quot;</span>;</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="comment">// Get the existing module names, remove old extention, add preProcessSuffix</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i &lt; moduleNameVec.size(); i++)</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; {</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> lastIndex = moduleNameVec[i].find_last_of(<span class="stringliteral">&quot;.&quot;</span>);</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> rawName = moduleNameVec[i].substr(0, lastIndex);</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; moduleNameVec[i] = (rawName + preProcessSuffix);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; }</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; dumpModulesToFile(preProcessSuffix);</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; preProcessed = <span class="keyword">true</span>;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; releaseLLVMModuleSet();</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;}</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;</div><div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#af8edfe08027020f14b81b44362c6018e"> 122</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::build()</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;{</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; initialize();</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; buildFunToFunMap();</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; buildGlobalDefToRepMap();</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFModule.html#acfd1ffb4696136de493843786c799e6b">SVFModule::FunctionSetType</a>&amp; functions = svfModule-&gt;getFunctionSet();</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordflow">for</span> (SVFModule::FunctionSetType::const_iterator func_iter = functions.begin(); func_iter != functions.end(); func_iter++)</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; {</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* func = *func_iter;</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a2c61d741afbcfa853b505cd391f29f9b">isUncalledFunction</a> = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a2c61d741afbcfa853b505cd391f29f9b">LLVMUtil::isUncalledFunction</a>(func-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>());</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> isNotRetFunction = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a651b6a1cf3665277d2241220bb145aed">LLVMUtil::functionDoesNotRet</a>(func-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>());</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svffun = <span class="keyword">const_cast&lt;</span><a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>*<span class="keyword">&gt;</span>(func);</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; svffun-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#a3ff1ce3a7e4a9f4037a8bb74ddb5fabf">setIsNotRet</a>(isNotRetFunction);</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; svffun-&gt;setIsUncalledFunction(isUncalledFunction);</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">SVFUtil::isExtCall</a>(func) == <span class="keyword">false</span>)</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; {</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; std::vector&lt;const BasicBlock*&gt; reachableBBs;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <a class="code" href="namespaceSVF_1_1LLVMUtil.html#acf537fc9f72ca46c3b04bea3f2c2fb79">LLVMUtil::getFunReachableBBs</a>(func, reachableBBs);</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a> *exitBB = <span class="keyword">const_cast&lt;</span><a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>*<span class="keyword">&gt;</span>(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a3ef84be7e91335c7b35c395d247f85ae">LLVMUtil::getFunExitBB</a>(func));</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; svffun-&gt;setReachableBBs(reachableBBs);</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; svffun-&gt;setExitBB(exitBB);</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; }</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; }</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">if</span>(preProcessed==<span class="keyword">false</span>)</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; prePassSchedule();</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;}</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a8b5f24c873db1f6a0614d1dac48bb4bb"> 152</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::prePassSchedule()</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;{</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; std::unique_ptr&lt;BreakConstantGEPs&gt; p1 = std::make_unique&lt;BreakConstantGEPs&gt;();</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i &lt; LLVMModuleSet::getLLVMModuleSet()-&gt;getModuleNum(); ++i)</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; {</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> *module = LLVMModuleSet::getLLVMModuleSet()-&gt;getModule(i);</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; p1-&gt;runOnModule(*module);</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; }</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160;</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; std::unique_ptr&lt;UnifyFunctionExitNodes&gt; p2 =</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; std::make_unique&lt;UnifyFunctionExitNodes&gt;();</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i &lt; LLVMModuleSet::getLLVMModuleSet()-&gt;getModuleNum(); ++i)</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; {</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> *module = LLVMModuleSet::getLLVMModuleSet()-&gt;getModule(i);</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a> = module-&gt;begin(), E = module-&gt;end(); <a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a> != E; ++<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>)</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; {</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> &amp;fun = *<a class="code" href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a>;</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keywordflow">if</span> (fun.isDeclaration())</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; p2-&gt;runOnFunction(fun);</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; }</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; }</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;}</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;</div><div class="line"><a name="l00179"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a298966366b02d0a34f409c2c77da3789"> 179</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::loadModules(<span class="keyword">const</span> std::vector&lt;std::string&gt; &amp;moduleNameVec)</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160;{</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="comment">// We read SVFIR from LLVM IR</span></div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keywordflow">if</span>(Options::Graphtxt.getValue().empty())</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; {</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keywordflow">if</span>(moduleNameVec.empty())</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; {</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;no LLVM bc file is found!\n&quot;</span>;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; exit(0);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; }</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="comment">//assert(!moduleNameVec.empty() &amp;&amp; &quot;no LLVM bc file is found!&quot;);</span></div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; }</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="comment">// We read SVFIR from a user-defined txt instead of parsing SVFIR from LLVM IR</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; SVFModule::setPagFromTXT(Options::Graphtxt.getValue());</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <span class="comment">//</span></div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="comment">// To avoid the following type bugs (t1 != t3) when parsing multiple modules,</span></div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="comment">// We should use only one LLVMContext object for multiple modules in the same thread.</span></div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="comment">// No such problem if only one module is processed by SVF.</span></div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="comment">// LLVMContext ctxa,ctxb;</span></div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="comment">// IntegerType * t1 = IntegerType::get(ctxa,32);</span></div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="comment">// IntegerType * t2 = IntegerType::get(ctxa,32);</span></div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="comment">// assert(t1 == t2);</span></div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="comment">// IntegerType * t3 = IntegerType::get(ctxb,32);</span></div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="comment">// IntegerType * t4 = IntegerType::get(ctxb,32);</span></div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="comment">// assert(t3 == t4);</span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="comment">// assert(t1 != t3);</span></div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="comment">//</span></div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; cxts = std::make_unique&lt;LLVMContext&gt;();</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160;</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>&amp; moduleName : moduleNameVec)</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; {</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <a class="code" href="namespaceSVF.html#a86863d104a3930b3a806935d92ddbf30">SMDiagnostic</a> Err;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; std::unique_ptr&lt;Module&gt; mod = parseIRFile(moduleName, Err, *cxts);</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="keywordflow">if</span> (mod == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; {</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() &lt;&lt; <span class="stringliteral">&quot;load module: &quot;</span> &lt;&lt; moduleName &lt;&lt; <span class="stringliteral">&quot;failed!!\n\n&quot;</span>;</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; Err.print(<span class="stringliteral">&quot;SVFModuleLoader&quot;</span>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">llvm::errs</a>());</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; abort();</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; }</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; modules.emplace_back(*mod);</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; owned_modules.emplace_back(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a72502f7f536418621485e90ab98c2016">std::move</a>(mod));</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; }</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160;}</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;</div><div class="line"><a name="l00228"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a9782bf6b7b015fd8fb48f75eb4508d22"> 228</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::initialize()</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160;{</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">if</span> (Options::SVFMain)</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; addSVFMain();</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>&amp; mod : modules)</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; {</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="keywordflow">for</span> (Module::iterator it = mod.begin(), eit = mod.end();</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; it != eit; ++it)</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; {</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *func = &amp;*it;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfFunc = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>(func);</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; svfModule-&gt;addFunctionSet(svfFunc);</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; }</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="keywordflow">for</span> (Module::global_iterator it = mod.global_begin(),</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; eit = mod.global_end(); it != eit; ++it)</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; {</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global = &amp;*it;</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; svfModule-&gt;addGlobalSet(global);</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160;</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">for</span> (Module::alias_iterator it = mod.alias_begin(),</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; eit = mod.alias_end(); it != eit; ++it)</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; {</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <a class="code" href="namespaceSVF.html#a0fd33072b099f61eaa642e94ed0c03fc">GlobalAlias</a> *alias = &amp;*it;</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; svfModule-&gt;addAliasSet(alias);</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; }</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; }</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160;}</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160;</div><div class="line"><a name="l00262"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a0b46a2a5ff2165d17993a071d9cc82c1"> 262</a></span>&#160;std::vector&lt;const Function *&gt; LLVMModuleSet::getLLVMGlobalFunctions(</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global)</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160;{</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="comment">// This function is used to extract constructor and destructor functions</span></div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="comment">// sorted by their priority from @llvm.global_ctors or @llvm.global_dtors.</span></div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="comment">// For example, given following @llvm.global_ctors, the returning sorted</span></div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="comment">// function list should be [ctor3, ctor1, ctor2].</span></div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="comment">// ; Each struct in the array is {priority, function, associated data}</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <span class="comment">//</span></div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="comment">// @llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }]</span></div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <span class="comment">// [{ i32, void ()*, i8* } { i32 1234, void ()* @ctor1.cpp, i8* null },</span></div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="comment">// { i32, void ()*, i8* } { i32 2345, void ()* @ctor2.cpp, i8* null },</span></div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="comment">// { i32, void ()*, i8* } { i32 345, void ()* @ctor3.cpp, i8* null }]</span></div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="comment">// TODO: According to LLVM language reference, if the third field is</span></div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="comment">// non-null, and points to a global variable or function, the initializer</span></div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="comment">// function will only run if the associated data from the current module is</span></div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="comment">// not discarded. However the associated data is currently ignored.</span></div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160;</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160;</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; <span class="comment">// This class is used for the priority queue that sorts the functions by</span></div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="comment">// their priority. Each object of this class stands for an item in the</span></div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="comment">// function array.</span></div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <span class="keyword">class </span>LLVMGlobalFunction</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; {</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keyword">public</span>:</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> priority;</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *func;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; LLVMGlobalFunction() {};</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; LLVMGlobalFunction(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> _priority, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *_func)</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; : priority(_priority), func(_func) {};</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keywordtype">bool</span> operator&gt;(<span class="keyword">const</span> LLVMGlobalFunction &amp;other)<span class="keyword"> const</span></div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="keywordflow">if</span> (priority != other.priority)</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; {</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keywordflow">return</span> priority &gt; other.priority;</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; }</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; {</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <span class="keywordflow">return</span> func &gt; other.func;</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; }</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; }</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; };</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; std::priority_queue&lt;LLVMGlobalFunction, std::vector&lt;LLVMGlobalFunction&gt;,</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; greater&lt;LLVMGlobalFunction&gt;&gt;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; queue;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; std::vector&lt;const Function *&gt; result;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160;</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="comment">// The @llvm.global_ctors/dtors global variable is an array of struct. Each</span></div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="comment">// struct has three fields: {i32 priority, void ()* @ctor/dtor, i8* @data}.</span></div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="comment">// First get the array here.</span></div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a> *globalFuncArray =</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; SVFUtil::dyn_cast&lt;ConstantArray&gt;(global-&gt;getInitializer()))</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; {</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <span class="comment">// Get each struct in the array.</span></div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; globalFuncArray-&gt;getNumOperands(); ++i)</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; {</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="keywordflow">if</span> (</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a> *globalFuncItem =</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; SVFUtil::dyn_cast&lt;ConstantStruct&gt;(</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; globalFuncArray-&gt;getOperand(i)))</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; {</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="comment">// Extract priority and function from the struct</span></div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a> *priority = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>&gt;(</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; globalFuncItem-&gt;getOperand(0));</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *func = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>&gt;(</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; globalFuncItem-&gt;getOperand(1));</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="keywordflow">if</span> (priority &amp;&amp; func)</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; {</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; queue.push(LLVMGlobalFunction(priority</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; -&gt;getZExtValue(),</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; func));</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; }</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; }</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; }</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; }</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160;</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="comment">// Generate a sorted vector of functions from the priority queue.</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keywordflow">while</span> (!queue.empty())</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; {</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; result.push_back(queue.top().func);</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; queue.pop();</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; }</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160;}</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160;</div><div class="line"><a name="l00352"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a8af6b911b728713f66f7c809d5c0fbf1"> 352</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::addSVFMain()</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160;{</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; std::vector&lt;const Function *&gt; ctor_funcs;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; std::vector&lt;const Function *&gt; dtor_funcs;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> * orgMain = 0;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>* mainMod = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160;</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &amp;mod : modules)</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; {</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="comment">// Collect ctor and dtor functions</span></div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="keywordflow">for</span> (Module::global_iterator it = mod.global_begin(),</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; eit = mod.global_end();</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; it != eit; ++it)</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; {</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global = &amp;*it;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160;</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="keywordflow">if</span> (global-&gt;getName().equals(<a class="code" href="LLVMModule_8cpp.html#aa18802f2f60ef8030c66a42f20f285af">SVF_GLOBAL_CTORS</a>) &amp;&amp;</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; global-&gt;hasInitializer())</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; {</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; ctor_funcs = getLLVMGlobalFunctions(global);</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; }</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (global-&gt;getName().equals(<a class="code" href="LLVMModule_8cpp.html#a9fd6e28e6ed93f65a20a348ab0646320">SVF_GLOBAL_DTORS</a>) &amp;&amp;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; global-&gt;hasInitializer())</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; {</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; dtor_funcs = getLLVMGlobalFunctions(global);</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; }</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; }</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160;</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; <span class="comment">// Find main function</span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> &amp;func : mod)</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; {</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="keywordflow">if</span> (func.getName().equals(<a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a>))</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a> <span class="stringliteral">&quot; already defined&quot;</span>);</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keywordflow">if</span>(func.getName().equals(<span class="stringliteral">&quot;main&quot;</span>))</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; {</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; orgMain = &amp;func;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; mainMod = &amp;mod;</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; }</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; }</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; }</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160;</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="comment">// Only create svf.main when the original main function is found, and also</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="comment">// there are global contructor or destructor functions.</span></div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="keywordflow">if</span> (orgMain &amp;&amp; getModuleNum() &gt; 0 &amp;&amp;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; (ctor_funcs.size() &gt; 0 || dtor_funcs.size() &gt; 0))</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; {</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; assert(mainMod &amp;&amp; <span class="stringliteral">&quot;Module with main function not found.&quot;</span>);</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &amp; <a class="code" href="PEGGrammar_8txt.html#abd600039647a1e73c88e7161fa6eb989">M</a> = *mainMod;</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="comment">// char **</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> * i8ptr2 = PointerType::getInt8PtrTy(M.getContext())-&gt;getPointerTo();</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> * i32 = IntegerType::getInt32Ty(M.getContext());</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; <span class="comment">// define void @svf.main(i32, i8**, i8**)</span></div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160;<span class="preprocessor">#if (LLVM_VERSION_MAJOR &gt;= 9)</span></div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; FunctionCallee svfmainFn = M.getOrInsertFunction(</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a>,</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; Type::getVoidTy(M.getContext()),</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; i32,i8ptr2,i8ptr2</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; );</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *svfmain = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>&gt;(svfmainFn.getCallee());</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *svfmain = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>&gt;(M.getOrInsertFunction(</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a>,</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; Type::getVoidTy(M.getContext()),</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; i32,i8ptr2,i8ptr2</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; ));</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; svfmain-&gt;setCallingConv(llvm::CallingConv::C);</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* block = BasicBlock::Create(M.getContext(), <span class="stringliteral">&quot;entry&quot;</span>, svfmain);</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <a class="code" href="namespaceSVF.html#a94824519e439aeef1568d415b6f7331c">IRBuilder</a> Builder(block);</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="comment">// emit &quot;call void @ctor()&quot;. ctor_funcs is sorted so the functions are</span></div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="comment">// emitted in the order of priority</span></div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="keywordflow">for</span>(<span class="keyword">auto</span> &amp; ctor: ctor_funcs)</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; {</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keyword">auto</span> target = M.getOrInsertFunction(</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; ctor-&gt;getName(),</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; Type::getVoidTy(M.getContext())</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; );</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; Builder.CreateCall(target);</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; }</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <span class="comment">// main() should be called after all ctor functions and before dtor</span></div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="comment">// functions.</span></div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; Function::arg_iterator arg_it = svfmain-&gt;arg_begin();</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> * args[] = {arg_it, arg_it + 1, arg_it + 2 };</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keywordtype">size_t</span> cnt = orgMain-&gt;arg_size();</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; assert(cnt &lt;= 3 &amp;&amp; <span class="stringliteral">&quot;Too many arguments for main()&quot;</span>);</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; Builder.CreateCall(orgMain, llvm::ArrayRef&lt;Value*&gt;(args,args + cnt));</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="comment">// emit &quot;call void @dtor()&quot;. dtor_funcs is sorted so the functions are</span></div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <span class="comment">// emitted in the order of priority</span></div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> &amp;dtor : dtor_funcs)</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; {</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="keyword">auto</span> target = M.getOrInsertFunction(</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; dtor-&gt;getName(),</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; Type::getVoidTy(M.getContext())</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; );</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; Builder.CreateCall(target);</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; }</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="comment">// return;</span></div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; Builder.CreateRetVoid();</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; }</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160;}</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160;</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160;</div><div class="line"><a name="l00454"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ac7c646a78c989807c52263fc35fb3628"> 454</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::buildFunToFunMap()</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160;{</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;</a> funDecls, funDefs;</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <a class="code" href="namespaceSVF.html#a4f21e91ff8eaea5207afe5c60dbd78d7">OrderedSet&lt;string&gt;</a> declNames, defNames, intersectNames;</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;string, Function*&gt;</a> NameToFunDefMapTy;</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;string, Set&lt;Function*&gt;</a>&gt; NameToFunDeclsMapTy;</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160;</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="keywordflow">for</span> (SVFModule::LLVMFunctionSetType::iterator it = svfModule-&gt;llvmFunBegin(),</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; eit = svfModule-&gt;llvmFunEnd(); it != eit; ++it)</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; {</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *fun = *it;</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="keywordflow">if</span> (fun-&gt;isDeclaration())</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; {</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; funDecls.insert(fun);</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; declNames.insert(fun-&gt;getName().str());</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; }</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; {</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; funDefs.insert(fun);</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; defNames.insert(fun-&gt;getName().str());</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; }</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; }</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; <span class="comment">// Find the intersectNames</span></div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <a class="code" href="namespaceSVF.html#a4f21e91ff8eaea5207afe5c60dbd78d7">OrderedSet&lt;string&gt;::iterator</a> declIter, defIter;</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; declIter = declNames.begin();</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; defIter = defNames.begin();</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="keywordflow">while</span> (declIter != declNames.end() &amp;&amp; defIter != defNames.end())</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; {</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; <span class="keywordflow">if</span> (*declIter &lt; *defIter)</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; {</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; declIter++;</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; }</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; {</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <span class="keywordflow">if</span> (!(*defIter &lt; *declIter))</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; {</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; intersectNames.insert(*declIter);</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; declIter++;</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; }</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; defIter++;</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; }</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; }</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160;</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; NameToFunDefMapTy nameToFunDefMap;</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;::iterator</a> it = funDefs.begin(),</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; eit = funDefs.end(); it != eit; ++it)</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; {</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *fdef = *it;</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; <span class="keywordtype">string</span> funName = fdef-&gt;getName().str();</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; nameToFunDefMap[funName] = fdef;</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; }</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160;</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; NameToFunDeclsMapTy nameToFunDeclsMap;</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;::iterator</a> it = funDecls.begin(),</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; eit = funDecls.end(); it != eit; ++it)</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; {</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *fdecl = *it;</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; <span class="keywordtype">string</span> funName = fdecl-&gt;getName().str();</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; NameToFunDeclsMapTy::iterator mit = nameToFunDeclsMap.find(funName);</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="keywordflow">if</span> (mit == nameToFunDeclsMap.end())</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; {</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;</a> decls;</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; decls.insert(fdecl);</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; nameToFunDeclsMap[funName] = decls;</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; }</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; {</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;</a> &amp;decls = mit-&gt;second;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; decls.insert(fdecl);</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; }</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160;</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;::iterator</a> it = funDecls.begin(),</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; eit = funDecls.end(); it != eit; ++it)</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; {</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *fdecl = *it;</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="keywordtype">string</span> funName = fdecl-&gt;getName().str();</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; NameToFunDefMapTy::iterator mit = nameToFunDefMap.find(funName);</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <span class="keywordflow">if</span> (mit == nameToFunDefMap.end())</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; FunDeclToDefMap[svfModule-&gt;getSVFFunction(fdecl)] = svfModule-&gt;getSVFFunction(mit-&gt;second);</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; }</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160;</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;::iterator</a> it = funDefs.begin(),</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; eit = funDefs.end(); it != eit; ++it)</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; {</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *fdef = *it;</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keywordtype">string</span> funName = fdef-&gt;getName().str();</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; NameToFunDeclsMapTy::iterator mit = nameToFunDeclsMap.find(funName);</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="keywordflow">if</span> (mit == nameToFunDeclsMap.end())</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; std::vector&lt;const SVFFunction*&gt;&amp; decls = FunDefToDeclsMap[svfModule-&gt;getSVFFunction(fdef)];</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;Function*&gt;::iterator</a> sit = mit-&gt;second.begin(),</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; seit = mit-&gt;second.end(); sit != seit; ++sit)</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; {</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; decls.push_back(svfModule-&gt;getSVFFunction(*sit));</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; }</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; }</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160;}</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160;</div><div class="line"><a name="l00566"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#aaab03cb6ff665bc008c67b866ba81e47"> 566</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::buildGlobalDefToRepMap()</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160;{</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;string, Set&lt;GlobalVariable*&gt;</a>&gt; NameToGlobalsMapTy;</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; NameToGlobalsMapTy nameToGlobalsMap;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SVFModule.html#a4cf1ca2e9f045a0520b0a8a6cd5993f2">SVFModule::global_iterator</a> it = svfModule-&gt;global_begin(),</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; eit = svfModule-&gt;global_end(); it != eit; ++it)</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; {</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global = *it;</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; <span class="keywordflow">if</span> (global-&gt;hasPrivateLinkage())</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <span class="keywordtype">string</span> <a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a> = global-&gt;getName().str();</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; NameToGlobalsMapTy::iterator mit = nameToGlobalsMap.find(name);</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <span class="keywordflow">if</span> (mit == nameToGlobalsMap.end())</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; {</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;GlobalVariable*&gt;</a> globals;</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; globals.insert(global);</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; nameToGlobalsMap[<a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a>] = globals;</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; }</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; {</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;GlobalVariable*&gt;</a> &amp;globals = mit-&gt;second;</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; globals.insert(global);</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; }</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; }</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160;</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="keywordflow">for</span> (NameToGlobalsMapTy::iterator it = nameToGlobalsMap.begin(),</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; eit = nameToGlobalsMap.end(); it != eit; ++it)</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; {</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;GlobalVariable*&gt;</a> &amp;globals = it-&gt;second;</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *rep = *(globals.begin());</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;GlobalVariable*&gt;::iterator</a> repit = globals.begin();</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <span class="keywordflow">while</span> (repit != globals.end())</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; {</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *cur = *repit;</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="keywordflow">if</span> (cur-&gt;hasInitializer())</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; {</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; rep = cur;</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; }</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; repit++;</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; }</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;GlobalVariable*&gt;::iterator</a> sit = globals.begin(),</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; seit = globals.end(); sit != seit; ++sit)</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; {</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *cur = *sit;</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; GlobalDefToRepMap[cur] = rep;</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; }</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; }</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160;}</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160;</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160;<span class="comment">// Dump modules to files</span></div><div class="line"><a name="l00617"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ad5ef9421d501b2747d4fb31d4189b53f"> 617</a></span>&#160;<span class="keywordtype">void</span> LLVMModuleSet::dumpModulesToFile(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> suffix)</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160;{</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>&amp; mod : modules)</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; {</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> moduleName = mod.getName().str();</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> OutputFilename;</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; std::size_t pos = moduleName.rfind(<span class="charliteral">&#39;.&#39;</span>);</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; <span class="keywordflow">if</span> (pos != std::string::npos)</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; OutputFilename = moduleName.substr(0, pos) + suffix;</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; OutputFilename = moduleName + suffix;</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160;</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; std::error_code EC;</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <a class="code" href="namespaceSVF.html#a1c7c7ac12791c0ae386283c0a4f127ba">raw_fd_ostream</a> OS(OutputFilename.c_str(), EC, llvm::sys::fs::OF_None);</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160;</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160;<span class="preprocessor">#if (LLVM_VERSION_MAJOR &gt;= 7)</span></div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; WriteBitcodeToFile(mod, OS);</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; WriteBitcodeToFile(&amp;mod, OS);</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160;</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; OS.flush();</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; }</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160;}</div><div class="ttc" id="namespaceSVF_html_a5ae718cba37d8e34d2946530dc098c8e"><div class="ttname"><a href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">SVF::ConstantArray</a></div><div class="ttdeci">llvm::ConstantArray ConstantArray</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00064">BasicTypes.h:64</a></div></div>
70
+ <div class="ttc" id="namespaceSVF_html_a86863d104a3930b3a806935d92ddbf30"><div class="ttname"><a href="namespaceSVF.html#a86863d104a3930b3a806935d92ddbf30">SVF::SMDiagnostic</a></div><div class="ttdeci">llvm::SMDiagnostic SMDiagnostic</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00043">BasicTypes.h:43</a></div></div>
71
+ <div class="ttc" id="namespaceSVF_html_aa7a770b5dd5cd0e37d06a1088f252906"><div class="ttname"><a href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">SVF::Module</a></div><div class="ttdeci">llvm::Module Module</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00041">BasicTypes.h:41</a></div></div>
72
72
  <div class="ttc" id="namespaceSVF_html_a4f21e91ff8eaea5207afe5c60dbd78d7"><div class="ttname"><a href="namespaceSVF.html#a4f21e91ff8eaea5207afe5c60dbd78d7">SVF::OrderedSet</a></div><div class="ttdeci">std::set&lt; Key, Compare, Allocator &gt; OrderedSet</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00113">SVFBasicTypes.h:113</a></div></div>
73
73
  <div class="ttc" id="namespaceSVF_html_a23bf614858f168b6ad76e0233cec9965"><div class="ttname"><a href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">SVF::BasicBlock</a></div><div class="ttdeci">llvm::BasicBlock BasicBlock</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00071">BasicTypes.h:71</a></div></div>
74
74
  <div class="ttc" id="namespaceSVF_html_a1d008c0666c145622b81d427be64c52d"><div class="ttname"><a href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">SVF::Type</a></div><div class="ttdeci">llvm::Type Type</div><div class="ttdoc">LLVM Basic classes. </div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00065">BasicTypes.h:65</a></div></div>
75
75
  <div class="ttc" id="namespaceSVF_html_a09f5fa3bc44bf53612a085e3a611cc4e"><div class="ttname"><a href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">SVF::GlobalVariable</a></div><div class="ttdeci">llvm::GlobalVariable GlobalVariable</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00076">BasicTypes.h:76</a></div></div>
76
76
  <div class="ttc" id="LLVMModule_8cpp_html_a9fd6e28e6ed93f65a20a348ab0646320"><div class="ttname"><a href="LLVMModule_8cpp.html#a9fd6e28e6ed93f65a20a348ab0646320">SVF_GLOBAL_DTORS</a></div><div class="ttdeci">#define SVF_GLOBAL_DTORS</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00069">LLVMModule.cpp:69</a></div></div>
77
77
  <div class="ttc" id="namespaceSVF_1_1LLVMUtil_html_a3ef84be7e91335c7b35c395d247f85ae"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#a3ef84be7e91335c7b35c395d247f85ae">SVF::LLVMUtil::getFunExitBB</a></div><div class="ttdeci">const BasicBlock * getFunExitBB(const SVFFunction *svfFun)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8h_source.html#l00167">LLVMUtil.h:167</a></div></div>
78
- <div class="ttc" id="classSVF_1_1SVFFunction_html"><div class="ttname"><a href="classSVF_1_1SVFFunction.html">SVF::SVFFunction</a></div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00126">BasicTypes.h:126</a></div></div>
78
+ <div class="ttc" id="classSVF_1_1SVFFunction_html"><div class="ttname"><a href="classSVF_1_1SVFFunction.html">SVF::SVFFunction</a></div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00125">BasicTypes.h:125</a></div></div>
79
79
  <div class="ttc" id="SVFUtil_8h_html"><div class="ttname"><a href="SVFUtil_8h.html">SVFUtil.h</a></div></div>
80
80
  <div class="ttc" id="cJSON_8h_html_a25d22ecc7e656d2c59332072684e8766"><div class="ttname"><a href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a></div><div class="ttdeci">const char *const name</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00264">cJSON.h:264</a></div></div>
81
81
  <div class="ttc" id="namespacestd_html"><div class="ttname"><a href="namespacestd.html">std</a></div></div>
82
82
  <div class="ttc" id="classSVF_1_1SVFModule_html"><div class="ttname"><a href="classSVF_1_1SVFModule.html">SVF::SVFModule</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFModule_8h_source.html#l00041">SVFModule.h:41</a></div></div>
83
- <div class="ttc" id="namespaceSVF_html_adefcb50414ea999d70cea5ccdbcb98d7"><div class="ttname"><a href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">SVF::ConstantInt</a></div><div class="ttdeci">llvm::ConstantInt ConstantInt</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00094">BasicTypes.h:94</a></div></div>
83
+ <div class="ttc" id="namespaceSVF_html_adefcb50414ea999d70cea5ccdbcb98d7"><div class="ttname"><a href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">SVF::ConstantInt</a></div><div class="ttdeci">llvm::ConstantInt ConstantInt</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00093">BasicTypes.h:93</a></div></div>
84
84
  <div class="ttc" id="namespaceSVF_html_a8234d4b959abc9123993bcff4eee34c1"><div class="ttname"><a href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">SVF::Map</a></div><div class="ttdeci">std::unordered_map&lt; Key, Value, Hash, KeyEqual, Allocator &gt; Map</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00110">SVFBasicTypes.h:110</a></div></div>
85
85
  <div class="ttc" id="namespaceSVF_html_ad42bff8d0a7d60a085aa32d10f4955af"><div class="ttname"><a href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">SVF::u32_t</a></div><div class="ttdeci">unsigned u32_t</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00085">SVFBasicTypes.h:85</a></div></div>
86
- <div class="ttc" id="namespaceSVF_html_a1c7c7ac12791c0ae386283c0a4f127ba"><div class="ttname"><a href="namespaceSVF.html#a1c7c7ac12791c0ae386283c0a4f127ba">SVF::raw_fd_ostream</a></div><div class="ttdeci">llvm::raw_fd_ostream raw_fd_ostream</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00084">BasicTypes.h:84</a></div></div>
86
+ <div class="ttc" id="namespaceSVF_html_a1c7c7ac12791c0ae386283c0a4f127ba"><div class="ttname"><a href="namespaceSVF.html#a1c7c7ac12791c0ae386283c0a4f127ba">SVF::raw_fd_ostream</a></div><div class="ttdeci">llvm::raw_fd_ostream raw_fd_ostream</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00083">BasicTypes.h:83</a></div></div>
87
87
  <div class="ttc" id="classSVF_1_1LLVMModuleSet_html"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html">SVF::LLVMModuleSet</a></div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00041">LLVMModule.h:41</a></div></div>
88
- <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a72502f7f536418621485e90ab98c2016"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a72502f7f536418621485e90ab98c2016">SVF::SVFUtil::move</a></div><div class="ttdeci">constexpr std::remove_reference&lt; T &gt;::type &amp;&amp; move(T &amp;&amp;t) noexcept</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00729">SVFUtil.h:729</a></div></div>
88
+ <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a72502f7f536418621485e90ab98c2016"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a72502f7f536418621485e90ab98c2016">SVF::SVFUtil::move</a></div><div class="ttdeci">constexpr std::remove_reference&lt; T &gt;::type &amp;&amp; move(T &amp;&amp;t) noexcept</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00717">SVFUtil.h:717</a></div></div>
89
89
  <div class="ttc" id="namespaceSVF_html_af739db846e47ba6b2fd15eaad31ab7fb"><div class="ttname"><a href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">SVF::Set</a></div><div class="ttdeci">std::unordered_set&lt; Key, Hash, KeyEqual, Allocator &gt; Set</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00105">SVFBasicTypes.h:105</a></div></div>
90
90
  <div class="ttc" id="namespaceSVF_1_1LLVMUtil_html_a651b6a1cf3665277d2241220bb145aed"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#a651b6a1cf3665277d2241220bb145aed">SVF::LLVMUtil::functionDoesNotRet</a></div><div class="ttdeci">bool functionDoesNotRet(const Function *fun)</div><div class="ttdoc">Return true if the function has a return instruction reachable from function entry. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8cpp_source.html#l00128">LLVMUtil.cpp:128</a></div></div>
91
91
  <div class="ttc" id="namespaceSVF_html_a5faee14fa1dd41447bc73ac365fe33c1"><div class="ttname"><a href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">SVF::Function</a></div><div class="ttdeci">llvm::Function Function</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00070">BasicTypes.h:70</a></div></div>
92
92
  <div class="ttc" id="SVF-FE_2BasicTypes_8h_html"><div class="ttname"><a href="SVF-FE_2BasicTypes_8h.html">BasicTypes.h</a></div></div>
93
93
  <div class="ttc" id="BreakConstantExpr_8h_html"><div class="ttname"><a href="BreakConstantExpr_8h.html">BreakConstantExpr.h</a></div></div>
94
- <div class="ttc" id="namespaceSVF_html_a0fd33072b099f61eaa642e94ed0c03fc"><div class="ttname"><a href="namespaceSVF.html#a0fd33072b099f61eaa642e94ed0c03fc">SVF::GlobalAlias</a></div><div class="ttdeci">llvm::GlobalAlias GlobalAlias</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00096">BasicTypes.h:96</a></div></div>
94
+ <div class="ttc" id="namespaceSVF_html_a0fd33072b099f61eaa642e94ed0c03fc"><div class="ttname"><a href="namespaceSVF.html#a0fd33072b099f61eaa642e94ed0c03fc">SVF::GlobalAlias</a></div><div class="ttdeci">llvm::GlobalAlias GlobalAlias</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00095">BasicTypes.h:95</a></div></div>
95
95
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_ab65033f068bfbeb0a1c52dcec3beb6bc"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVF::SVFUtil::errs</a></div><div class="ttdeci">std::ostream &amp; errs()</div><div class="ttdoc">Overwrite llvm::errs() </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00055">SVFUtil.h:55</a></div></div>
96
96
  <div class="ttc" id="classSVF_1_1SVFModule_html_a4cf1ca2e9f045a0520b0a8a6cd5993f2"><div class="ttname"><a href="classSVF_1_1SVFModule.html#a4cf1ca2e9f045a0520b0a8a6cd5993f2">SVF::SVFModule::global_iterator</a></div><div class="ttdeci">GlobalSetType::iterator global_iterator</div><div class="ttdef"><b>Definition:</b> <a href="SVFModule_8h_source.html#l00055">SVFModule.h:55</a></div></div>
97
97
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_aed0b0b9f035057552a6a82154fd88e61"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVF::SVFUtil::outs</a></div><div class="ttdeci">std::ostream &amp; outs()</div><div class="ttdoc">Overwrite llvm::outs() </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00049">SVFUtil.h:49</a></div></div>
@@ -100,20 +100,20 @@ $(function() {
100
100
  <div class="ttc" id="LLVMModule_8cpp_html_aa18802f2f60ef8030c66a42f20f285af"><div class="ttname"><a href="LLVMModule_8cpp.html#aa18802f2f60ef8030c66a42f20f285af">SVF_GLOBAL_CTORS</a></div><div class="ttdeci">#define SVF_GLOBAL_CTORS</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00068">LLVMModule.cpp:68</a></div></div>
101
101
  <div class="ttc" id="LLVMModule_8cpp_html_a10ab7c7da3a458495d8528b9e90d714b"><div class="ttname"><a href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a></div><div class="ttdeci">#define SVF_MAIN_FUNC_NAME</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00067">LLVMModule.cpp:67</a></div></div>
102
102
  <div class="ttc" id="Options_8h_html"><div class="ttname"><a href="Options_8h.html">Options.h</a></div></div>
103
- <div class="ttc" id="classSVF_1_1SVFFunction_html_ac4ae917ae35ac6fca652fe2dd90a8ac2"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">SVF::SVFFunction::getLLVMFun</a></div><div class="ttdeci">Function * getLLVMFun() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00152">BasicTypes.h:152</a></div></div>
103
+ <div class="ttc" id="classSVF_1_1SVFFunction_html_ac4ae917ae35ac6fca652fe2dd90a8ac2"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">SVF::SVFFunction::getLLVMFun</a></div><div class="ttdeci">Function * getLLVMFun() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00151">BasicTypes.h:151</a></div></div>
104
104
  <div class="ttc" id="namespaceSVF_html"><div class="ttname"><a href="namespaceSVF.html">SVF</a></div><div class="ttdoc">for isBitcode </div><div class="ttdef"><b>Definition:</b> <a href="CFGNormalizer_8h_source.html#l00035">CFGNormalizer.h:35</a></div></div>
105
105
  <div class="ttc" id="CFLGrammar_8txt_html_a00967427d1c110ffcc82ea2a966f4564"><div class="ttname"><a href="CFLGrammar_8txt.html#a00967427d1c110ffcc82ea2a966f4564">F</a></div><div class="ttdeci">V Fbar V F</div><div class="ttdef"><b>Definition:</b> <a href="CFLGrammar_8txt_source.html#l00016">CFLGrammar.txt:16</a></div></div>
106
106
  <div class="ttc" id="SVFModule_8h_html"><div class="ttname"><a href="SVFModule_8h.html">SVFModule.h</a></div></div>
107
107
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a8182be247907420db00837cef9bcfa70"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if&lt;!is_simple_type&lt; Y &gt;::value, typename cast_retty&lt; X, const Y &gt;::ret_type &gt;::type dyn_cast(const Y &amp;Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00343">Casting.h:343</a></div></div>
108
108
  <div class="ttc" id="namespaceSVF_1_1LLVMUtil_html_a2c61d741afbcfa853b505cd391f29f9b"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#a2c61d741afbcfa853b505cd391f29f9b">SVF::LLVMUtil::isUncalledFunction</a></div><div class="ttdeci">bool isUncalledFunction(const Function *fun)</div><div class="ttdoc">whether this is a function without any possible caller? </div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8cpp_source.html#l00169">LLVMUtil.cpp:169</a></div></div>
109
- <div class="ttc" id="classSVF_1_1SVFFunction_html_a3ff1ce3a7e4a9f4037a8bb74ddb5fabf"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#a3ff1ce3a7e4a9f4037a8bb74ddb5fabf">SVF::SVFFunction::setIsNotRet</a></div><div class="ttdeci">const void setIsNotRet(const bool doesNotRet)</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00198">BasicTypes.h:198</a></div></div>
110
- <div class="ttc" id="namespaceSVF_html_a2b28f48dde0a9a91d251e654ce1f9477"><div class="ttname"><a href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">SVF::ConstantStruct</a></div><div class="ttdeci">llvm::ConstantStruct ConstantStruct</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00052">BasicTypes.h:52</a></div></div>
109
+ <div class="ttc" id="classSVF_1_1SVFFunction_html_a3ff1ce3a7e4a9f4037a8bb74ddb5fabf"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#a3ff1ce3a7e4a9f4037a8bb74ddb5fabf">SVF::SVFFunction::setIsNotRet</a></div><div class="ttdeci">const void setIsNotRet(const bool doesNotRet)</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00197">BasicTypes.h:197</a></div></div>
110
+ <div class="ttc" id="namespaceSVF_html_a2b28f48dde0a9a91d251e654ce1f9477"><div class="ttname"><a href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">SVF::ConstantStruct</a></div><div class="ttdeci">llvm::ConstantStruct ConstantStruct</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00053">BasicTypes.h:53</a></div></div>
111
111
  <div class="ttc" id="PEGGrammar_8txt_html_abd600039647a1e73c88e7161fa6eb989"><div class="ttname"><a href="PEGGrammar_8txt.html#abd600039647a1e73c88e7161fa6eb989">M</a></div><div class="ttdeci">V M</div><div class="ttdef"><b>Definition:</b> <a href="PEGGrammar_8txt_source.html#l00010">PEGGrammar.txt:10</a></div></div>
112
112
  <div class="ttc" id="classSVF_1_1SVFModule_html_acfd1ffb4696136de493843786c799e6b"><div class="ttname"><a href="classSVF_1_1SVFModule.html#acfd1ffb4696136de493843786c799e6b">SVF::SVFModule::FunctionSetType</a></div><div class="ttdeci">std::vector&lt; const SVFFunction * &gt; FunctionSetType</div><div class="ttdef"><b>Definition:</b> <a href="SVFModule_8h_source.html#l00044">SVFModule.h:44</a></div></div>
113
113
  <div class="ttc" id="cJSON_8h_html_ad4c68ea99a26b0a98ad9a79982960458"><div class="ttname"><a href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">string</a></div><div class="ttdeci">const char *const string</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00172">cJSON.h:172</a></div></div>
114
114
  <div class="ttc" id="namespaceSVF_html_a90b263fd2f541eca78135078114cabda"><div class="ttname"><a href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">SVF::Value</a></div><div class="ttdeci">llvm::Value Value</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00072">BasicTypes.h:72</a></div></div>
115
115
  <div class="ttc" id="LLVMUtil_8h_html"><div class="ttname"><a href="LLVMUtil_8h.html">LLVMUtil.h</a></div></div>
116
- <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a22ef185e767ff76c098e75126c885400"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">SVF::SVFUtil::isExtCall</a></div><div class="ttdeci">bool isExtCall(const SVFFunction *fun)</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00358">SVFUtil.h:358</a></div></div>
116
+ <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a22ef185e767ff76c098e75126c885400"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">SVF::SVFUtil::isExtCall</a></div><div class="ttdeci">bool isExtCall(const SVFFunction *fun)</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00346">SVFUtil.h:346</a></div></div>
117
117
  </div><!-- fragment --></div><!-- contents -->
118
118
  <!-- start footer part -->
119
119
  <hr class="footer"/><address class="footer"><small>