svf-tools 1.0.573 → 1.0.574

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 (377) hide show
  1. package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +1 -1
  2. package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +1 -1
  3. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +5 -5
  4. package/SVF-doxygen/html/html/Andersen_8h_source.html +2 -2
  5. package/SVF-doxygen/html/html/Annotator_8h_source.html +3 -3
  6. package/SVF-doxygen/html/html/BreakConstantExpr_8cpp.html +2 -2
  7. package/SVF-doxygen/html/html/BreakConstantExpr_8cpp_source.html +5 -5
  8. package/SVF-doxygen/html/html/BreakConstantExpr_8h_source.html +4 -4
  9. package/SVF-doxygen/html/html/CFLAlias_8cpp_source.html +7 -7
  10. package/SVF-doxygen/html/html/CFLAlias_8h_source.html +3 -3
  11. package/SVF-doxygen/html/html/CFLGrammar_8h_source.html +1 -1
  12. package/SVF-doxygen/html/html/CFLGraph_8cpp_source.html +1 -1
  13. package/SVF-doxygen/html/html/CFLStat_8cpp_source.html +1 -1
  14. package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +18 -18
  15. package/SVF-doxygen/html/html/CHGBuilder_8h_source.html +5 -5
  16. package/SVF-doxygen/html/html/CHG_8cpp.html +2 -2
  17. package/SVF-doxygen/html/html/CHG_8cpp_source.html +10 -10
  18. package/SVF-doxygen/html/html/CHG_8h_source.html +3 -3
  19. package/SVF-doxygen/html/html/CPPUtil_8cpp_source.html +21 -21
  20. package/SVF-doxygen/html/html/CPPUtil_8h_source.html +3 -3
  21. package/SVF-doxygen/html/html/CallGraphBuilder_8cpp_source.html +5 -5
  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 +2 -2
  25. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +4 -4
  26. package/SVF-doxygen/html/html/ContextDDA_8h_source.html +1 -1
  27. package/SVF-doxygen/html/html/CxtStmt_8h_source.html +4 -4
  28. package/SVF-doxygen/html/html/DCHG_8cpp_source.html +22 -22
  29. package/SVF-doxygen/html/html/DCHG_8h_source.html +9 -9
  30. package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +1 -1
  31. package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +2 -2
  32. package/SVF-doxygen/html/html/DDAPass_8h_source.html +1 -1
  33. package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +2 -2
  34. package/SVF-doxygen/html/html/DPItem_8h_source.html +1 -1
  35. package/SVF-doxygen/html/html/DataFlowUtil_8cpp_source.html +7 -7
  36. package/SVF-doxygen/html/html/DataFlowUtil_8h_source.html +10 -10
  37. package/SVF-doxygen/html/html/DoubleFreeChecker_8cpp_source.html +1 -1
  38. package/SVF-doxygen/html/html/DoubleFreeChecker_8h_source.html +1 -1
  39. package/SVF-doxygen/html/html/ExeState_8cpp_source.html +3 -3
  40. package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +5 -5
  41. package/SVF-doxygen/html/html/ExtAPI_8h_source.html +1 -1
  42. package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +1 -1
  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 +3 -3
  49. package/SVF-doxygen/html/html/Graph2Json_8cpp_source.html +1 -1
  50. package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +8 -8
  51. package/SVF-doxygen/html/html/ICFGBuilder_8h_source.html +2 -2
  52. package/SVF-doxygen/html/html/ICFGEdge_8h_source.html +2 -2
  53. package/SVF-doxygen/html/html/ICFGNode_8h_source.html +3 -3
  54. package/SVF-doxygen/html/html/ICFG_8cpp_source.html +6 -6
  55. package/SVF-doxygen/html/html/ICFG_8h_source.html +3 -3
  56. package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +10 -10
  57. package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +2 -2
  58. package/SVF-doxygen/html/html/IRGraph_8h_source.html +3 -3
  59. package/SVF-doxygen/html/html/LLVMLoopAnalysis_8cpp_source.html +5 -5
  60. package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +22 -20
  61. package/SVF-doxygen/html/html/LLVMModule_8h_source.html +13 -13
  62. package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +23 -23
  63. package/SVF-doxygen/html/html/LLVMUtil_8h_source.html +16 -16
  64. package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +1 -1
  65. package/SVF-doxygen/html/html/LeakChecker_8h_source.html +1 -1
  66. package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +5 -5
  67. package/SVF-doxygen/html/html/LocationSet_8h_source.html +2 -2
  68. package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +8 -8
  69. package/SVF-doxygen/html/html/LockAnalysis_8h_source.html +4 -4
  70. package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +13 -13
  71. package/SVF-doxygen/html/html/LockResultValidator_8h_source.html +2 -2
  72. package/SVF-doxygen/html/html/MHP_8cpp.html +2 -2
  73. package/SVF-doxygen/html/html/MHP_8cpp_source.html +14 -14
  74. package/SVF-doxygen/html/html/MHP_8h_source.html +6 -6
  75. package/SVF-doxygen/html/html/MSSAMuChi_8h_source.html +2 -2
  76. package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +6 -6
  77. package/SVF-doxygen/html/html/MTAAnnotator_8h_source.html +5 -5
  78. package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +16 -16
  79. package/SVF-doxygen/html/html/MTAResultValidator_8h_source.html +7 -7
  80. package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +5 -5
  81. package/SVF-doxygen/html/html/MTA_8cpp_source.html +6 -6
  82. package/SVF-doxygen/html/html/MTA_8h_source.html +5 -5
  83. package/SVF-doxygen/html/html/MemPartition_8cpp_source.html +1 -1
  84. package/SVF-doxygen/html/html/MemPartition_8h_source.html +1 -1
  85. package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +8 -8
  86. package/SVF-doxygen/html/html/MemRegion_8h_source.html +3 -3
  87. package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +9 -9
  88. package/SVF-doxygen/html/html/MemSSA_8h_source.html +2 -2
  89. package/SVF-doxygen/html/html/PCG_8cpp_source.html +8 -8
  90. package/SVF-doxygen/html/html/PCG_8h_source.html +3 -3
  91. package/SVF-doxygen/html/html/PTACallGraph_8cpp_source.html +2 -2
  92. package/SVF-doxygen/html/html/PTACallGraph_8h_source.html +1 -1
  93. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +1 -1
  94. package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +1 -1
  95. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +13 -13
  96. package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +2 -2
  97. package/SVF-doxygen/html/html/ProgSlice_8cpp_source.html +3 -3
  98. package/SVF-doxygen/html/html/ProgSlice_8h_source.html +7 -7
  99. package/SVF-doxygen/html/html/SVF-FE_2BasicTypes_8h.html +8 -0
  100. package/SVF-doxygen/html/html/SVF-FE_2BasicTypes_8h_source.html +84 -81
  101. package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +1 -1
  102. package/SVF-doxygen/html/html/SVFGNode_8h_source.html +1 -1
  103. package/SVF-doxygen/html/html/SVFGOPT_8h_source.html +1 -1
  104. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +3 -3
  105. package/SVF-doxygen/html/html/SVFG_8h_source.html +1 -1
  106. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +49 -52
  107. package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +45 -45
  108. package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +2 -2
  109. package/SVF-doxygen/html/html/SVFIR_8h_source.html +3 -3
  110. package/SVF-doxygen/html/html/SVFModule_8h_source.html +10 -10
  111. package/SVF-doxygen/html/html/SVFStat_8cpp_source.html +2 -2
  112. package/SVF-doxygen/html/html/SVFStatements_8cpp_source.html +1 -1
  113. package/SVF-doxygen/html/html/SVFStatements_8h_source.html +3 -3
  114. package/SVF-doxygen/html/html/SVFUtil_8cpp_source.html +12 -12
  115. package/SVF-doxygen/html/html/SVFUtil_8h_source.html +10 -10
  116. package/SVF-doxygen/html/html/SVFVariables_8cpp_source.html +2 -2
  117. package/SVF-doxygen/html/html/SVFVariables_8h_source.html +6 -6
  118. package/SVF-doxygen/html/html/SaberAnnotator_8cpp_source.html +3 -3
  119. package/SVF-doxygen/html/html/SaberCheckerAPI_8h_source.html +2 -2
  120. package/SVF-doxygen/html/html/SaberCondAllocator_8cpp_source.html +28 -30
  121. package/SVF-doxygen/html/html/SaberCondAllocator_8h_source.html +43 -47
  122. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +2 -2
  123. package/SVF-doxygen/html/html/SparseBitVector_8h_source.html +1 -1
  124. package/SVF-doxygen/html/html/SrcSnkDDA_8h_source.html +1 -1
  125. package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +34 -36
  126. package/SVF-doxygen/html/html/SymbolTableBuilder_8h_source.html +5 -5
  127. package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +9 -9
  128. package/SVF-doxygen/html/html/SymbolTableInfo_8h_source.html +8 -8
  129. package/SVF-doxygen/html/html/TCT_8cpp_source.html +14 -14
  130. package/SVF-doxygen/html/html/TCT_8h_source.html +11 -11
  131. package/SVF-doxygen/html/html/ThreadAPI_8cpp_source.html +4 -4
  132. package/SVF-doxygen/html/html/ThreadAPI_8h_source.html +6 -6
  133. package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +3 -3
  134. package/SVF-doxygen/html/html/ThreadCallGraph_8h_source.html +2 -2
  135. package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +3 -3
  136. package/SVF-doxygen/html/html/Util_2BasicTypes_8h.html +0 -7
  137. package/SVF-doxygen/html/html/Util_2BasicTypes_8h_source.html +93 -94
  138. package/SVF-doxygen/html/html/VFGNode_8h_source.html +3 -3
  139. package/SVF-doxygen/html/html/VFG_8cpp_source.html +4 -4
  140. package/SVF-doxygen/html/html/VFG_8h_source.html +1 -1
  141. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +1 -1
  142. package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +3 -3
  143. package/SVF-doxygen/html/html/WPAPass_8h_source.html +3 -3
  144. package/SVF-doxygen/html/html/classSVF_1_1ActualINSVFGNode.html +1 -1
  145. package/SVF-doxygen/html/html/classSVF_1_1ActualOUTSVFGNode.html +1 -1
  146. package/SVF-doxygen/html/html/classSVF_1_1ActualParmVFGNode.html +1 -1
  147. package/SVF-doxygen/html/html/classSVF_1_1ActualRetVFGNode.html +1 -1
  148. package/SVF-doxygen/html/html/classSVF_1_1AddrStmt.html +1 -1
  149. package/SVF-doxygen/html/html/classSVF_1_1AddrVFGNode.html +1 -1
  150. package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +5 -5
  151. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +1 -1
  152. package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +1 -1
  153. package/SVF-doxygen/html/html/classSVF_1_1Annotator.html +1 -1
  154. package/SVF-doxygen/html/html/classSVF_1_1ArgumentVFGNode.html +1 -1
  155. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +1 -1
  156. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPStmt.html +1 -1
  157. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +1 -1
  158. package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.html +1 -1
  159. package/SVF-doxygen/html/html/classSVF_1_1BranchVFGNode.html +1 -1
  160. package/SVF-doxygen/html/html/classSVF_1_1BreakConstantGEPs.html +4 -4
  161. package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.html +7 -7
  162. package/SVF-doxygen/html/html/classSVF_1_1CFLStat.html +1 -1
  163. package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +35 -35
  164. package/SVF-doxygen/html/html/classSVF_1_1CHGraph.html +7 -7
  165. package/SVF-doxygen/html/html/classSVF_1_1CallCFGEdge.html +1 -1
  166. package/SVF-doxygen/html/html/classSVF_1_1CallDirSVFGEdge.html +1 -1
  167. package/SVF-doxygen/html/html/classSVF_1_1CallGraphBuilder.html +4 -4
  168. package/SVF-doxygen/html/html/classSVF_1_1CallICFGNode.html +1 -1
  169. package/SVF-doxygen/html/html/classSVF_1_1CallIndSVFGEdge.html +1 -1
  170. package/SVF-doxygen/html/html/classSVF_1_1CallPE.html +1 -1
  171. package/SVF-doxygen/html/html/classSVF_1_1CallSite-members.html +18 -21
  172. package/SVF-doxygen/html/html/classSVF_1_1CallSite.html +37 -120
  173. package/SVF-doxygen/html/html/classSVF_1_1CmpStmt.html +1 -1
  174. package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +1 -1
  175. package/SVF-doxygen/html/html/classSVF_1_1CondStdSet.html +1 -1
  176. package/SVF-doxygen/html/html/classSVF_1_1CondVar.html +1 -1
  177. package/SVF-doxygen/html/html/classSVF_1_1ContextCond.html +1 -1
  178. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +6 -6
  179. package/SVF-doxygen/html/html/classSVF_1_1CopyStmt.html +1 -1
  180. package/SVF-doxygen/html/html/classSVF_1_1CopyVFGNode.html +1 -1
  181. package/SVF-doxygen/html/html/classSVF_1_1CxtProc.html +1 -1
  182. package/SVF-doxygen/html/html/classSVF_1_1CxtStmt.html +1 -1
  183. package/SVF-doxygen/html/html/classSVF_1_1CxtThread.html +1 -1
  184. package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +57 -57
  185. package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +2 -2
  186. package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +1 -1
  187. package/SVF-doxygen/html/html/classSVF_1_1DirectSVFGEdge.html +1 -1
  188. package/SVF-doxygen/html/html/classSVF_1_1DistinctMRG.html +1 -1
  189. package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker.html +1 -1
  190. package/SVF-doxygen/html/html/classSVF_1_1DummyObjVar.html +1 -1
  191. package/SVF-doxygen/html/html/classSVF_1_1DummyValVar.html +1 -1
  192. package/SVF-doxygen/html/html/classSVF_1_1ExeState.html +5 -5
  193. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +5 -5
  194. package/SVF-doxygen/html/html/classSVF_1_1FIObjVar.html +1 -1
  195. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +2 -2
  196. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +1 -1
  197. package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis.html +22 -22
  198. package/SVF-doxygen/html/html/classSVF_1_1FormalINSVFGNode.html +1 -1
  199. package/SVF-doxygen/html/html/classSVF_1_1FormalOUTSVFGNode.html +1 -1
  200. package/SVF-doxygen/html/html/classSVF_1_1FormalParmVFGNode.html +1 -1
  201. package/SVF-doxygen/html/html/classSVF_1_1FormalRetVFGNode.html +1 -1
  202. package/SVF-doxygen/html/html/classSVF_1_1FunEntryICFGNode.html +2 -2
  203. package/SVF-doxygen/html/html/classSVF_1_1FunExitICFGNode.html +3 -3
  204. package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +1 -1
  205. package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +1 -1
  206. package/SVF-doxygen/html/html/classSVF_1_1GepStmt.html +1 -1
  207. package/SVF-doxygen/html/html/classSVF_1_1GepVFGNode.html +1 -1
  208. package/SVF-doxygen/html/html/classSVF_1_1GepValVar.html +1 -1
  209. package/SVF-doxygen/html/html/classSVF_1_1GlobalICFGNode.html +1 -1
  210. package/SVF-doxygen/html/html/classSVF_1_1ICFG.html +2 -2
  211. package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +13 -13
  212. package/SVF-doxygen/html/html/classSVF_1_1ICFGEdge.html +1 -1
  213. package/SVF-doxygen/html/html/classSVF_1_1ICFGNode.html +1 -1
  214. package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter.html +1 -1
  215. package/SVF-doxygen/html/html/classSVF_1_1IRAnnotator.html +8 -8
  216. package/SVF-doxygen/html/html/classSVF_1_1IndirectSVFGEdge.html +1 -1
  217. package/SVF-doxygen/html/html/classSVF_1_1InterDisjointMRG.html +1 -1
  218. package/SVF-doxygen/html/html/classSVF_1_1InterMSSAPHISVFGNode.html +1 -1
  219. package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode.html +1 -1
  220. package/SVF-doxygen/html/html/classSVF_1_1IntraCFGEdge.html +1 -1
  221. package/SVF-doxygen/html/html/classSVF_1_1IntraDirSVFGEdge.html +1 -1
  222. package/SVF-doxygen/html/html/classSVF_1_1IntraDisjointMRG.html +1 -1
  223. package/SVF-doxygen/html/html/classSVF_1_1IntraICFGNode.html +1 -1
  224. package/SVF-doxygen/html/html/classSVF_1_1IntraIndSVFGEdge.html +1 -1
  225. package/SVF-doxygen/html/html/classSVF_1_1IntraMSSAPHISVFGNode.html +1 -1
  226. package/SVF-doxygen/html/html/classSVF_1_1IntraPHIVFGNode.html +1 -1
  227. package/SVF-doxygen/html/html/classSVF_1_1IteratedDominanceFrontier.html +3 -3
  228. package/SVF-doxygen/html/html/classSVF_1_1LLVMLoopAnalysis.html +5 -5
  229. package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +58 -56
  230. package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +3 -3
  231. package/SVF-doxygen/html/html/classSVF_1_1LoadStmt.html +1 -1
  232. package/SVF-doxygen/html/html/classSVF_1_1LoadVFGNode.html +1 -1
  233. package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +6 -6
  234. package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +32 -32
  235. package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +15 -15
  236. package/SVF-doxygen/html/html/classSVF_1_1MHP.html +26 -26
  237. package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +10 -10
  238. package/SVF-doxygen/html/html/classSVF_1_1MRSVFGNode.html +1 -1
  239. package/SVF-doxygen/html/html/classSVF_1_1MSSAPHISVFGNode.html +1 -1
  240. package/SVF-doxygen/html/html/classSVF_1_1MTA.html +6 -6
  241. package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +9 -9
  242. package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +30 -30
  243. package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +9 -9
  244. package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +6 -6
  245. package/SVF-doxygen/html/html/classSVF_1_1MemObj.html +1 -1
  246. package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +16 -16
  247. package/SVF-doxygen/html/html/classSVF_1_1MergeFunctionRets.html +3 -3
  248. package/SVF-doxygen/html/html/classSVF_1_1NullPtrVFGNode.html +1 -1
  249. package/SVF-doxygen/html/html/classSVF_1_1ObjTypeInfo.html +1 -1
  250. package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +1 -1
  251. package/SVF-doxygen/html/html/classSVF_1_1PCG.html +20 -20
  252. package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +1 -1
  253. package/SVF-doxygen/html/html/classSVF_1_1PTACFInfoBuilder.html +7 -7
  254. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraph.html +1 -1
  255. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphEdge.html +1 -1
  256. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphNode.html +1 -1
  257. package/SVF-doxygen/html/html/classSVF_1_1PhiStmt.html +1 -1
  258. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +19 -19
  259. package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +12 -12
  260. package/SVF-doxygen/html/html/classSVF_1_1RaceResultValidator.html +9 -9
  261. package/SVF-doxygen/html/html/classSVF_1_1RetCFGEdge.html +1 -1
  262. package/SVF-doxygen/html/html/classSVF_1_1RetDirSVFGEdge.html +1 -1
  263. package/SVF-doxygen/html/html/classSVF_1_1RetICFGNode.html +1 -1
  264. package/SVF-doxygen/html/html/classSVF_1_1RetIndSVFGEdge.html +1 -1
  265. package/SVF-doxygen/html/html/classSVF_1_1RetPE.html +1 -1
  266. package/SVF-doxygen/html/html/classSVF_1_1RetPN.html +1 -1
  267. package/SVF-doxygen/html/html/classSVF_1_1SVFBasicBlock.html +3 -3
  268. package/SVF-doxygen/html/html/classSVF_1_1SVFFunction-members.html +22 -17
  269. package/SVF-doxygen/html/html/classSVF_1_1SVFFunction.html +279 -111
  270. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +2 -2
  271. package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +1 -1
  272. package/SVF-doxygen/html/html/classSVF_1_1SVFGlobal.html +3 -3
  273. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +92 -98
  274. package/SVF-doxygen/html/html/classSVF_1_1SVFStat.html +2 -2
  275. package/SVF-doxygen/html/html/classSVF_1_1SVFStmt.html +2 -2
  276. package/SVF-doxygen/html/html/classSVF_1_1SVFVar.html +4 -4
  277. package/SVF-doxygen/html/html/classSVF_1_1SaberAnnotator.html +7 -7
  278. package/SVF-doxygen/html/html/classSVF_1_1SaberCondAllocator-members.html +27 -28
  279. package/SVF-doxygen/html/html/classSVF_1_1SaberCondAllocator.html +118 -153
  280. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +2 -2
  281. package/SVF-doxygen/html/html/classSVF_1_1SelectStmt.html +1 -1
  282. package/SVF-doxygen/html/html/classSVF_1_1StmtVFGNode.html +1 -1
  283. package/SVF-doxygen/html/html/classSVF_1_1StoreStmt.html +1 -1
  284. package/SVF-doxygen/html/html/classSVF_1_1StoreVFGNode.html +1 -1
  285. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +48 -50
  286. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +10 -10
  287. package/SVF-doxygen/html/html/classSVF_1_1TCT.html +30 -30
  288. package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +1 -1
  289. package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +1 -1
  290. package/SVF-doxygen/html/html/classSVF_1_1ThreadAPI.html +4 -4
  291. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +9 -9
  292. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraphBuilder.html +3 -3
  293. package/SVF-doxygen/html/html/classSVF_1_1ThreadForkEdge.html +1 -1
  294. package/SVF-doxygen/html/html/classSVF_1_1ThreadJoinEdge.html +1 -1
  295. package/SVF-doxygen/html/html/classSVF_1_1ThreadMHPIndSVFGEdge.html +1 -1
  296. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +3 -3
  297. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPStmt.html +1 -1
  298. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +1 -1
  299. package/SVF-doxygen/html/html/classSVF_1_1VFG.html +4 -4
  300. package/SVF-doxygen/html/html/classSVF_1_1VFGEdge.html +1 -1
  301. package/SVF-doxygen/html/html/classSVF_1_1VFGNode.html +1 -1
  302. package/SVF-doxygen/html/html/classSVF_1_1ValVar.html +1 -1
  303. package/SVF-doxygen/html/html/classSVF_1_1VarArgPN.html +1 -1
  304. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +1 -1
  305. package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +1 -1
  306. package/SVF-doxygen/html/html/classllvm_1_1generic__bridge__gep__type__iterator.html +3 -3
  307. package/SVF-doxygen/html/html/functions_a.html +7 -13
  308. package/SVF-doxygen/html/html/functions_b.html +7 -4
  309. package/SVF-doxygen/html/html/functions_func.html +10 -13
  310. package/SVF-doxygen/html/html/functions_func_g.html +14 -11
  311. package/SVF-doxygen/html/html/functions_func_h.html +5 -2
  312. package/SVF-doxygen/html/html/functions_func_i.html +5 -2
  313. package/SVF-doxygen/html/html/functions_func_s.html +11 -11
  314. package/SVF-doxygen/html/html/functions_g.html +16 -13
  315. package/SVF-doxygen/html/html/functions_h.html +6 -3
  316. package/SVF-doxygen/html/html/functions_i.html +10 -7
  317. package/SVF-doxygen/html/html/functions_l.html +3 -3
  318. package/SVF-doxygen/html/html/functions_m.html +1 -1
  319. package/SVF-doxygen/html/html/functions_o.html +15 -15
  320. package/SVF-doxygen/html/html/functions_p.html +8 -12
  321. package/SVF-doxygen/html/html/functions_s.html +6 -6
  322. package/SVF-doxygen/html/html/functions_t.html +7 -7
  323. package/SVF-doxygen/html/html/functions_type.html +0 -3
  324. package/SVF-doxygen/html/html/functions_v.html +6 -6
  325. package/SVF-doxygen/html/html/functions_vars_b.html +3 -0
  326. package/SVF-doxygen/html/html/functions_w.html +11 -11
  327. package/SVF-doxygen/html/html/namespaceSVF.html +123 -120
  328. package/SVF-doxygen/html/html/namespaceSVF_1_1LLVMUtil.html +47 -47
  329. package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +19 -19
  330. package/SVF-doxygen/html/html/namespaceSVF_1_1cppUtil.html +40 -40
  331. package/SVF-doxygen/html/html/search/all_1.js +1 -3
  332. package/SVF-doxygen/html/html/search/all_10.js +6 -6
  333. package/SVF-doxygen/html/html/search/all_11.js +2 -2
  334. package/SVF-doxygen/html/html/search/all_12.js +9 -9
  335. package/SVF-doxygen/html/html/search/all_13.js +4 -4
  336. package/SVF-doxygen/html/html/search/all_15.js +3 -3
  337. package/SVF-doxygen/html/html/search/all_16.js +1 -1
  338. package/SVF-doxygen/html/html/search/all_2.js +1 -0
  339. package/SVF-doxygen/html/html/search/all_7.js +2 -1
  340. package/SVF-doxygen/html/html/search/all_8.js +1 -0
  341. package/SVF-doxygen/html/html/search/all_9.js +1 -0
  342. package/SVF-doxygen/html/html/search/all_b.js +1 -1
  343. package/SVF-doxygen/html/html/search/all_c.js +3 -3
  344. package/SVF-doxygen/html/html/search/all_d.js +1 -1
  345. package/SVF-doxygen/html/html/search/all_e.js +1 -1
  346. package/SVF-doxygen/html/html/search/all_f.js +2 -2
  347. package/SVF-doxygen/html/html/search/functions_0.js +1 -2
  348. package/SVF-doxygen/html/html/search/functions_11.js +2 -2
  349. package/SVF-doxygen/html/html/search/functions_6.js +2 -1
  350. package/SVF-doxygen/html/html/search/functions_7.js +1 -0
  351. package/SVF-doxygen/html/html/search/functions_8.js +1 -0
  352. package/SVF-doxygen/html/html/search/typedefs_0.js +0 -1
  353. package/SVF-doxygen/html/html/search/variables_13.js +1 -1
  354. package/SVF-doxygen/html/html/search/variables_2.js +1 -0
  355. package/SVF-doxygen/html/html/search/variables_c.js +1 -1
  356. package/SVF-doxygen/html/html/structSVF_1_1PopulationCounter.html +1 -1
  357. package/SVF-doxygen/html/html/structSVF_1_1PopulationCounter_3_01T_00_018_01_4.html +1 -1
  358. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01CFLGraph_01_5_01_4.html +3 -3
  359. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +1 -1
  360. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ICFG_01_5_01_4.html +2 -2
  361. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.html +2 -2
  362. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01PTACallGraph_01_5_01_4.html +2 -2
  363. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01SVFG_01_5_01_4.html +4 -4
  364. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01VFG_01_5_01_4.html +4 -4
  365. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1CallSite_01_4.html +3 -3
  366. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1CxtProc_01_4.html +1 -1
  367. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1CxtStmt_01_4.html +1 -1
  368. package/SVF-doxygen/html/html/svf-ex_8cpp.html +1 -1
  369. package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +3 -3
  370. package/include/SABER/SaberCondAllocator.h +0 -7
  371. package/include/SVF-FE/BasicTypes.h +7 -0
  372. package/include/Util/BasicTypes.h +52 -17
  373. package/lib/SABER/SaberCondAllocator.cpp +7 -9
  374. package/lib/SVF-FE/LLVMModule.cpp +8 -0
  375. package/lib/SVF-FE/SVFIRBuilder.cpp +2 -2
  376. package/lib/SVF-FE/SymbolTableBuilder.cpp +2 -2
  377. package/package.json +1 -1
@@ -69,11 +69,11 @@ $(function() {
69
69
  <a href="DCHG_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">//===----- DCHG.cpp CHG using DWARF debug info ------------------------//</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">/*</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * DCHG.cpp</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * Created on: Aug 24, 2019</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> * Author: Mohamad Barbar</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="preprocessor">#include &lt;sstream&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</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="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="DCHG_8h.html">SVF-FE/DCHG.h</a>&quot;</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="CPPUtil_8h.html">SVF-FE/CPPUtil.h</a>&quot;</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</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="l00016"></a><span class="lineno"> 16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &quot;llvm/IR/DebugInfo.h&quot;</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;</div><div class="line"><a name="l00022"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a86bf48776ccf53092f4cb742cf95f8eb"> 22</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a86bf48776ccf53092f4cb742cf95f8eb">DCHGraph::handleDIBasicType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *basicType)</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;{</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(basicType);</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;}</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;</div><div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a3ce75cbe92a1fa7d34c6fca2d2ca1b0f"> 27</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a3ce75cbe92a1fa7d34c6fca2d2ca1b0f">DCHGraph::handleDICompositeType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *compositeType)</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;{</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; <span class="keywordflow">switch</span> (compositeType-&gt;getTag())</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; {</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_array_type:</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a>) <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(compositeType);</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(compositeType);</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_class_type:</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_structure_type:</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(compositeType);</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="comment">// If we&#39;re extending, we need to add the first-field relation.</span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</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; <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fields = compositeType-&gt;getElements();</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; <span class="keywordflow">if</span> (!fields.empty())</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; {</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="comment">// We want the first non-static, non-function member; it may not exist.</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *firstMember = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a758f3bee97ed46a719d64a2d4f2bc62d">DINode</a> *<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a> : fields)</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; {</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *fm = SVFUtil::dyn_cast&lt;DIDerivedType&gt;(<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>))</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; {</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <span class="keywordflow">if</span> (fm-&gt;getTag() == dwarf::DW_TAG_member &amp;&amp; !fm-&gt;isStaticMember())</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; {</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; firstMember = fm;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; }</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; }</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; }</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">if</span> (firstMember != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; {</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="comment">// firstMember is a DW_TAG_member, we want the base type beneath it.</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(compositeType, firstMember-&gt;getBaseType(), <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>);</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; }</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; }</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; }</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce">flatten</a>(compositeType);</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(compositeType);</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_union_type:</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(compositeType);</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; <span class="comment">// All fields are first fields.</span></div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a>)</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; {</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fields = compositeType-&gt;getElements();</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a758f3bee97ed46a719d64a2d4f2bc62d">DINode</a> *field : fields)</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; {</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="comment">// fields[0] gives a type which is DW_TAG_member, we want the member&#39;s type (getBaseType).</span></div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *firstMember = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a>&gt;(field);</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; assert(firstMember != <span class="keyword">nullptr</span> &amp;&amp; <span class="stringliteral">&quot;DCHG: expected member type&quot;</span>);</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(compositeType, firstMember-&gt;getBaseType(), <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>);</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"> 84</span>&#160;</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="comment">// flatten(compositeType);</span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(compositeType);</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; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_enumeration_type:</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(compositeType);</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">default</span>:</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;DCHGraph::buildCHG: unexpected CompositeType tag.&quot;</span>);</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;}</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"><a class="line" href="classSVF_1_1DCHGraph.html#a1a4162e68b22d53e9dca73c6780ed3e5"> 97</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a1a4162e68b22d53e9dca73c6780ed3e5">DCHGraph::handleDIDerivedType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *derivedType)</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;{</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keywordflow">switch</span> (derivedType-&gt;getTag())</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; {</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_inheritance:</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; {</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; assert(SVFUtil::isa&lt;DIType&gt;(derivedType-&gt;getScope()) &amp;&amp; <span class="stringliteral">&quot;inheriting from non-type?&quot;</span>);</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge = <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(SVFUtil::dyn_cast&lt;DIType&gt;(derivedType-&gt;getScope()),</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; derivedType-&gt;getBaseType(), <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba9c05805c60fe04033bd9815968059e90">DCHEdge::INHERITANCE</a>);</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="comment">// If the offset does not exist (for primary base), getConstantFieldIdx should return 0.</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; edge-&gt;<a class="code" href="classSVF_1_1DCHEdge.html#a70f757826082c95766c8324c1264e977">setOffset</a>(derivedType-&gt;getOffsetInBits());</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; }</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_member:</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_friend:</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="comment">// Don&#39;t care.</span></div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_typedef:</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a6d97a772afe16c1483e65eea81f82603">handleTypedef</a>(derivedType);</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_pointer_type:</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_ptr_to_member_type:</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_reference_type:</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_rvalue_reference_type:</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a>) <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(derivedType);</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_const_type:</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_atomic_type:</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_volatile_type:</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keywordflow">case</span> dwarf::DW_TAG_restrict_type:</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordflow">default</span>:</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;DCHGraph::buildCHG: unexpected DerivedType tag.&quot;</span>);</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; }</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;}</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a671f379ae54eef247b5e013478eb3f0c"> 133</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a671f379ae54eef247b5e013478eb3f0c">DCHGraph::handleDISubroutineType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a090e0791e8c200104ed3ab6bab157129">DISubroutineType</a> *subroutineType)</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;{</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(subroutineType);</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160;}</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"><a class="line" href="classSVF_1_1DCHGraph.html#a6d97a772afe16c1483e65eea81f82603"> 138</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a6d97a772afe16c1483e65eea81f82603">DCHGraph::handleTypedef</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *typedefType)</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;{</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; assert(typedefType &amp;&amp; typedefType-&gt;getTag() == dwarf::DW_TAG_typedef);</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="comment">// Need to gather them in a set first because we don&#39;t know the base type till</span></div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="comment">// we get to the bottom of the (potentially many) typedefs.</span></div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; std::vector&lt;const DIDerivedType *&gt; typedefs;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="comment">// Check for nullptr because you can typedef void.</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keywordflow">while</span> (typedefType != <span class="keyword">nullptr</span> &amp;&amp; typedefType-&gt;getTag() == dwarf::DW_TAG_typedef)</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; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *typedefDerivedType = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a>&gt;(typedefType);</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="comment">// The typedef itself.</span></div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; typedefs.push_back(typedefDerivedType);</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160;</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="comment">// Next in the typedef line.</span></div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; typedefType = typedefDerivedType-&gt;getBaseType();</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; }</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *baseType = typedefType;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *baseTypeNode = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(baseType);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *tdef : typedefs)</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; <span class="comment">// Base type needs to hold its typedefs.</span></div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; baseTypeNode-&gt;<a class="code" href="classSVF_1_1DCHNode.html#a9d1016e3da3462664198b1125dfc8f6e">addTypedef</a>(tdef);</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; }</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160;}</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;</div><div class="line"><a name="l00166"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a1215db390515a30fbc416fb14d2e863f"> 166</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a1215db390515a30fbc416fb14d2e863f">DCHGraph::buildVTables</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a> &amp;module)</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;{</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SVFModule.html#a5d4f73db8fb5bddb0e7630eda8c6da57">SVFModule::const_global_iterator</a> gvI = module.<a class="code" href="classSVF_1_1SVFModule.html#a4dc32c583d29d74d052eaa5665b0b70e">global_begin</a>(); gvI != module.<a class="code" href="classSVF_1_1SVFModule.html#a8a34164634d6ad9a7b76175907c8c44b">global_end</a>(); ++gvI)</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; <span class="comment">// Though this will return more than GlobalVariables, we only care about GlobalVariables (for the vtbls).</span></div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *gv = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a>&gt;(*gvI);</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keywordflow">if</span> (gv == <span class="keyword">nullptr</span>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="keywordflow">if</span> (gv-&gt;hasMetadata(<a class="code" href="namespaceSVF_1_1cppUtil_1_1ctir.html#aa4630844aa25aa4801659304a2552058">cppUtil::ctir::vtMDName</a>) &amp;&amp; gv-&gt;getNumOperands() &gt; 0)</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; <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a>&gt;(gv-&gt;getMetadata(<a class="code" href="namespaceSVF_1_1cppUtil_1_1ctir.html#aa4630844aa25aa4801659304a2552058">cppUtil::ctir::vtMDName</a>));</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; assert(type &amp;&amp; <span class="stringliteral">&quot;DCHG::buildVTables: bad metadata for ctir.vt&quot;</span>);</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(type);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#ab8a339276172b8aa0fc915e5bde0b3db">setVTable</a>(gv);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#aaa63715e67ade7711a0366eb7559b708">vtblToTypeMap</a>[gv] = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type);</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; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a> *vtbls = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a>&gt;(gv-&gt;getOperand(0));</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; assert(vtbls &amp;&amp; <span class="stringliteral">&quot;unexpected vtable type&quot;</span>);</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> nthVtbl = 0; nthVtbl &lt; vtbls-&gt;getNumOperands(); ++nthVtbl)</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="keyword">const</span> <a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a> *vtbl = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a>&gt;(vtbls-&gt;getOperand(nthVtbl));</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; assert(vtbl &amp;&amp; <span class="stringliteral">&quot;Element of vtbl struct not an array&quot;</span>);</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; std::vector&lt;const Function *&gt; &amp;vfns = node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#a11ad6b4fc518f6307727f6b76f7f6f53">getVfnVector</a>(nthVtbl);</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">// Iterating over the vtbl, we will run into:</span></div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="comment">// 1. i8* null (don&#39;t care for now).</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="comment">// 2. i8* inttoptr ... (don&#39;t care for now).</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="comment">// 3. i8* bitcast ... (we only care when a function pointer is being bitcasted).</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> cN = 0; cN &lt; vtbl-&gt;getNumOperands(); ++cN)</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; <a class="code" href="namespaceSVF.html#a7e230c0cba2e3a7c2e5a5f2ee7d88af9">Constant</a> *c = vtbl-&gt;getOperand(cN);</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;ConstantPointerNull&gt;(c))</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; {</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="comment">// Don&#39;t care for now.</span></div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; }</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *ce = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a>&gt;(c);</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; assert(ce &amp;&amp; <span class="stringliteral">&quot;non-ConstantExpr, non-ConstantPointerNull in vtable?&quot;</span>);</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordflow">if</span> (ce-&gt;getOpcode() == Instruction::BitCast)</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; {</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="comment">// Could be a GlobalAlias which we don&#39;t care about, or a virtual/thunk function.</span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *vfn = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>&gt;(ce-&gt;getOperand(0));</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="keywordflow">if</span> (vfn != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; {</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; vfns.push_back(vfn);</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; }</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; }</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; }</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; }</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;</div><div class="line"><a name="l00220"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a"> 220</a></span>&#160;<span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &amp;<a class="code" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a">DCHGraph::cha</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>, <span class="keywordtype">bool</span> firstField)</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160;{</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; type = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type);</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;const DIType *, NodeBS&gt;</a> &amp;cacheMap = firstField ? <a class="code" href="classSVF_1_1DCHGraph.html#abe8d313b501182ab62f2276a19d670a4">chaFFMap</a> : <a class="code" href="classSVF_1_1DCHGraph.html#ac0d5f1e10f642aac5b64792bf5fcbd9d">chaMap</a>;</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="comment">// Check if we&#39;ve already computed.</span></div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="keywordflow">if</span> (cacheMap.find(type) != cacheMap.end())</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"> 228</span>&#160; <span class="keywordflow">return</span> cacheMap[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</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;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> children;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(type);</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="comment">// Consider oneself a child, otherwise the recursion will just come up with nothing.</span></div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; children.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge : node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>())</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; {</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="comment">// Don&#39;t care about anything but inheritance, first-field, and standard def. edges.</span></div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="keywordflow">if</span> ( edge-&gt;getEdgeKind() != <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba9c05805c60fe04033bd9815968059e90">DCHEdge::INHERITANCE</a></div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; &amp;&amp; edge-&gt;getEdgeKind() != <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a></div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; &amp;&amp; edge-&gt;getEdgeKind() != <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb">DCHEdge::STD_DEF</a>)</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; {</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; }</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="comment">// We only care about first-field edges if the flag is on.</span></div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; <span class="keywordflow">if</span> (!firstField &amp;&amp; edge-&gt;getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>)</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; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; }</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160;</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &amp;cchildren = <a class="code" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a">cha</a>(edge-&gt;getSrcNode()-&gt;getType(), firstField);</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="comment">// Children&#39;s children are my children.</span></div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> cchild : cchildren)</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; {</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; children.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(cchild);</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; }</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; }</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160;</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="comment">// Cache results.</span></div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; cacheMap.insert({<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>, children});</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="comment">// Return the permanent object; we&#39;re returning a reference.</span></div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="keywordflow">return</span> cacheMap[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160;}</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160;</div><div class="line"><a name="l00265"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce"> 265</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce">DCHGraph::flatten</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>)</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160;{</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; type = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>&gt;(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type));</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; assert(type &amp;&amp; <span class="stringliteral">&quot;DCHG::flatten: canon type of struct/class is not struct/class&quot;</span>);</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>.find(type) != <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>.end())</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; {</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <span class="comment">// Already done (necessary because of the recursion).</span></div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; }</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160;</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="comment">// Create empty vector.</span></div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160;</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; assert(type != <span class="keyword">nullptr</span></div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; &amp;&amp; (type-&gt;getTag() == dwarf::DW_TAG_class_type</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; || type-&gt;getTag() == dwarf::DW_TAG_structure_type)</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; &amp;&amp; <span class="stringliteral">&quot;DCHG::flatten: expected a class/struct&quot;</span>);</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">// Sort the fields from getElements. Especially a problem for classes; it&#39;s all jumbled up.</span></div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; std::vector&lt;const DIDerivedType *&gt; fields;</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fieldsDINA = type-&gt;getElements();</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; fieldsDINA.size(); ++i)</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="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *dt = SVFUtil::dyn_cast&lt;DIDerivedType&gt;(fieldsDINA[i]))</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; {</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <span class="comment">// Don&#39;t care about subprograms, only member/inheritance.</span></div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; fields.push_back(dt);</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; }</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; }</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="comment">// TODO: virtual inheritance is not handled at all!</span></div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; std::sort(fields.begin(), fields.end(),</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; [](<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *&amp;<a class="code" href="cJSON_8cpp.html#a8a1a0a26c50cc4becfc754bb68d1dc6b">a</a>, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *&amp;<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>) -&gt; <span class="keywordtype">bool</span></div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; { <span class="keywordflow">return</span> a-&gt;getOffsetInBits() &lt; <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>-&gt;getOffsetInBits(); });</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">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *mt : fields)</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; assert((mt-&gt;getTag() == dwarf::DW_TAG_member || mt-&gt;getTag() == dwarf::DW_TAG_inheritance)</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; &amp;&amp; <span class="stringliteral">&quot;DCHG: expected member/inheritance&quot;</span>);</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="comment">// Either we have a class, struct, array, or something not in need of flattening.</span></div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *fieldType = mt-&gt;getBaseType();</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="keywordflow">if</span> (fieldType-&gt;getTag() == dwarf::DW_TAG_structure_type</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; || fieldType-&gt;getTag() == dwarf::DW_TAG_class_type)</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; {</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce">flatten</a>(SVFUtil::dyn_cast&lt;DICompositeType&gt;(fieldType));</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *ft : <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[fieldType])</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">// ft is already a canonical type because the &quot;root&quot; additions insert</span></div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="comment">// canonical types.</span></div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>].push_back(ft);</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; }</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; }</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fieldType-&gt;getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; {</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *arrayType = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>&gt;(fieldType);</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *baseType = arrayType-&gt;getBaseType();</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *cbt = SVFUtil::dyn_cast&lt;DICompositeType&gt;(baseType))</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; {</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce">flatten</a>(cbt);</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *ft : <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[cbt])</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; <span class="comment">// ft is already a canonical type like above.</span></div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>].push_back(ft);</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; }</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; }</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; {</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>].push_back(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(baseType));</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; }</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; <span class="keywordflow">else</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; {</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>].push_back(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(fieldType));</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"><a class="line" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b"> 342</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b">DCHGraph::isAgg</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160;{</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keywordflow">if</span> (t == <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keywordflow">return</span> t-&gt;getTag() == dwarf::DW_TAG_array_type</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; || t-&gt;getTag() == dwarf::DW_TAG_structure_type</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; || t-&gt;getTag() == dwarf::DW_TAG_class_type;</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;</div><div class="line"><a name="l00350"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b"> 350</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">DCHGraph::gatherAggs</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>)</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"> 352</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>.find(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)) != <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>.end())</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; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; }</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <span class="comment">// Initialise an empty set. We want all aggregates to have a value in</span></div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <span class="comment">// this map, even if empty (e.g. struct has no aggs, only scalars).</span></div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)];</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="keywordflow">if</span> (type-&gt;getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; {</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *bt = type-&gt;getBaseType();</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; bt = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(bt);</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="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b">isAgg</a>(bt))</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="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *cbt = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>&gt;(bt);</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)].insert(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cbt));</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(cbt);</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="comment">// These must be canonical already because of aggs.insert above/below.</span></div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)].insert(</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cbt)].<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(),</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cbt)].<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>());</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; }</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; <span class="keywordflow">else</span></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; <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fields = type-&gt;getElements();</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; fields.size(); ++i)</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; {</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <span class="comment">// Unwrap the member (could be a subprogram, not type, so guard needed).</span></div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *mt = SVFUtil::dyn_cast&lt;DIDerivedType&gt;(fields[i]))</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; {</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *ft = mt-&gt;getBaseType();</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; ft = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(ft);</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b">isAgg</a>(ft))</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; {</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *cft = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>&gt;(ft);</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)].insert(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cft));</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(cft);</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="comment">// These must be canonical already because of aggs.insert above.</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)].insert(</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cft)].<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(),</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cft)].<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>());</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; }</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; }</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; }</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; }</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160;}</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160;</div><div class="line"><a name="l00403"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538"> 403</a></span>&#160;<a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">DCHGraph::getOrCreateNode</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>)</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160;{</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; type = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type);</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160;</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="comment">// Check, does the node for type exist?</span></div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a581ce71cbc7994f71c9a6b9b145d3b9f">diTypeToNodeMap</a>[type] != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; {</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a581ce71cbc7994f71c9a6b9b145d3b9f">diTypeToNodeMap</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; }</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160;</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <span class="keyword">new</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a>(type, <a class="code" href="classSVF_1_1DCHGraph.html#a76fd3154a31584bb64683f2d762cc56c">numTypes</a>++);</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <a class="code" href="classSVF_1_1GenericGraph.html#a0a8831a5429005ff9d71adbd6bf3994f">addGNode</a>(node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), node);</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a581ce71cbc7994f71c9a6b9b145d3b9f">diTypeToNodeMap</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>] = node;</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <span class="comment">// TODO: handle templates.</span></div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160;</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <span class="keywordflow">return</span> node;</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160;}</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160;</div><div class="line"><a name="l00421"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def"> 421</a></span>&#160;<a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">DCHGraph::addEdge</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t2, <a class="code" href="classSVF_1_1GenericEdge.html#a5aceeb48929f54264807b36569019a8a">DCHEdge::GEdgeKind</a> et)</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160;{</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *src = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(t1);</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *dst = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(t2);</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160;</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge = <a class="code" href="classSVF_1_1DCHGraph.html#a74b2e5787f65cf3e3b4a03ebec806b91">hasEdge</a>(t1, t2, et);</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordflow">if</span> (edge == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; {</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <span class="comment">// Create a new edge.</span></div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; edge = <span class="keyword">new</span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a>(src, dst, et);</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; src-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ae74283fbc788665296a69e56f334557b">addOutgoingEdge</a>(edge);</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; dst-&gt;<a class="code" href="classSVF_1_1GenericNode.html#a93d217b0c9fd8008a2989ca2b4f3fbfb">addIncomingEdge</a>(edge);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; }</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160;</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keywordflow">return</span> edge;</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160;}</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160;</div><div class="line"><a name="l00438"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a74b2e5787f65cf3e3b4a03ebec806b91"> 438</a></span>&#160;<a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a74b2e5787f65cf3e3b4a03ebec806b91">DCHGraph::hasEdge</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t2, <a class="code" href="classSVF_1_1GenericEdge.html#a5aceeb48929f54264807b36569019a8a">DCHEdge::GEdgeKind</a> et)</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160;{</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *src = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(t1);</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *dst = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(t2);</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160;</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge : src-&gt;<a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>())</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; {</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = edge-&gt;getDstNode();</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <a class="code" href="classSVF_1_1GenericEdge.html#a5aceeb48929f54264807b36569019a8a">DCHEdge::GEdgeKind</a> edgeType = edge-&gt;getEdgeKind();</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="keywordflow">if</span> (node == dst &amp;&amp; edgeType == et)</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; {</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; assert(SVFUtil::isa&lt;DCHEdge&gt;(edge) &amp;&amp; <span class="stringliteral">&quot;Non-DCHEdge in DCHNode edge set.&quot;</span>);</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; <span class="keywordflow">return</span> edge;</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; }</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; }</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160;</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160;}</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160;</div><div class="line"><a name="l00457"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a710c6b87fd475552eddb425e38de8889"> 457</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a710c6b87fd475552eddb425e38de8889">DCHGraph::buildCHG</a>(<span class="keywordtype">bool</span> extend)</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160;{</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a> = extend;</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <a class="code" href="namespaceSVF.html#a5ae98f122c64b0114df2e5861b341321">DebugInfoFinder</a> finder;</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i &lt; <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;<a class="code" href="classSVF_1_1LLVMModuleSet.html#ae265a7f3cc7367d62013e0f15cf3d233">getModuleNum</a>(); ++i)</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; {</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; finder.processModule(*(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;getModule(i)));</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; }</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160;</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; <span class="comment">// Create the void node regardless of whether it appears.</span></div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(<span class="keyword">nullptr</span>);</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <span class="comment">// Find any char type.</span></div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *charType = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160;<span class="comment"> * We want void at the top, char as a child, and everything is a child of char:</span></div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160;<span class="comment"> * void</span></div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160;<span class="comment"> * |</span></div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160;<span class="comment"> * char</span></div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160;<span class="comment"> * / | \</span></div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160;<span class="comment"> * x y z</span></div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160;</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160;</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> : finder.types())</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> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *basicType = SVFUtil::dyn_cast&lt;DIBasicType&gt;(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>))</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; <span class="keywordflow">if</span> (basicType-&gt;getEncoding() == dwarf::DW_ATE_unsigned_char</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; || basicType-&gt;getEncoding() == dwarf::DW_ATE_signed_char)</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; {</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; charType = <a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>;</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; }</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160;</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a86bf48776ccf53092f4cb742cf95f8eb">handleDIBasicType</a>(basicType);</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; }</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *compositeType = SVFUtil::dyn_cast&lt;DICompositeType&gt;(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>))</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; {</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a3ce75cbe92a1fa7d34c6fca2d2ca1b0f">handleDICompositeType</a>(compositeType);</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; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *derivedType = SVFUtil::dyn_cast&lt;DIDerivedType&gt;(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>))</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; {</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a1a4162e68b22d53e9dca73c6780ed3e5">handleDIDerivedType</a>(derivedType);</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; }</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a090e0791e8c200104ed3ab6bab157129">DISubroutineType</a> *subroutineType = SVFUtil::dyn_cast&lt;DISubroutineType&gt;(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>))</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="classSVF_1_1DCHGraph.html#a671f379ae54eef247b5e013478eb3f0c">handleDISubroutineType</a>(subroutineType);</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; }</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; {</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;DCHGraph::buildCHG: unexpected DIType.&quot;</span>);</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="l00509"></a><span class="lineno"> 509</span>&#160;</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a1215db390515a30fbc416fb14d2e863f">buildVTables</a>(*(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;getSVFModule()));</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160;</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <span class="comment">// Build the void/char/everything else relation.</span></div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a> &amp;&amp; charType != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; {</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; <span class="comment">// void &lt;-- char</span></div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(charType, <span class="keyword">nullptr</span>, <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb">DCHEdge::STD_DEF</a>);</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <span class="comment">// char &lt;-- x, char &lt;-- y, ...</span></div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">iterator</a> nodeI = <a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); nodeI != <a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++nodeI)</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; {</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="comment">// Everything without a parent gets char as a parent.</span></div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="keywordflow">if</span> (nodeI-&gt;second-&gt;getType() != <span class="keyword">nullptr</span></div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; &amp;&amp; nodeI-&gt;second-&gt;getOutEdges().size() == 0)</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; {</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(nodeI-&gt;second-&gt;getType(), charType, <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb">DCHEdge::STD_DEF</a>);</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; }</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; }</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; }</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160;</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#adf6c289ef9f2d0196984dd4024ea4316">Options::PrintDCHG</a>)</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; <a class="code" href="classSVF_1_1DCHGraph.html#a5f08ed4cbba3e4b7a348d5ad77664726">print</a>();</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; }</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160;}</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160;</div><div class="line"><a name="l00535"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#ad398e58286af020fb4dcc03644f2a24f"> 535</a></span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">VFunSet</a> &amp;<a class="code" href="classSVF_1_1DCHGraph.html#ad398e58286af020fb4dcc03644f2a24f">DCHGraph::getCSVFsBasedonCHA</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs)</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160;{</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>.find(cs) != <a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>.end())</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; {</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>[cs];</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; }</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160;</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <a class="code" href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">VFunSet</a> vfns;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a53511f619c06836ee85acf12153810e2">VTableSet</a> &amp;vtbls = <a class="code" href="classSVF_1_1DCHGraph.html#a3383b841bb79ee39cb108b9906fca6a9">getCSVtblsBasedonCHA</a>(cs);</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a6a5d012fda005d45bf3196d1a7d2c6fa">getVFnsFromVtbls</a>(cs, vtbls, vfns);</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="comment">// Cache.</span></div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>.insert({cs, vfns});</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; <span class="comment">// Return cached object, not the stack object.</span></div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>[cs];</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160;}</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160;</div><div class="line"><a name="l00552"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a3383b841bb79ee39cb108b9906fca6a9"> 552</a></span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a53511f619c06836ee85acf12153810e2">VTableSet</a> &amp;<a class="code" href="classSVF_1_1DCHGraph.html#a3383b841bb79ee39cb108b9906fca6a9">DCHGraph::getCSVtblsBasedonCHA</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs)</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160;{</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(<a class="code" href="classSVF_1_1DCHGraph.html#a236d785d728189c2026357ce837fcdc6">getCSStaticType</a>(cs));</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="comment">// Check if we&#39;ve already computed.</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>.find(type) != <a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>.end())</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; {</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; }</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160;</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; <a class="code" href="namespaceSVF.html#a53511f619c06836ee85acf12153810e2">VTableSet</a> vtblSet;</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &amp;children = <a class="code" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a">cha</a>(type, <span class="keyword">false</span>);</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> childId : children)</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; <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *<a class="code" href="cJSON_8cpp.html#ad00efb41ca386db28bacc7aefe79535c">child</a> = <a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(childId);</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a> *vtbl = child-&gt;<a class="code" href="classSVF_1_1DCHNode.html#a1a75ca91148992166d42d245d6c51988">getVTable</a>();</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="comment">// TODO: what if it is null?</span></div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <span class="keywordflow">if</span> (vtbl != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; {</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; vtblSet.insert(vtbl);</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; }</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;</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; <span class="comment">// Cache.</span></div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>.insert({<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>, vtblSet});</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <span class="comment">// Return cached version - not the stack object.</span></div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160;}</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160;</div><div class="line"><a name="l00580"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a6a5d012fda005d45bf3196d1a7d2c6fa"> 580</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a6a5d012fda005d45bf3196d1a7d2c6fa">DCHGraph::getVFnsFromVtbls</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a53511f619c06836ee85acf12153810e2">VTableSet</a> &amp;vtbls, <a class="code" href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">VFunSet</a> &amp;virtualFunctions)</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160;{</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; <span class="keywordtype">size_t</span> idx = <a class="code" href="namespaceSVF_1_1cppUtil.html#ad2a35c1d2e357690e634bb250a68795d">cppUtil::getVCallIdx</a>(cs);</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> funName = <a class="code" href="namespaceSVF_1_1cppUtil.html#a0a67c31dcc44784b09dca54b4b7c624a">cppUtil::getFunNameOfVCallSite</a>(cs);</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a> *vtbl : vtbls)</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; assert(<a class="code" href="classSVF_1_1DCHGraph.html#aaa63715e67ade7711a0366eb7559b708">vtblToTypeMap</a>.find(vtbl) != <a class="code" href="classSVF_1_1DCHGraph.html#aaa63715e67ade7711a0366eb7559b708">vtblToTypeMap</a>.end() &amp;&amp; <span class="stringliteral">&quot;floating vtbl&quot;</span>);</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <a class="code" href="classSVF_1_1DCHGraph.html#aaa63715e67ade7711a0366eb7559b708">vtblToTypeMap</a>[vtbl];</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; assert(<a class="code" href="classSVF_1_1DCHGraph.html#a58341e23c1dc2b3e7fce190ed16a8a25">hasNode</a>(type) &amp;&amp; <span class="stringliteral">&quot;trying to get vtbl for type not in graph&quot;</span>);</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a96c68bbb5ee5e939158ce0b67da2c61d">getNode</a>(type);</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; std::vector&lt;std::vector&lt;const Function *&gt;&gt; allVfns = node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#a0669b995c4fe72f206154f5cf6889fe8">getVfnVectors</a>();</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="keywordflow">for</span> (std::vector&lt;const Function *&gt; vfnV : allVfns)</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; {</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; <span class="comment">// We only care about any virtual function corresponding to idx.</span></div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="keywordflow">if</span> (idx &gt;= vfnV.size())</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; {</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; }</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160;</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *callee = vfnV[idx];</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="comment">// Practically a copy of that in lib/MemoryModel/CHA.cpp</span></div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; <span class="keywordflow">if</span> (cs.<a class="code" href="classSVF_1_1CallSite.html#a145676880fce313b4634d14118476c27">arg_size</a>() == callee-&gt;arg_size() || (cs.<a class="code" href="classSVF_1_1CallSite.html#ad0040f4b7953b509059223d1d52c203f">getFunctionType</a>()-&gt;isVarArg() &amp;&amp; callee-&gt;isVarArg()))</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; {</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html">cppUtil::DemangledName</a> dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">cppUtil::demangle</a>(callee-&gt;getName().str());</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> calleeName = dname.<a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html#a1dd17b240663bc9412adefde82385e02">funcName</a>;</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160;</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160;<span class="comment"> * The compiler will add some special suffix (e.g.,</span></div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160;<span class="comment"> * &quot;[abi:cxx11]&quot;) to the end of some virtual function:</span></div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160;<span class="comment"> * In dealII</span></div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160;<span class="comment"> * function: FE_Q&lt;3&gt;::get_name</span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160;<span class="comment"> * will be mangled as: _ZNK4FE_QILi3EE8get_nameB5cxx11Ev</span></div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160;<span class="comment"> * after demangling: FE_Q&lt;3&gt;::get_name[abi:cxx11]</span></div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160;<span class="comment"> * The special suffix (&quot;[abi:cxx11]&quot;) needs to be removed</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> suffix(<span class="stringliteral">&quot;[abi:cxx11]&quot;</span>);</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; <span class="keywordtype">size_t</span> suffixPos = calleeName.rfind(suffix);</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <span class="keywordflow">if</span> (suffixPos != std::string::npos)</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; calleeName.erase(suffixPos, suffix.size());</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; }</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160;</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160;<span class="comment"> * if we can&#39;t get the function name of a virtual callsite, all virtual</span></div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160;<span class="comment"> * functions corresponding to idx will be valid</span></div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <span class="keywordflow">if</span> (funName.size() == 0)</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; {</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1SVFUtil.html#aa09c2b313ff1c1abcc1e5cb3f9ef46a5">SVFUtil::getFunction</a>(callee-&gt;getName().str()));</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; }</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (funName[0] == <span class="charliteral">&#39;~&#39;</span>)</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="comment">/*</span></div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160;<span class="comment"> * if the virtual callsite is calling a destructor, then all</span></div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160;<span class="comment"> * destructors in the ch will be valid</span></div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160;<span class="comment"> * class A { virtual ~A(){} };</span></div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160;<span class="comment"> * class B: public A { virtual ~B(){} };</span></div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160;<span class="comment"> * int main() {</span></div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160;<span class="comment"> * A *a = new B;</span></div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160;<span class="comment"> * delete a; /// the function name of this virtual callsite is ~A()</span></div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160;<span class="comment"> * }</span></div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; <span class="keywordflow">if</span> (calleeName[0] == <span class="charliteral">&#39;~&#39;</span>)</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; {</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1SVFUtil.html#aa09c2b313ff1c1abcc1e5cb3f9ef46a5">SVFUtil::getFunction</a>(callee-&gt;getName().str()));</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; }</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; }</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; {</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160;<span class="comment"> * For other virtual function calls, the function name of the callsite</span></div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160;<span class="comment"> * and the function name of the target callee should match exactly</span></div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <span class="keywordflow">if</span> (funName.compare(calleeName) == 0)</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; {</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1SVFUtil.html#aa09c2b313ff1c1abcc1e5cb3f9ef46a5">SVFUtil::getFunction</a>(callee-&gt;getName().str()));</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; }</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; }</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; }</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; }</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; }</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160;}</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160;</div><div class="line"><a name="l00663"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#ab33f9af6ad22eb99dd0d9950fb0e50e6"> 663</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#ab33f9af6ad22eb99dd0d9950fb0e50e6">DCHGraph::isBase</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a8a1a0a26c50cc4becfc754bb68d1dc6b">a</a>, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>, <span class="keywordtype">bool</span> firstField)</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160;{</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; a = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(a);</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; b = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(b);</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; assert(<a class="code" href="classSVF_1_1DCHGraph.html#a58341e23c1dc2b3e7fce190ed16a8a25">hasNode</a>(a) &amp;&amp; <a class="code" href="classSVF_1_1DCHGraph.html#a58341e23c1dc2b3e7fce190ed16a8a25">hasNode</a>(b) &amp;&amp; <span class="stringliteral">&quot;DCHG: isBase query for non-existent node!&quot;</span>);</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *bNode = <a class="code" href="classSVF_1_1DCHGraph.html#a96c68bbb5ee5e939158ce0b67da2c61d">getNode</a>(b);</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160;</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &amp;aChildren = <a class="code" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a">cha</a>(a, firstField);</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; <span class="keywordflow">return</span> aChildren.<a class="code" href="classSVF_1_1SparseBitVector.html#a112f2ede1240c95f9fe810f2882fab80">test</a>(bNode-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160;}</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160;</div><div class="line"><a name="l00674"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#af0534356b4a8c68507e1237f1d7a8c11"> 674</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#af0534356b4a8c68507e1237f1d7a8c11">DCHGraph::isFieldOf</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *f, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>)</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160;{</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; assert(f &amp;&amp; b &amp;&amp; <span class="stringliteral">&quot;DCHG::isFieldOf: given nullptr!&quot;</span>);</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160;</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; f = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(f);</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160; b = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(b);</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; <span class="keywordflow">if</span> (f == b) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160;</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; <span class="keywordflow">if</span> (b-&gt;getTag() == dwarf::DW_TAG_array_type || b-&gt;getTag() == dwarf::DW_TAG_pointer_type)</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; {</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *baseType = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *arrayType = SVFUtil::dyn_cast&lt;DICompositeType&gt;(b))</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; {</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; baseType = arrayType-&gt;getBaseType();</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; }</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *ptrType = SVFUtil::dyn_cast&lt;DIDerivedType&gt;(b))</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; {</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; baseType = ptrType-&gt;getBaseType();</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; }</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; assert(baseType &amp;&amp; <span class="stringliteral">&quot;DCHG::isFieldOf: baseType is neither DIComposite nor DIDerived!&quot;</span>);</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160;</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; baseType = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(baseType);</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; <span class="keywordflow">return</span> f == baseType || (baseType != <span class="keyword">nullptr</span> &amp;&amp; <a class="code" href="classSVF_1_1DCHGraph.html#af0534356b4a8c68507e1237f1d7a8c11">isFieldOf</a>(f, baseType));</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; }</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (b-&gt;getTag() == dwarf::DW_TAG_class_type</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; || b-&gt;getTag() == dwarf::DW_TAG_structure_type)</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; {</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; <span class="keyword">const</span> std::vector&lt;const DIType *&gt; &amp;fields = <a class="code" href="classSVF_1_1DCHGraph.html#ae9a0007299178912e2568dc7158d6824">getFieldTypes</a>(b);</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; <span class="keywordflow">return</span> std::find(fields.begin(), fields.end(), f) != fields.end();</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; }</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; {</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; }</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160;}</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160;</div><div class="line"><a name="l00710"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c"> 710</a></span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">DCHGraph::getCanonicalType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160;{</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; <span class="comment">// We want stripped types to be canonical.</span></div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *unstrippedT = t;</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; t = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(t);</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160;</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; <span class="comment">// Is there a mapping for the unstripped type? Yes - return it.</span></div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.find(unstrippedT) != <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.end())</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; {</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[unstrippedT];</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; }</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160;</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; <span class="comment">// There is no mapping for unstripped type (^), is there one for the stripped</span></div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; <span class="comment">// type? Yes - map the unstripped type to the same thing.</span></div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; <span class="keywordflow">if</span> (unstrippedT != t)</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; {</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.find(t) != <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.end())</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; {</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[unstrippedT] = <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[t];</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[unstrippedT];</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; }</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; }</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160;</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; <span class="comment">// Canonical type for t is not cached, find one for it.</span></div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *canonType : <a class="code" href="classSVF_1_1DCHGraph.html#a10225f56b21eb7f0870fdc433de3c393">canonicalTypes</a>)</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; {</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#acb76ab20da1bfbec00f63d08e48cbddd">teq</a>(t, canonType))</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; {</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160; <span class="comment">// Found a canonical type.</span></div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[t] = canonType;</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[t];</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; }</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; }</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160;</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; <span class="comment">// No canonical type found, so t will be a canonical type.</span></div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; canonicalTypes.insert(t);</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.insert({t, t});</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160;</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[t];</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160;}</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160;</div><div class="line"><a name="l00751"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4"> 751</a></span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">DCHGraph::stripQualifiers</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160;{</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; <span class="keywordflow">while</span> (<span class="keyword">true</span>)</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; {</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; <span class="comment">// nullptr means void.</span></div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; <span class="keywordflow">if</span> (t == <span class="keyword">nullptr</span></div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; || SVFUtil::isa&lt;DIBasicType&gt;(t)</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160; || SVFUtil::isa&lt;DISubroutineType&gt;(t))</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; {</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; }</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160;</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160; <span class="keywordtype">unsigned</span> tag = t-&gt;getTag();</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; <span class="comment">// Verbose for clarity.</span></div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; <span class="keywordflow">if</span> ( tag == dwarf::DW_TAG_const_type</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; || tag == dwarf::DW_TAG_atomic_type</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; || tag == dwarf::DW_TAG_volatile_type</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; || tag == dwarf::DW_TAG_restrict_type</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; || tag == dwarf::DW_TAG_typedef)</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; {</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; <span class="comment">// Qualifier - get underlying type.</span></div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *dt = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a>&gt;(t);</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; assert(t &amp;&amp; <span class="stringliteral">&quot;DCHG: expected DerivedType&quot;</span>);</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160; t = dt-&gt;getBaseType();</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160; }</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( tag == dwarf::DW_TAG_array_type</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; || tag == dwarf::DW_TAG_class_type</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160; || tag == dwarf::DW_TAG_structure_type</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; || tag == dwarf::DW_TAG_union_type</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160; || tag == dwarf::DW_TAG_enumeration_type</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160; || tag == dwarf::DW_TAG_member</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; || tag == dwarf::DW_TAG_pointer_type</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; || tag == dwarf::DW_TAG_ptr_to_member_type</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; || tag == dwarf::DW_TAG_reference_type</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; || tag == dwarf::DW_TAG_rvalue_reference_type)</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; {</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; <span class="comment">// Hit a non-qualifier.</span></div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160; }</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( tag == dwarf::DW_TAG_inheritance</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160; || tag == dwarf::DW_TAG_friend)</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160; {</div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;DCHG: unexpected tag when stripping qualifiers&quot;</span>);</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160; }</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160; {</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;DCHG: unhandled tag when stripping qualifiers&quot;</span>);</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; }</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; }</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160;</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; <span class="keywordflow">return</span> t;</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160;}</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160;</div><div class="line"><a name="l00804"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a6c276e661e5e63c1c84387f84c8a62e4"> 804</a></span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a6c276e661e5e63c1c84387f84c8a62e4">DCHGraph::stripArray</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160;{</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; t = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(t);</div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160; <span class="keywordflow">if</span> (t-&gt;getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; {</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *at = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>&gt;(t);</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a6c276e661e5e63c1c84387f84c8a62e4">stripArray</a>(at-&gt;getBaseType());</div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; }</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160;</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; <span class="keywordflow">return</span> t;</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160;}</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160;</div><div class="line"><a name="l00816"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#acb76ab20da1bfbec00f63d08e48cbddd"> 816</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#acb76ab20da1bfbec00f63d08e48cbddd">DCHGraph::teq</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t2)</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160;{</div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; t1 = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(t1);</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; t2 = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(t2);</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160;</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; <span class="keywordflow">if</span> (t1 == t2)</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; {</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; <span class="comment">// Trivial case. Handles SubRoutineTypes too.</span></div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; }</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160;</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; <span class="keywordflow">if</span> (t1 == <span class="keyword">nullptr</span> || t2 == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; {</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; <span class="comment">// Since t1 != t2 and one of them is null, it is</span></div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; <span class="comment">// impossible for them to be equal.</span></div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; }</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160;</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; <span class="comment">// Check if we need base type comparisons.</span></div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;DIBasicType&gt;(t1) &amp;&amp; SVFUtil::isa&lt;DIBasicType&gt;(t2))</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160; {</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *b1 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a>&gt;(t1);</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *b2 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a>&gt;(t2);</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160;</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; <span class="keywordtype">unsigned</span> enc1 = b1-&gt;getEncoding();</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; <span class="keywordtype">unsigned</span> enc2 = b2-&gt;getEncoding();</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; <span class="keywordtype">bool</span> okayEnc = ((enc1 == dwarf::DW_ATE_signed || enc1 == dwarf::DW_ATE_unsigned || enc1 == dwarf::DW_ATE_boolean)</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; &amp;&amp; (enc2 == dwarf::DW_ATE_signed || enc2 == dwarf::DW_ATE_unsigned || enc2 == dwarf::DW_ATE_boolean))</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160; ||</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; (enc1 == dwarf::DW_ATE_float &amp;&amp; enc2 == dwarf::DW_ATE_float)</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; ||</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; ((enc1 == dwarf::DW_ATE_signed_char || enc1 == dwarf::DW_ATE_unsigned_char)</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; &amp;&amp;</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; (enc2 == dwarf::DW_ATE_signed_char || enc2 == dwarf::DW_ATE_unsigned_char));</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160;</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; <span class="keywordflow">if</span> (!okayEnc) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; <span class="comment">// Now we have split integers, floats, and chars, ignoring signedness.</span></div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160;</div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; <span class="keywordflow">return</span> t1-&gt;getSizeInBits() == t2-&gt;getSizeInBits()</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; &amp;&amp; t1-&gt;getAlignInBits() == t2-&gt;getAlignInBits();</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; }</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160;</div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; <span class="comment">// Check, do we need to compare base types?</span></div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; <span class="comment">// This makes pointers, references, and arrays equivalent.</span></div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; <span class="comment">// Will handle member types.</span></div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; <span class="keywordflow">if</span> ((SVFUtil::isa&lt;DIDerivedType&gt;(t1) || t1-&gt;getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; &amp;&amp; (SVFUtil::isa&lt;DIDerivedType&gt;(t2) || t2-&gt;getTag() == dwarf::DW_TAG_array_type))</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; {</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *base1, *base2;</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160;</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; <span class="comment">// Set base1.</span></div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *d1 = SVFUtil::dyn_cast&lt;DIDerivedType&gt;(t1))</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; {</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; base1 = d1-&gt;getBaseType();</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; }</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; {</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *c1 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>&gt;(t1);</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; assert(c1 &amp;&amp; <span class="stringliteral">&quot;teq: bad cast for array type&quot;</span>);</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; base1 = c1-&gt;getBaseType();</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; }</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160;</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; <span class="comment">// Set base2.</span></div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *d2 = SVFUtil::dyn_cast&lt;DIDerivedType&gt;(t2))</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; {</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; base2 = d2-&gt;getBaseType();</div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; }</div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; {</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *c2 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>&gt;(t2);</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; assert(c2 &amp;&amp; <span class="stringliteral">&quot;teq: bad cast for array type&quot;</span>);</div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; base2 = c2-&gt;getBaseType();</div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; }</div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160;</div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; <span class="comment">// For ptr-to-member, there is some imprecision (but soundness) in</span></div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; <span class="comment">// that we don&#39;t check the class type.</span></div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#acb76ab20da1bfbec00f63d08e48cbddd">teq</a>(base1, base2);</div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; }</div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160;</div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;DICompositeType&gt;(t1) &amp;&amp; SVFUtil::isa&lt;DICompositeType&gt;(t2))</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160; {</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *ct1 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>&gt;(t1);</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *ct2 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>&gt;(t2);</div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160;</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; <span class="keywordflow">if</span> (ct1-&gt;getTag() != ct2-&gt;getTag()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160;</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160; <span class="comment">// Treat all enums the same.</span></div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; <span class="keywordflow">if</span> (ct1-&gt;getTag() == dwarf::DW_TAG_enumeration_type)</div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; {</div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160; }</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160;</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; <span class="comment">// C++ classes? Check mangled name.</span></div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; <span class="keywordflow">if</span> (ct1-&gt;getTag() == dwarf::DW_TAG_class_type)</div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; {</div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; <span class="keywordflow">return</span> ct1-&gt;getIdentifier() == ct2-&gt;getIdentifier();</div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; }</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160;</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; <span class="comment">// Either union or struct, simply test all fields are equal.</span></div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; <span class="comment">// Seems like it is enough to check it was defined in the same place.</span></div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; <span class="comment">// The elements sometimes differ but are referring to the same fields.</span></div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; <span class="keywordflow">return</span> ct1-&gt;getName() == ct2-&gt;getName()</div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; &amp;&amp; ct1-&gt;getFile() == ct2-&gt;getFile()</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; &amp;&amp; ct1-&gt;getLine() == ct2-&gt;getLine();</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; }</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160;</div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; <span class="comment">// They were not equal base types (discounting signedness), nor were they</span></div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; <span class="comment">// &quot;equal&quot; pointers/references/arrays, nor were they the structurally equivalent,</span></div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; <span class="comment">// nor were they completely equal.</span></div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160;}</div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160;</div><div class="line"><a name="l00928"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a2b2dbc52089696854a8339f2e83fc333"> 928</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#a2b2dbc52089696854a8339f2e83fc333">DCHGraph::isFirstField</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *f, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>)</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160;{</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; <span class="comment">// TODO: some improvements.</span></div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; <span class="comment">// - cha should be changed to accept which edge types to use,</span></div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; <span class="comment">// then we can call cha(..., DCHEdge::FIRST_FIELD).</span></div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160; <span class="comment">// - If not ^, this could benefit from caching.</span></div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160; f = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(f);</div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160; b = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(b);</div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160;</div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160; <span class="keywordflow">if</span> (f == b) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160;</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a96c68bbb5ee5e939158ce0b67da2c61d">getNode</a>(f);</div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; assert(node &amp;&amp; <span class="stringliteral">&quot;DCHG::isFirstField: node not found&quot;</span>);</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; <span class="comment">// Consider oneself a child, otherwise the recursion will just come up with nothing.</span></div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge : node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>())</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; {</div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; <span class="comment">// Only care about first-field edges.</span></div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; <span class="keywordflow">if</span> (edge-&gt;getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>)</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; {</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; <span class="keywordflow">if</span> (edge-&gt;getSrcNode()-&gt;getType() == <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a2b2dbc52089696854a8339f2e83fc333">isFirstField</a>(edge-&gt;getSrcNode()-&gt;getType(), <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>)) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; }</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; }</div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160;</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160;}</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160;</div><div class="line"><a name="l00955"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b"> 955</a></span>&#160;<a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">DCHGraph::diTypeToStr</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160;{</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; std::stringstream ss;</div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160;</div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160; <span class="keywordflow">if</span> (t == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; {</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;void&quot;</span>;</div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; }</div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160;</div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *bt = SVFUtil::dyn_cast&lt;DIBasicType&gt;(t))</div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; {</div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; ss &lt;&lt; bt-&gt;getName().str();</div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160; }</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *dt = SVFUtil::dyn_cast&lt;DIDerivedType&gt;(t))</div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; {</div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; <span class="keywordflow">if</span> (dt-&gt;getName() == <span class="stringliteral">&quot;__vtbl_ptr_type&quot;</span>)</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; {</div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;(vtbl * =) __vtbl_ptr_type&quot;</span>;</div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; }</div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt-&gt;getTag() == dwarf::DW_TAG_const_type)</div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160; {</div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;const &quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt-&gt;getBaseType());</div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160; }</div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt-&gt;getTag() == dwarf::DW_TAG_volatile_type)</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; {</div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;volatile &quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt-&gt;getBaseType());</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; }</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt-&gt;getTag() == dwarf::DW_TAG_restrict_type)</div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160; {</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;restrict &quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt-&gt;getBaseType());</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; }</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt-&gt;getTag() == dwarf::DW_TAG_atomic_type)</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160; {</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;atomic &quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt-&gt;getBaseType());</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160; }</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt-&gt;getTag() == dwarf::DW_TAG_pointer_type)</div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; {</div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; ss &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt-&gt;getBaseType()) &lt;&lt; <span class="stringliteral">&quot; *&quot;</span>;</div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160; }</div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt-&gt;getTag() == dwarf::DW_TAG_ptr_to_member_type)</div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span>&#160; {</div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160; ss &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt-&gt;getBaseType())</div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160; &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(SVFUtil::dyn_cast&lt;DIType&gt;(dt-&gt;getExtraData())) &lt;&lt; <span class="stringliteral">&quot;::*&quot;</span>;</div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; }</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt-&gt;getTag() == dwarf::DW_TAG_reference_type)</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160; {</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160; ss &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt-&gt;getBaseType()) &lt;&lt; <span class="stringliteral">&quot; &amp;&quot;</span>;</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; }</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt-&gt;getTag() == dwarf::DW_TAG_rvalue_reference_type)</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; {</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160; ss &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt-&gt;getBaseType()) &lt;&lt; <span class="stringliteral">&quot; &amp;&amp;&quot;</span>;</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; }</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt-&gt;getTag() == dwarf::DW_TAG_typedef)</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; {</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; ss &lt;&lt; dt-&gt;getName().str() &lt;&lt; <span class="stringliteral">&quot;-&gt;&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt-&gt;getBaseType());</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; }</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; }</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *ct = SVFUtil::dyn_cast&lt;DICompositeType&gt;(t))</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; {</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; <span class="keywordflow">if</span> (ct-&gt;getTag() == dwarf::DW_TAG_class_type</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; || ct-&gt;getTag() == dwarf::DW_TAG_structure_type</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; || ct-&gt;getTag() == dwarf::DW_TAG_union_type)</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; {</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160;</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; <span class="keywordflow">if</span> (ct-&gt;getTag() == dwarf::DW_TAG_class_type)</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; {</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;class&quot;</span>;</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; }</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct-&gt;getTag() == dwarf::DW_TAG_structure_type)</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; {</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;struct&quot;</span>;</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; }</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct-&gt;getTag() == dwarf::DW_TAG_union_type)</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; {</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;union&quot;</span>;</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; }</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;.&quot;</span>;</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; <span class="keywordflow">if</span> (ct-&gt;getName() != <span class="stringliteral">&quot;&quot;</span>)</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160; {</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160; ss &lt;&lt; ct-&gt;getName().str();</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; }</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; {</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; <span class="comment">// Iterate over the element types.</span></div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;{ &quot;</span>;</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fields = ct-&gt;getElements();</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; fields.size(); ++i)</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160; {</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; <span class="comment">// fields[i] gives a type which is DW_TAG_member, we want the member&#39;s type (getBaseType).</span></div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; <span class="comment">// It can also give a Subprogram type if the class just had non-virtual functions.</span></div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a89c7208bfc0b57873dfa574f52050295">DISubprogram</a> *sp = SVFUtil::dyn_cast&lt;DISubprogram&gt;(fields[i]))</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; {</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; ss &lt;&lt; sp-&gt;getName().str();</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160; }</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *mt = SVFUtil::dyn_cast&lt;DIDerivedType&gt;(fields[i]))</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; {</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; assert(mt-&gt;getTag() == dwarf::DW_TAG_member &amp;&amp; <span class="stringliteral">&quot;DCHG: expected member&quot;</span>);</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; ss &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(mt-&gt;getBaseType());</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; }</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; <span class="keywordflow">if</span> (i != fields.size() - 1)</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; {</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; }</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; }</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot; }&quot;</span>;</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; }</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; }</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct-&gt;getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160; {</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160; ss &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(ct-&gt;getBaseType());</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160; <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> sizes = ct-&gt;getElements();</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; sizes.size(); ++i)</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; {</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160; <a class="code" href="namespaceSVF.html#a99bc1228f07429855c81a720be862dc6">DISubrange</a> *sr = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="namespaceSVF.html#a99bc1228f07429855c81a720be862dc6">DISubrange</a>&gt;(sizes[0]);</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160; assert(sr != <span class="keyword">nullptr</span> &amp;&amp; <span class="stringliteral">&quot;DCHG: non-subrange as array element?&quot;</span>);</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; int64_t <a class="code" href="cJSON_8h.html#ad43c3812e6d13e0518d9f8b8f463ffcf">count</a> = -1;</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a> *ci = sr-&gt;getCount().dyn_cast&lt;<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a> *&gt;())</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160; {</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160; count = ci-&gt;getSExtValue();</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160; }</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; count &lt;&lt; <span class="stringliteral">&quot;]&quot;</span>;</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160; }</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160; }</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct-&gt;getTag() == dwarf::DW_TAG_enumeration_type)</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160; {</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;enum &quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(ct-&gt;getBaseType());</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; }</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct-&gt;getTag() == dwarf::DW_TAG_union_type)</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; {</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160; }</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; }</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a090e0791e8c200104ed3ab6bab157129">DISubroutineType</a> *st = SVFUtil::dyn_cast&lt;DISubroutineType&gt;(t))</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; {</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160; <a class="code" href="namespaceSVF.html#a9d3ee421789884473bfacfaa9ec007cc">DITypeRefArray</a> types = st-&gt;getTypeArray();</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; <span class="comment">// Must have one element at least (the first type).</span></div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160; ss &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(types[0]) &lt;&lt; <span class="stringliteral">&quot; fn(&quot;</span>;</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; <span class="keywordflow">if</span> (types.size() == 1)</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160; {</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;void)&quot;</span>;</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; }</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160; {</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 1; i &lt; types.size(); ++i)</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160; {</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; ss &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(types[i]);</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; <span class="keywordflow">if</span> (i + 1 != types.size())</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; {</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; <span class="comment">// There&#39;s another type.</span></div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160; }</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160; }</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160; ss &lt;&lt; <span class="stringliteral">&quot;)&quot;</span>;</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160; }</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160; ss &lt;&lt; st-&gt;getName().str();</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160; }</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160; <span class="keywordflow">return</span> ss.str();</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;}</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;</div><div class="line"><a name="l01123"></a><span class="lineno"><a class="line" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269"> 1123</a></span>&#160;<span class="keyword">static</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(<span class="keywordtype">size_t</span> <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>)</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;{</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160; <span class="keywordflow">return</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>(n, <span class="charliteral">&#39; &#39;</span>);</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;}</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;</div><div class="line"><a name="l01128"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a5f08ed4cbba3e4b7a348d5ad77664726"> 1128</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a5f08ed4cbba3e4b7a348d5ad77664726">DCHGraph::print</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;{</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> line = <span class="stringliteral">&quot;-------------------------------------\n&quot;</span>;</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> thickLine = <span class="stringliteral">&quot;=====================================\n&quot;</span>;</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> singleIndent = 2;</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; <span class="keywordtype">size_t</span> currIndent = 0;</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; thickLine;</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160; <span class="keywordtype">unsigned</span> numStructs = 0;</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160; <span class="keywordtype">unsigned</span> largestStruct = 0;</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; <a class="code" href="namespaceSVF.html#a212231734fa43d5c7414137deaac7df3">NodeSet</a> nodes;</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">DCHGraph::const_iterator</a> it = <a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; {</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160; nodes.insert(it-&gt;first);</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160; }</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <span class="keywordtype">id</span> : nodes)</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; {</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160; <span class="keywordflow">if</span> (*nodes.begin() != id)</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160; {</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; line;</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160; }</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(<span class="keywordtype">id</span>);</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160;</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) &lt;&lt; <span class="keywordtype">id</span> &lt;&lt; <span class="stringliteral">&quot;: &quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()) &lt;&lt; <span class="stringliteral">&quot; [&quot;</span> &lt;&lt; node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>() &lt;&lt; <span class="stringliteral">&quot;]&quot;</span> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160; <span class="keywordflow">if</span> (node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>() != <span class="keyword">nullptr</span></div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160; &amp;&amp; (node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()-&gt;getTag() == dwarf::DW_TAG_class_type</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160; || node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()-&gt;getTag() == dwarf::DW_TAG_structure_type))</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160; {</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160; ++numStructs;</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160; <span class="keywordtype">unsigned</span> numFields = <a class="code" href="classSVF_1_1DCHGraph.html#ae9a0007299178912e2568dc7158d6824">getFieldTypes</a>(node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()).size();</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160; largestStruct = numFields &gt; largestStruct ? numFields : largestStruct;</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160; }</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160; currIndent += singleIndent;</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) &lt;&lt; <span class="stringliteral">&quot;Virtual functions\n&quot;</span>;</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160; currIndent += singleIndent;</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160; <span class="keyword">const</span> std::vector&lt;std::vector&lt;const Function *&gt;&gt; &amp;vfnVectors = node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#a0669b995c4fe72f206154f5cf6889fe8">getVfnVectors</a>();</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; vfnVectors.size(); ++i)</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160; {</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) &lt;&lt; <span class="stringliteral">&quot;[ vtable #&quot;</span> &lt;&lt; i &lt;&lt; <span class="stringliteral">&quot; ]\n&quot;</span>;</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160; currIndent += singleIndent;</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> j = 0; j &lt; vfnVectors[i].size(); ++j)</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160; {</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160; <span class="keyword">struct </span><a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html">cppUtil::DemangledName</a> dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">cppUtil::demangle</a>(vfnVectors[i][j]-&gt;getName().str());</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) &lt;&lt; <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; j &lt;&lt; <span class="stringliteral">&quot;] &quot;</span></div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; &lt;&lt; dname.<a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html#a5cd207bce618521166e6fa235014b297">className</a> &lt;&lt; <span class="stringliteral">&quot;::&quot;</span> &lt;&lt; dname.<a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html#a1dd17b240663bc9412adefde82385e02">funcName</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160; }</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160; currIndent -= singleIndent;</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160; }</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160; <span class="comment">// Nothing was printed.</span></div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160; <span class="keywordflow">if</span> (vfnVectors.size() == 0)</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160; {</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) &lt;&lt; <span class="stringliteral">&quot;(none)\n&quot;</span>;</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160; }</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160; currIndent -= singleIndent;</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) &lt;&lt; <span class="stringliteral">&quot;Bases\n&quot;</span>;</div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160; currIndent += singleIndent;</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge : node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>())</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160; {</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> arrow;</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160; <span class="keywordflow">if</span> (edge-&gt;getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba9c05805c60fe04033bd9815968059e90">DCHEdge::INHERITANCE</a>)</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160; {</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160; arrow = <span class="stringliteral">&quot;--inheritance--&gt;&quot;</span>;</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160; }</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (edge-&gt;getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>)</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160; {</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160; arrow = <span class="stringliteral">&quot;--first-field--&gt;&quot;</span>;</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160; }</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (edge-&gt;getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3e807b4caeb170c5cd1e855ac1a92d77">DCHEdge::INSTANCE</a>)</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160; {</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160; arrow = <span class="stringliteral">&quot;---instance----&gt;&quot;</span>;</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160; }</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (edge-&gt;getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb">DCHEdge::STD_DEF</a>)</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160; {</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160; arrow = <span class="stringliteral">&quot;---standard----&gt;&quot;</span>;</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160; }</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160; {</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160; arrow = <span class="stringliteral">&quot;----unknown----&gt;&quot;</span>;</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160; }</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) &lt;&lt; <span class="stringliteral">&quot;[ &quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()) &lt;&lt; <span class="stringliteral">&quot; ] &quot;</span></div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160; &lt;&lt; arrow &lt;&lt; <span class="stringliteral">&quot; [ &quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(edge-&gt;getDstNode()-&gt;getType()) &lt;&lt; <span class="stringliteral">&quot; ]\n&quot;</span>;</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160; }</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160; <span class="keywordflow">if</span> (node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>().size() == 0)</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160; {</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) &lt;&lt; <span class="stringliteral">&quot;(none)\n&quot;</span>;</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160; }</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160;</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160; currIndent -= singleIndent;</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) &lt;&lt; <span class="stringliteral">&quot;Typedefs\n&quot;</span>;</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;</div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160; currIndent += singleIndent;</div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160;</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const DIDerivedType *&gt;</a> &amp;typedefs = node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#ac77edc44c3c5acc185c27c018837d066">getTypedefs</a>();</div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *tdef : typedefs)</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160; {</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> typedefName = <span class="stringliteral">&quot;void&quot;</span>;</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160; <span class="keywordflow">if</span> (tdef != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160; {</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160; typedefName = tdef-&gt;getName().str();</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160; }</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160;</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) &lt;&lt; typedefName &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160; }</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160;</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160; <span class="keywordflow">if</span> (typedefs.size() == 0)</div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160; {</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) &lt;&lt; <span class="stringliteral">&quot;(none)\n&quot;</span>;</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160; }</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160; currIndent -= singleIndent;</div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160; currIndent -= singleIndent;</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160; }</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; thickLine;</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;Other stats\n&quot;</span>;</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; line;</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;# Canonical types : &quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1DCHGraph.html#a10225f56b21eb7f0870fdc433de3c393">canonicalTypes</a>.size() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;# structs : &quot;</span> &lt;&lt; numStructs &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;Largest struct : &quot;</span> &lt;&lt; largestStruct &lt;&lt; <span class="stringliteral">&quot; fields\n&quot;</span>;</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; thickLine;</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>().flush();</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;}</div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph&lt; DCHNode, DCHEdge &gt;::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
70
70
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a2dc488345cc3a5f37079952f638d8c2b"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">SVF::DCHGraph::diTypeToStr</a></div><div class="ttdeci">static std::string diTypeToStr(const DIType *)</div><div class="ttdoc">Returns a human-readable version of the DIType. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00955">DCHG.cpp:955</a></div></div>
71
71
  <div class="ttc" id="classSVF_1_1DCHGraph_html_adc7a17f70ac3fa89624ad874dbd16ff9"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">SVF::DCHGraph::containingAggs</a></div><div class="ttdeci">Map&lt; const DIType *, Set&lt; const DIType * &gt; &gt; containingAggs</div><div class="ttdoc">Maps aggregate types to all the aggregate types it transitively contains. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00376">DCHG.h:376</a></div></div>
72
- <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#l00066">BasicTypes.h:66</a></div></div>
72
+ <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#l00068">BasicTypes.h:68</a></div></div>
73
73
  <div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad2a35c1d2e357690e634bb250a68795d"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad2a35c1d2e357690e634bb250a68795d">SVF::cppUtil::getVCallIdx</a></div><div class="ttdeci">u64_t getVCallIdx(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00391">CPPUtil.cpp:391</a></div></div>
74
74
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a9ed6b91fad334605f514049a2072b538"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">SVF::DCHGraph::getOrCreateNode</a></div><div class="ttdeci">DCHNode * getOrCreateNode(const DIType *type)</div><div class="ttdoc">Creates a node from type, or returns it if it exists. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00403">DCHG.cpp:403</a></div></div>
75
75
  <div class="ttc" id="classSVF_1_1DCHGraph_html_ae9a0007299178912e2568dc7158d6824"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#ae9a0007299178912e2568dc7158d6824">SVF::DCHGraph::getFieldTypes</a></div><div class="ttdeci">const std::vector&lt; const DIType * &gt; &amp; getFieldTypes(const DIType *base)</div><div class="ttdoc">Returns a vector of the types of all fields in base. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00327">DCHG.h:327</a></div></div>
76
- <div class="ttc" id="namespaceSVF_html_a9d3ee421789884473bfacfaa9ec007cc"><div class="ttname"><a href="namespaceSVF.html#a9d3ee421789884473bfacfaa9ec007cc">SVF::DITypeRefArray</a></div><div class="ttdeci">llvm::DITypeRefArray DITypeRefArray</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00167">BasicTypes.h:167</a></div></div>
76
+ <div class="ttc" id="namespaceSVF_html_a9d3ee421789884473bfacfaa9ec007cc"><div class="ttname"><a href="namespaceSVF.html#a9d3ee421789884473bfacfaa9ec007cc">SVF::DITypeRefArray</a></div><div class="ttdeci">llvm::DITypeRefArray DITypeRefArray</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00174">BasicTypes.h:174</a></div></div>
77
77
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a8fcbea9435a77beb27ad64d5a3175b0b"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">SVF::DCHGraph::gatherAggs</a></div><div class="ttdeci">void gatherAggs(const DICompositeType *type)</div><div class="ttdoc">Populates containingAggs for type and all its elements. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00350">DCHG.cpp:350</a></div></div>
78
78
  <div class="ttc" id="classSVF_1_1DCHEdge_html_a48f01c4a02c4e278a1ab70b16efdef4ba9c05805c60fe04033bd9815968059e90"><div class="ttname"><a href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba9c05805c60fe04033bd9815968059e90">SVF::DCHEdge::INHERITANCE</a></div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00035">DCHG.h:35</a></div></div>
79
79
  <div class="ttc" id="classSVF_1_1DCHGraph_html_ab96874bc8f6461fe0c3eb53b7f5cedce"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce">SVF::DCHGraph::flatten</a></div><div class="ttdeci">void flatten(const DICompositeType *type)</div><div class="ttdoc">Populates fieldTypes for type and all its elements. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00265">DCHG.cpp:265</a></div></div>
@@ -85,7 +85,7 @@ $(function() {
85
85
  <div class="ttc" id="CPPUtil_8h_html"><div class="ttname"><a href="CPPUtil_8h.html">CPPUtil.h</a></div></div>
86
86
  <div class="ttc" id="classSVF_1_1GenericNode_html_afc8b5f86d7795b6a0dfc0687d942d79b"><div class="ttname"><a href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">SVF::GenericNode::getInEdges</a></div><div class="ttdeci">const GEdgeSetTy &amp; getInEdges() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00186">GenericGraph.h:186</a></div></div>
87
87
  <div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00019">MTAResultValidator.h:19</a></div></div>
88
- <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>
88
+ <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#l00075">BasicTypes.h:75</a></div></div>
89
89
  <div class="ttc" id="classSVF_1_1DCHEdge_html_a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb"><div class="ttname"><a href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb">SVF::DCHEdge::STD_DEF</a></div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00038">DCHG.h:38</a></div></div>
90
90
  <div class="ttc" id="structSVF_1_1cppUtil_1_1DemangledName_html"><div class="ttname"><a href="structSVF_1_1cppUtil_1_1DemangledName.html">SVF::cppUtil::DemangledName</a></div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8h_source.html#l00046">CPPUtil.h:46</a></div></div>
91
91
  <div class="ttc" id="classSVF_1_1DCHGraph_html_ad79a569e77f94fa8494eed3f18e07e90"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">SVF::DCHGraph::csCHAMap</a></div><div class="ttdeci">Map&lt; CallSite, VFunSet &gt; csCHAMap</div><div class="ttdoc">Maps callsites to a set of potential virtual functions based on CHA. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00368">DCHG.h:368</a></div></div>
@@ -97,10 +97,10 @@ $(function() {
97
97
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a1215db390515a30fbc416fb14d2e863f"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a1215db390515a30fbc416fb14d2e863f">SVF::DCHGraph::buildVTables</a></div><div class="ttdeci">void buildVTables(const SVFModule &amp;module)</div><div class="ttdoc">Finds all defined virtual functions and attaches them to nodes. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00166">DCHG.cpp:166</a></div></div>
98
98
  <div class="ttc" id="classSVF_1_1DCHNode_html_a1a75ca91148992166d42d245d6c51988"><div class="ttname"><a href="classSVF_1_1DCHNode.html#a1a75ca91148992166d42d245d6c51988">SVF::DCHNode::getVTable</a></div><div class="ttdeci">const GlobalValue * getVTable() const</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00169">DCHG.h:169</a></div></div>
99
99
  <div class="ttc" id="classSVF_1_1DCHEdge_html_a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564"><div class="ttname"><a href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">SVF::DCHEdge::FIRST_FIELD</a></div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00037">DCHG.h:37</a></div></div>
100
- <div class="ttc" id="namespaceSVF_html_aded9b991c77acc5284ccead0739e84f1"><div class="ttname"><a href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">SVF::DICompositeType</a></div><div class="ttdeci">llvm::DICompositeType DICompositeType</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00159">BasicTypes.h:159</a></div></div>
100
+ <div class="ttc" id="namespaceSVF_html_aded9b991c77acc5284ccead0739e84f1"><div class="ttname"><a href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">SVF::DICompositeType</a></div><div class="ttdeci">llvm::DICompositeType DICompositeType</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00166">BasicTypes.h:166</a></div></div>
101
101
  <div class="ttc" id="cJSON_8cpp_html_ad00efb41ca386db28bacc7aefe79535c"><div class="ttname"><a href="cJSON_8cpp.html#ad00efb41ca386db28bacc7aefe79535c">child</a></div><div class="ttdeci">cJSON * child</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02723">cJSON.cpp:2723</a></div></div>
102
102
  <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>
103
- <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>
103
+ <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#l00089">BasicTypes.h:89</a></div></div>
104
104
  <div class="ttc" id="classSVF_1_1DCHNode_html_aaf4036d892bdae02a01d31bfe3db2153"><div class="ttname"><a href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">SVF::DCHNode::getType</a></div><div class="ttdeci">const DIType * getType(void) const</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00096">DCHG.h:96</a></div></div>
105
105
  <div class="ttc" id="DCHG_8cpp_html_a6673217180d3b6fb73c7c6387777f269"><div class="ttname"><a href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a></div><div class="ttdeci">static std::string indent(size_t n)</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l01123">DCHG.cpp:1123</a></div></div>
106
106
  <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>
@@ -116,43 +116,43 @@ $(function() {
116
116
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a6d97a772afe16c1483e65eea81f82603"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a6d97a772afe16c1483e65eea81f82603">SVF::DCHGraph::handleTypedef</a></div><div class="ttdeci">void handleTypedef(const DIType *typedefType)</div><div class="ttdoc">Attaches the typedef(s) to the base node. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00138">DCHG.cpp:138</a></div></div>
117
117
  <div class="ttc" id="classSVF_1_1GenericGraph_html_a4bef15157423cef48dc7333a803cd27d"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">SVF::GenericGraph&lt; DCHNode, DCHEdge &gt;::end</a></div><div class="ttdeci">iterator end()</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00369">GenericGraph.h:369</a></div></div>
118
118
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a294a2075c97e1db8003393fb472c1def"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">SVF::DCHGraph::addEdge</a></div><div class="ttdeci">DCHEdge * addEdge(const DIType *t1, const DIType *t2, DCHEdge::GEdgeKind et)</div><div class="ttdoc">Creates an edge between from t1 to t2. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00421">DCHG.cpp:421</a></div></div>
119
- <div class="ttc" id="namespaceSVF_html_a090e0791e8c200104ed3ab6bab157129"><div class="ttname"><a href="namespaceSVF.html#a090e0791e8c200104ed3ab6bab157129">SVF::DISubroutineType</a></div><div class="ttdeci">llvm::DISubroutineType DISubroutineType</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00162">BasicTypes.h:162</a></div></div>
119
+ <div class="ttc" id="namespaceSVF_html_a090e0791e8c200104ed3ab6bab157129"><div class="ttname"><a href="namespaceSVF.html#a090e0791e8c200104ed3ab6bab157129">SVF::DISubroutineType</a></div><div class="ttdeci">llvm::DISubroutineType DISubroutineType</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00169">BasicTypes.h:169</a></div></div>
120
120
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a9d2be5aec5216cbc1d1709b41f79c44b"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b">SVF::DCHGraph::isAgg</a></div><div class="ttdeci">static bool isAgg(const DIType *t)</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00342">DCHG.cpp:342</a></div></div>
121
121
  <div class="ttc" id="namespaceSVF_1_1cppUtil_1_1ctir_html_aa4630844aa25aa4801659304a2552058"><div class="ttname"><a href="namespaceSVF_1_1cppUtil_1_1ctir.html#aa4630844aa25aa4801659304a2552058">SVF::cppUtil::ctir::vtMDName</a></div><div class="ttdeci">const std::string vtMDName</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8h_source.html#l00116">CPPUtil.h:116</a></div></div>
122
122
  <div class="ttc" id="classSVF_1_1GenericGraph_html_ac213302cf5c7cdf3b66f7b18649d0fbc"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVF::GenericGraph&lt; DCHNode, DCHEdge &gt;::iterator</a></div><div class="ttdeci">IDToNodeMapTy::iterator iterator</div><div class="ttdoc">Node Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00342">GenericGraph.h:342</a></div></div>
123
123
  <div class="ttc" id="classSVF_1_1DCHEdge_html_a48f01c4a02c4e278a1ab70b16efdef4ba3e807b4caeb170c5cd1e855ac1a92d77"><div class="ttname"><a href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3e807b4caeb170c5cd1e855ac1a92d77">SVF::DCHEdge::INSTANCE</a></div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00036">DCHG.h:36</a></div></div>
124
124
  <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>
125
- <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>
125
+ <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#l00069">BasicTypes.h:69</a></div></div>
126
126
  <div class="ttc" id="structSVF_1_1cppUtil_1_1DemangledName_html_a1dd17b240663bc9412adefde82385e02"><div class="ttname"><a href="structSVF_1_1cppUtil_1_1DemangledName.html#a1dd17b240663bc9412adefde82385e02">SVF::cppUtil::DemangledName::funcName</a></div><div class="ttdeci">std::string funcName</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8h_source.html#l00049">CPPUtil.h:49</a></div></div>
127
127
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a1a4162e68b22d53e9dca73c6780ed3e5"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a1a4162e68b22d53e9dca73c6780ed3e5">SVF::DCHGraph::handleDIDerivedType</a></div><div class="ttdeci">void handleDIDerivedType(const DIDerivedType *derivedType)</div><div class="ttdoc">Construction helper to process DIDerivedTypes. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00097">DCHG.cpp:97</a></div></div>
128
128
  <div class="ttc" id="cJSON_8cpp_html_a3f9a0d3265a6254722587175dac3e4dc"><div class="ttname"><a href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a></div><div class="ttdeci">newitem type</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02739">cJSON.cpp:2739</a></div></div>
129
129
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a236d785d728189c2026357ce837fcdc6"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a236d785d728189c2026357ce837fcdc6">SVF::DCHGraph::getCSStaticType</a></div><div class="ttdeci">const DIType * getCSStaticType(CallSite cs) const</div><div class="ttdoc">Retrieves the metadata associated with a virtual callsite. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00407">DCHG.h:407</a></div></div>
130
- <div class="ttc" id="namespaceSVF_html_a0f825e73d115173b05ca54fb8ec65003"><div class="ttname"><a href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">SVF::DINodeArray</a></div><div class="ttdeci">llvm::DINodeArray DINodeArray</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00166">BasicTypes.h:166</a></div></div>
131
- <div class="ttc" id="namespaceSVF_html_a852e75c562139237fcc754c7461533e6"><div class="ttname"><a href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">SVF::DIDerivedType</a></div><div class="ttdeci">llvm::DIDerivedType DIDerivedType</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00160">BasicTypes.h:160</a></div></div>
130
+ <div class="ttc" id="namespaceSVF_html_a0f825e73d115173b05ca54fb8ec65003"><div class="ttname"><a href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">SVF::DINodeArray</a></div><div class="ttdeci">llvm::DINodeArray DINodeArray</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00173">BasicTypes.h:173</a></div></div>
131
+ <div class="ttc" id="namespaceSVF_html_a852e75c562139237fcc754c7461533e6"><div class="ttname"><a href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">SVF::DIDerivedType</a></div><div class="ttdeci">llvm::DIDerivedType DIDerivedType</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00167">BasicTypes.h:167</a></div></div>
132
132
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a96c68bbb5ee5e939158ce0b67da2c61d"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a96c68bbb5ee5e939158ce0b67da2c61d">SVF::DCHGraph::getNode</a></div><div class="ttdeci">DCHNode * getNode(const DIType *type)</div><div class="ttdoc">Returns the node for type (nullptr if it doesn&amp;#39;t exist). </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00424">DCHG.h:424</a></div></div>
133
133
  <div class="ttc" id="classSVF_1_1DCHGraph_html_af0534356b4a8c68507e1237f1d7a8c11"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#af0534356b4a8c68507e1237f1d7a8c11">SVF::DCHGraph::isFieldOf</a></div><div class="ttdeci">virtual bool isFieldOf(const DIType *f, const DIType *b)</div><div class="ttdoc">Returns true if f is a field of b (fields from getFieldTypes). </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00674">DCHG.cpp:674</a></div></div>
134
134
  <div class="ttc" id="classSVF_1_1GenericNode_html_a2d9cd758d6f8c5189d9b90b74f43e009"><div class="ttname"><a href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">SVF::GenericNode::getOutEdges</a></div><div class="ttdeci">const GEdgeSetTy &amp; getOutEdges() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00182">GenericGraph.h:182</a></div></div>
135
135
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_aa09c2b313ff1c1abcc1e5cb3f9ef46a5"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#aa09c2b313ff1c1abcc1e5cb3f9ef46a5">SVF::SVFUtil::getFunction</a></div><div class="ttdeci">const SVFFunction * getFunction(std::string name)</div><div class="ttdoc">Get the corresponding Function based on its name. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00225">SVFUtil.h:225</a></div></div>
136
136
  <div class="ttc" id="structSVF_1_1cppUtil_1_1DemangledName_html_a5cd207bce618521166e6fa235014b297"><div class="ttname"><a href="structSVF_1_1cppUtil_1_1DemangledName.html#a5cd207bce618521166e6fa235014b297">SVF::cppUtil::DemangledName::className</a></div><div class="ttdeci">std::string className</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8h_source.html#l00048">CPPUtil.h:48</a></div></div>
137
- <div class="ttc" id="namespaceSVF_html_a67f3f86344f028cacfbeb08caaf7bb0f"><div class="ttname"><a href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">SVF::GlobalValue</a></div><div class="ttdeci">llvm::GlobalValue GlobalValue</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00075">BasicTypes.h:75</a></div></div>
137
+ <div class="ttc" id="namespaceSVF_html_a67f3f86344f028cacfbeb08caaf7bb0f"><div class="ttname"><a href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">SVF::GlobalValue</a></div><div class="ttdeci">llvm::GlobalValue GlobalValue</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00074">BasicTypes.h:74</a></div></div>
138
138
  <div class="ttc" id="classSVF_1_1GenericNode_html_ae74283fbc788665296a69e56f334557b"><div class="ttname"><a href="classSVF_1_1GenericNode.html#ae74283fbc788665296a69e56f334557b">SVF::GenericNode::addOutgoingEdge</a></div><div class="ttdeci">bool addOutgoingEdge(EdgeType *outEdge)</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00283">GenericGraph.h:283</a></div></div>
139
139
  <div class="ttc" id="namespaceSVF_html_ad2b487757f1e1a1d81073120fc1d49c7"><div class="ttname"><a href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">SVF::VFunSet</a></div><div class="ttdeci">Set&lt; const SVFFunction * &gt; VFunSet</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00047">CHG.h:47</a></div></div>
140
140
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a5f08ed4cbba3e4b7a348d5ad77664726"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a5f08ed4cbba3e4b7a348d5ad77664726">SVF::DCHGraph::print</a></div><div class="ttdeci">void print(void)</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l01128">DCHG.cpp:1128</a></div></div>
141
141
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a574ec14099f1112b394b00a79f3fdf1a"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">SVF::DCHGraph::fieldTypes</a></div><div class="ttdeci">Map&lt; const DIType *, std::vector&lt; const DIType * &gt; &gt; fieldTypes</div><div class="ttdoc">Maps types to their flattened fields&amp;#39; types. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00374">DCHG.h:374</a></div></div>
142
142
  <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>
143
- <div class="ttc" id="namespaceSVF_html_a758f3bee97ed46a719d64a2d4f2bc62d"><div class="ttname"><a href="namespaceSVF.html#a758f3bee97ed46a719d64a2d4f2bc62d">SVF::DINode</a></div><div class="ttdeci">llvm::DINode DINode</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00165">BasicTypes.h:165</a></div></div>
143
+ <div class="ttc" id="namespaceSVF_html_a758f3bee97ed46a719d64a2d4f2bc62d"><div class="ttname"><a href="namespaceSVF.html#a758f3bee97ed46a719d64a2d4f2bc62d">SVF::DINode</a></div><div class="ttdeci">llvm::DINode DINode</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00172">BasicTypes.h:172</a></div></div>
144
144
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a6c276e661e5e63c1c84387f84c8a62e4"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a6c276e661e5e63c1c84387f84c8a62e4">SVF::DCHGraph::stripArray</a></div><div class="ttdeci">static const DIType * stripArray(const DIType *)</div><div class="ttdoc">Returns the DIType beneath all qualifiers and arrays. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00804">DCHG.cpp:804</a></div></div>
145
145
  <div class="ttc" id="classSVF_1_1GenericNode_html_a93d217b0c9fd8008a2989ca2b4f3fbfb"><div class="ttname"><a href="classSVF_1_1GenericNode.html#a93d217b0c9fd8008a2989ca2b4f3fbfb">SVF::GenericNode::addIncomingEdge</a></div><div class="ttdeci">bool addIncomingEdge(EdgeType *inEdge)</div><div class="ttdoc">Add incoming and outgoing edges. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00279">GenericGraph.h:279</a></div></div>
146
146
  <div class="ttc" id="classSVF_1_1DCHNode_html"><div class="ttname"><a href="classSVF_1_1DCHNode.html">SVF::DCHNode</a></div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00063">DCHG.h:63</a></div></div>
147
- <div class="ttc" id="classSVF_1_1CallSite_html_a145676880fce313b4634d14118476c27"><div class="ttname"><a href="classSVF_1_1CallSite.html#a145676880fce313b4634d14118476c27">SVF::CallSite::arg_size</a></div><div class="ttdeci">unsigned arg_size() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00372">BasicTypes.h:372</a></div></div>
147
+ <div class="ttc" id="classSVF_1_1CallSite_html_a145676880fce313b4634d14118476c27"><div class="ttname"><a href="classSVF_1_1CallSite.html#a145676880fce313b4634d14118476c27">SVF::CallSite::arg_size</a></div><div class="ttdeci">unsigned arg_size() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00407">BasicTypes.h:407</a></div></div>
148
148
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a58341e23c1dc2b3e7fce190ed16a8a25"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a58341e23c1dc2b3e7fce190ed16a8a25">SVF::DCHGraph::hasNode</a></div><div class="ttdeci">bool hasNode(const DIType *type)</div><div class="ttdoc">Checks if a node exists for type. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00417">DCHG.h:417</a></div></div>
149
149
  <div class="ttc" id="classSVF_1_1DCHGraph_html_ac0d5f1e10f642aac5b64792bf5fcbd9d"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#ac0d5f1e10f642aac5b64792bf5fcbd9d">SVF::DCHGraph::chaMap</a></div><div class="ttdeci">Map&lt; const DIType *, NodeBS &gt; chaMap</div><div class="ttdoc">Maps types to all children (i.e. CHA). </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00362">DCHG.h:362</a></div></div>
150
150
  <div class="ttc" id="classSVF_1_1GenericGraph_html_a0a8831a5429005ff9d71adbd6bf3994f"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0a8831a5429005ff9d71adbd6bf3994f">SVF::GenericGraph&lt; DCHNode, DCHEdge &gt;::addGNode</a></div><div class="ttdeci">void addGNode(NodeID id, NodeType *node)</div><div class="ttdoc">Add a Node. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00384">GenericGraph.h:384</a></div></div>
151
151
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a3383b841bb79ee39cb108b9906fca6a9"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a3383b841bb79ee39cb108b9906fca6a9">SVF::DCHGraph::getCSVtblsBasedonCHA</a></div><div class="ttdeci">virtual const VTableSet &amp; getCSVtblsBasedonCHA(CallSite cs) override</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00552">DCHG.cpp:552</a></div></div>
152
- <div class="ttc" id="namespaceSVF_html_a89c7208bfc0b57873dfa574f52050295"><div class="ttname"><a href="namespaceSVF.html#a89c7208bfc0b57873dfa574f52050295">SVF::DISubprogram</a></div><div class="ttdeci">llvm::DISubprogram DISubprogram</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00117">BasicTypes.h:117</a></div></div>
153
- <div class="ttc" id="namespaceSVF_html_a5ae98f122c64b0114df2e5861b341321"><div class="ttname"><a href="namespaceSVF.html#a5ae98f122c64b0114df2e5861b341321">SVF::DebugInfoFinder</a></div><div class="ttdeci">llvm::DebugInfoFinder DebugInfoFinder</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00161">BasicTypes.h:161</a></div></div>
152
+ <div class="ttc" id="namespaceSVF_html_a89c7208bfc0b57873dfa574f52050295"><div class="ttname"><a href="namespaceSVF.html#a89c7208bfc0b57873dfa574f52050295">SVF::DISubprogram</a></div><div class="ttdeci">llvm::DISubprogram DISubprogram</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00113">BasicTypes.h:113</a></div></div>
153
+ <div class="ttc" id="namespaceSVF_html_a5ae98f122c64b0114df2e5861b341321"><div class="ttname"><a href="namespaceSVF.html#a5ae98f122c64b0114df2e5861b341321">SVF::DebugInfoFinder</a></div><div class="ttdeci">llvm::DebugInfoFinder DebugInfoFinder</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00168">BasicTypes.h:168</a></div></div>
154
154
  <div class="ttc" id="namespaceSVF_html_a53511f619c06836ee85acf12153810e2"><div class="ttname"><a href="namespaceSVF.html#a53511f619c06836ee85acf12153810e2">SVF::VTableSet</a></div><div class="ttdeci">Set&lt; const GlobalValue * &gt; VTableSet</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00044">CHG.h:44</a></div></div>
155
- <div class="ttc" id="namespaceSVF_html_a7e230c0cba2e3a7c2e5a5f2ee7d88af9"><div class="ttname"><a href="namespaceSVF.html#a7e230c0cba2e3a7c2e5a5f2ee7d88af9">SVF::Constant</a></div><div class="ttdeci">llvm::Constant Constant</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00067">BasicTypes.h:67</a></div></div>
155
+ <div class="ttc" id="namespaceSVF_html_a7e230c0cba2e3a7c2e5a5f2ee7d88af9"><div class="ttname"><a href="namespaceSVF.html#a7e230c0cba2e3a7c2e5a5f2ee7d88af9">SVF::Constant</a></div><div class="ttdeci">llvm::Constant Constant</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00069">BasicTypes.h:69</a></div></div>
156
156
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a86bf48776ccf53092f4cb742cf95f8eb"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a86bf48776ccf53092f4cb742cf95f8eb">SVF::DCHGraph::handleDIBasicType</a></div><div class="ttdeci">void handleDIBasicType(const DIBasicType *basicType)</div><div class="ttdoc">Construction helper to process DIBasicTypes. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00022">DCHG.cpp:22</a></div></div>
157
157
  <div class="ttc" id="Options_8h_html"><div class="ttname"><a href="Options_8h.html">Options.h</a></div></div>
158
158
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a710c6b87fd475552eddb425e38de8889"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a710c6b87fd475552eddb425e38de8889">SVF::DCHGraph::buildCHG</a></div><div class="ttdeci">virtual void buildCHG(bool extend)</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00457">DCHG.cpp:457</a></div></div>
@@ -171,18 +171,18 @@ $(function() {
171
171
  <div class="ttc" id="classSVF_1_1DCHGraph_html_acb76ab20da1bfbec00f63d08e48cbddd"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#acb76ab20da1bfbec00f63d08e48cbddd">SVF::DCHGraph::teq</a></div><div class="ttdeci">static bool teq(const DIType *t1, const DIType *t2)</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00816">DCHG.cpp:816</a></div></div>
172
172
  <div class="ttc" id="cJSON_8h_html_ad43c3812e6d13e0518d9f8b8f463ffcf"><div class="ttname"><a href="cJSON_8h.html#ad43c3812e6d13e0518d9f8b8f463ffcf">count</a></div><div class="ttdeci">int count</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00216">cJSON.h:216</a></div></div>
173
173
  <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>
174
- <div class="ttc" id="namespaceSVF_html_ada0513be7e25325325ccc9183aeca278"><div class="ttname"><a href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">SVF::DIBasicType</a></div><div class="ttdeci">llvm::DIBasicType DIBasicType</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00163">BasicTypes.h:163</a></div></div>
174
+ <div class="ttc" id="namespaceSVF_html_ada0513be7e25325325ccc9183aeca278"><div class="ttname"><a href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">SVF::DIBasicType</a></div><div class="ttdeci">llvm::DIBasicType DIBasicType</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00170">BasicTypes.h:170</a></div></div>
175
175
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a294e7a04aff9cef87c1008e91a620155"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">SVF::DCHGraph::vtblCHAMap</a></div><div class="ttdeci">Map&lt; const DIType *, VTableSet &gt; vtblCHAMap</div><div class="ttdoc">Maps types to a set with their vtable and all their children&amp;#39;s. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00366">DCHG.h:366</a></div></div>
176
- <div class="ttc" id="classSVF_1_1CallSite_html"><div class="ttname"><a href="classSVF_1_1CallSite.html">SVF::CallSite</a></div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00343">BasicTypes.h:343</a></div></div>
176
+ <div class="ttc" id="classSVF_1_1CallSite_html"><div class="ttname"><a href="classSVF_1_1CallSite.html">SVF::CallSite</a></div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00387">BasicTypes.h:387</a></div></div>
177
177
  <div class="ttc" id="classSVF_1_1GenericNode_html_ac3e55ef37aefb411ea4c87b1aa3b1895"><div class="ttname"><a href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">SVF::GenericNode::getId</a></div><div class="ttdeci">NodeID getId() const</div><div class="ttdoc">Get ID. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00169">GenericGraph.h:169</a></div></div>
178
178
  <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a0a67c31dcc44784b09dca54b4b7c624a"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a0a67c31dcc44784b09dca54b4b7c624a">SVF::cppUtil::getFunNameOfVCallSite</a></div><div class="ttdeci">std::string getFunNameOfVCallSite(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00547">CPPUtil.cpp:547</a></div></div>
179
179
  <div class="ttc" id="classSVF_1_1DCHNode_html_ab8a339276172b8aa0fc915e5bde0b3db"><div class="ttname"><a href="classSVF_1_1DCHNode.html#ab8a339276172b8aa0fc915e5bde0b3db">SVF::DCHNode::setVTable</a></div><div class="ttdeci">void setVTable(const GlobalValue *vtbl)</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00164">DCHG.h:164</a></div></div>
180
- <div class="ttc" id="namespaceSVF_html_a99bc1228f07429855c81a720be862dc6"><div class="ttname"><a href="namespaceSVF.html#a99bc1228f07429855c81a720be862dc6">SVF::DISubrange</a></div><div class="ttdeci">llvm::DISubrange DISubrange</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00164">BasicTypes.h:164</a></div></div>
180
+ <div class="ttc" id="namespaceSVF_html_a99bc1228f07429855c81a720be862dc6"><div class="ttname"><a href="namespaceSVF.html#a99bc1228f07429855c81a720be862dc6">SVF::DISubrange</a></div><div class="ttdeci">llvm::DISubrange DISubrange</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00171">BasicTypes.h:171</a></div></div>
181
181
  <div class="ttc" id="classSVF_1_1SparseBitVector_html_a61bd86909a141f9de873d92c0f904832"><div class="ttname"><a href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">SVF::SparseBitVector::set</a></div><div class="ttdeci">void set(unsigned Idx)</div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l00745">SparseBitVector.h:745</a></div></div>
182
182
  <div class="ttc" id="classSVF_1_1SVFModule_html_a5d4f73db8fb5bddb0e7630eda8c6da57"><div class="ttname"><a href="classSVF_1_1SVFModule.html#a5d4f73db8fb5bddb0e7630eda8c6da57">SVF::SVFModule::const_global_iterator</a></div><div class="ttdeci">GlobalSetType::const_iterator const_global_iterator</div><div class="ttdef"><b>Definition:</b> <a href="SVFModule_8h_source.html#l00056">SVFModule.h:56</a></div></div>
183
183
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a8182be247907420db00837cef9bcfa70"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if&lt;!is_simple_type&lt; Y &gt;::value, typename cast_retty&lt; X, const Y &gt;::ret_type &gt;::type dyn_cast(const Y &amp;Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00343">Casting.h:343</a></div></div>
184
- <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#l00055">BasicTypes.h:55</a></div></div>
185
- <div class="ttc" id="namespaceSVF_html_a911dbaab38cb42deb9c195c7f687853d"><div class="ttname"><a href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">SVF::ConstantExpr</a></div><div class="ttdeci">llvm::ConstantExpr ConstantExpr</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00063">BasicTypes.h:63</a></div></div>
184
+ <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#l00057">BasicTypes.h:57</a></div></div>
185
+ <div class="ttc" id="namespaceSVF_html_a911dbaab38cb42deb9c195c7f687853d"><div class="ttname"><a href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">SVF::ConstantExpr</a></div><div class="ttdeci">llvm::ConstantExpr ConstantExpr</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00065">BasicTypes.h:65</a></div></div>
186
186
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a3ce75cbe92a1fa7d34c6fca2d2ca1b0f"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a3ce75cbe92a1fa7d34c6fca2d2ca1b0f">SVF::DCHGraph::handleDICompositeType</a></div><div class="ttdeci">void handleDICompositeType(const DICompositeType *compositeType)</div><div class="ttdoc">Construction helper to process DICompositeTypes. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00027">DCHG.cpp:27</a></div></div>
187
187
  <div class="ttc" id="classSVF_1_1SVFModule_html_a8a34164634d6ad9a7b76175907c8c44b"><div class="ttname"><a href="classSVF_1_1SVFModule.html#a8a34164634d6ad9a7b76175907c8c44b">SVF::SVFModule::global_end</a></div><div class="ttdeci">global_iterator global_end()</div><div class="ttdef"><b>Definition:</b> <a href="SVFModule_8h_source.html#l00181">SVFModule.h:181</a></div></div>
188
188
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a76fd3154a31584bb64683f2d762cc56c"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a76fd3154a31584bb64683f2d762cc56c">SVF::DCHGraph::numTypes</a></div><div class="ttdeci">NodeID numTypes</div><div class="ttdoc">Number of types (nodes) in the graph. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00442">DCHG.h:442</a></div></div>
@@ -192,8 +192,8 @@ $(function() {
192
192
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a2b2dbc52089696854a8339f2e83fc333"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a2b2dbc52089696854a8339f2e83fc333">SVF::DCHGraph::isFirstField</a></div><div class="ttdeci">bool isFirstField(const DIType *f, const DIType *b)</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00928">DCHG.cpp:928</a></div></div>
193
193
  <div class="ttc" id="classSVF_1_1DCHNode_html_ac77edc44c3c5acc185c27c018837d066"><div class="ttname"><a href="classSVF_1_1DCHNode.html#ac77edc44c3c5acc185c27c018837d066">SVF::DCHNode::getTypedefs</a></div><div class="ttdeci">const Set&lt; const DIDerivedType * &gt; &amp; getTypedefs(void) const</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00159">DCHG.h:159</a></div></div>
194
194
  <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>
195
- <div class="ttc" id="classSVF_1_1CallSite_html_ad0040f4b7953b509059223d1d52c203f"><div class="ttname"><a href="classSVF_1_1CallSite.html#ad0040f4b7953b509059223d1d52c203f">SVF::CallSite::getFunctionType</a></div><div class="ttdeci">FunctionType * getFunctionType() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00400">BasicTypes.h:400</a></div></div>
196
- <div class="ttc" id="namespaceSVF_html_ad127b0ad478640ede3d426e3a58d2632"><div class="ttname"><a href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">SVF::DIType</a></div><div class="ttdeci">llvm::DIType DIType</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00158">BasicTypes.h:158</a></div></div>
195
+ <div class="ttc" id="classSVF_1_1CallSite_html_ad0040f4b7953b509059223d1d52c203f"><div class="ttname"><a href="classSVF_1_1CallSite.html#ad0040f4b7953b509059223d1d52c203f">SVF::CallSite::getFunctionType</a></div><div class="ttdeci">FunctionType * getFunctionType() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00435">BasicTypes.h:435</a></div></div>
196
+ <div class="ttc" id="namespaceSVF_html_ad127b0ad478640ede3d426e3a58d2632"><div class="ttname"><a href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">SVF::DIType</a></div><div class="ttdeci">llvm::DIType DIType</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00165">BasicTypes.h:165</a></div></div>
197
197
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a6a5d012fda005d45bf3196d1a7d2c6fa"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a6a5d012fda005d45bf3196d1a7d2c6fa">SVF::DCHGraph::getVFnsFromVtbls</a></div><div class="ttdeci">virtual void getVFnsFromVtbls(CallSite cs, const VTableSet &amp;vtbls, VFunSet &amp;virtualFunctions) override</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00580">DCHG.cpp:580</a></div></div>
198
198
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a10225f56b21eb7f0870fdc433de3c393"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a10225f56b21eb7f0870fdc433de3c393">SVF::DCHGraph::canonicalTypes</a></div><div class="ttdeci">Set&lt; const DIType * &gt; canonicalTypes</div><div class="ttdoc">Set of all possible canonical types (i.e. values of canonicalTypeMap). </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00372">DCHG.h:372</a></div></div>
199
199
  </div><!-- fragment --></div><!-- contents -->