svf-tools 1.0.602 → 1.0.604

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 (156) hide show
  1. package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +2 -2
  2. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +2 -2
  3. package/SVF-doxygen/html/html/CFLGraphBuilder_8cpp_source.html +2 -2
  4. package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +11 -11
  5. package/SVF-doxygen/html/html/CHG_8cpp_source.html +1 -1
  6. package/SVF-doxygen/html/html/CPPUtil_8cpp.html +17 -17
  7. package/SVF-doxygen/html/html/CPPUtil_8cpp_source.html +29 -29
  8. package/SVF-doxygen/html/html/CPPUtil_8h_source.html +17 -17
  9. package/SVF-doxygen/html/html/CSC_8cpp_source.html +2 -2
  10. package/SVF-doxygen/html/html/CallGraphBuilder_8cpp_source.html +2 -2
  11. package/SVF-doxygen/html/html/Casting_8h.html +68 -12
  12. package/SVF-doxygen/html/html/Casting_8h_source.html +49 -42
  13. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +2 -2
  14. package/SVF-doxygen/html/html/DCHG_8cpp_source.html +2 -2
  15. package/SVF-doxygen/html/html/DCHG_8h_source.html +2 -2
  16. package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +2 -2
  17. package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +2 -2
  18. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +2 -2
  19. package/SVF-doxygen/html/html/IRAnnotator_8h.html +2 -1
  20. package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +21 -21
  21. package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +6 -6
  22. package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +3 -3
  23. package/SVF-doxygen/html/html/LLVMUtil_8h_source.html +2 -2
  24. package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +2 -2
  25. package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +2 -2
  26. package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +2 -2
  27. package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +2 -2
  28. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +2 -2
  29. package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +2 -2
  30. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +3 -3
  31. package/SVF-doxygen/html/html/SVFValue_8h_source.html +2 -2
  32. package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +3 -3
  33. package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +2 -2
  34. package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +2 -2
  35. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +2 -2
  36. package/SVF-doxygen/html/html/annotated.html +31 -27
  37. package/SVF-doxygen/html/html/classSVF_1_1AliasCFLGraphBuilder.html +4 -4
  38. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +2 -2
  39. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +2 -2
  40. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +10 -10
  41. package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +23 -23
  42. package/SVF-doxygen/html/html/classSVF_1_1CHGraph.html +1 -1
  43. package/SVF-doxygen/html/html/classSVF_1_1CSC.html +2 -2
  44. package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +2 -2
  45. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +2 -2
  46. package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +22 -22
  47. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +4 -4
  48. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +2 -2
  49. package/SVF-doxygen/html/html/classSVF_1_1IRAnnotator.html +61 -61
  50. package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +8 -8
  51. package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +2 -2
  52. package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +4 -4
  53. package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +8 -8
  54. package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +12 -12
  55. package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +2 -2
  56. package/SVF-doxygen/html/html/classSVF_1_1RaceResultValidator.html +8 -8
  57. package/SVF-doxygen/html/html/classSVF_1_1SVFCallInst.html +2 -2
  58. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +5 -5
  59. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +6 -6
  60. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +6 -6
  61. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraphBuilder.html +2 -2
  62. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +2 -2
  63. package/SVF-doxygen/html/html/classSVF_1_1VFCFLGraphBuilder.html +2 -2
  64. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +6 -6
  65. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive_1_1SCC.html +2 -2
  66. package/SVF-doxygen/html/html/classes.html +108 -107
  67. package/SVF-doxygen/html/html/functions_d.html +1 -1
  68. package/SVF-doxygen/html/html/functions_func_d.html +1 -1
  69. package/SVF-doxygen/html/html/functions_i.html +3 -3
  70. package/SVF-doxygen/html/html/functions_o.html +12 -12
  71. package/SVF-doxygen/html/html/functions_p.html +6 -6
  72. package/SVF-doxygen/html/html/functions_r.html +6 -4
  73. package/SVF-doxygen/html/html/functions_s.html +13 -11
  74. package/SVF-doxygen/html/html/functions_t.html +8 -4
  75. package/SVF-doxygen/html/html/functions_type_r.html +1 -1
  76. package/SVF-doxygen/html/html/functions_type_s.html +1 -1
  77. package/SVF-doxygen/html/html/functions_type_t.html +6 -0
  78. package/SVF-doxygen/html/html/functions_v.html +3 -3
  79. package/SVF-doxygen/html/html/functions_w.html +9 -9
  80. package/SVF-doxygen/html/html/globals_defs.html +10 -0
  81. package/SVF-doxygen/html/html/globals_l.html +8 -2
  82. package/SVF-doxygen/html/html/hierarchy.html +502 -498
  83. package/SVF-doxygen/html/html/include_2MTA_2MTAResultValidator_8h_source.html +2 -2
  84. package/SVF-doxygen/html/html/menudata.js +1 -0
  85. package/SVF-doxygen/html/html/namespaceSVF_1_1LLVMUtil.html +13 -13
  86. package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +45 -36
  87. package/SVF-doxygen/html/html/namespaceSVF_1_1cppUtil.html +46 -46
  88. package/SVF-doxygen/html/html/namespacemembers_d.html +1 -1
  89. package/SVF-doxygen/html/html/namespacemembers_func_c.html +1 -1
  90. package/SVF-doxygen/html/html/search/all_1.js +4 -0
  91. package/SVF-doxygen/html/html/search/all_10.js +2 -2
  92. package/SVF-doxygen/html/html/search/all_11.js +3 -3
  93. package/SVF-doxygen/html/html/search/all_12.js +9 -9
  94. package/SVF-doxygen/html/html/search/all_13.js +5 -5
  95. package/SVF-doxygen/html/html/search/all_15.js +3 -3
  96. package/SVF-doxygen/html/html/search/all_16.js +1 -1
  97. package/SVF-doxygen/html/html/search/all_3.js +1 -1
  98. package/SVF-doxygen/html/html/search/all_4.js +2 -2
  99. package/SVF-doxygen/html/html/search/all_9.js +2 -2
  100. package/SVF-doxygen/html/html/search/all_c.js +2 -0
  101. package/SVF-doxygen/html/html/search/all_e.js +1 -1
  102. package/SVF-doxygen/html/html/search/all_f.js +1 -1
  103. package/SVF-doxygen/html/html/search/classes_0.js +4 -0
  104. package/SVF-doxygen/html/html/search/classes_8.js +1 -1
  105. package/SVF-doxygen/html/html/search/defines_9.js +2 -2
  106. package/SVF-doxygen/html/html/search/defines_a.js +2 -4
  107. package/SVF-doxygen/html/html/search/defines_b.js +4 -3
  108. package/SVF-doxygen/html/html/search/functions_2.js +1 -1
  109. package/SVF-doxygen/html/html/search/functions_3.js +2 -2
  110. package/SVF-doxygen/html/html/search/searchdata.js +1 -1
  111. package/SVF-doxygen/html/html/search/typedefs_10.js +1 -1
  112. package/SVF-doxygen/html/html/search/typedefs_11.js +1 -1
  113. package/SVF-doxygen/html/html/search/typedefs_f.js +1 -1
  114. package/SVF-doxygen/html/html/search/variables_13.js +3 -3
  115. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__const__past__pointer-members.html +81 -0
  116. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__const__past__pointer.html +117 -0
  117. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__const__past__pointer_3_01T_00_01std_1_1enable__if__t_3_01std_1_1is_7fffc8df953a67082a10c9027356ecdf.html +116 -0
  118. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__const__past__pointer_3_01T_00_01std_1_1enable__if__t_3_01std_1_1is_cb99dfac8a8d563a9cc95333664bb3b0.html +81 -0
  119. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__lvalue__reference__if__not__pointer-members.html +81 -0
  120. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__lvalue__reference__if__not__pointer.html +120 -0
  121. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__lvalue__reference__if__not__pointer_3_01T_00_01std_1_1enable__if__t915410d772a4855ec3d21a633a25ee09.html +116 -0
  122. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__lvalue__reference__if__not__pointer_3_01T_00_01std_1_1enable__if__t988b83cd34ecdeca7da70d983bff292c.html +81 -0
  123. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__convert__val.html +5 -5
  124. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__convert__val_3_01To_00_01FromTy_00_01FromTy_01_4.html +3 -3
  125. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty.html +2 -2
  126. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl.html +2 -2
  127. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01From_01_5_01_4.html +2 -2
  128. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_4.html +2 -2
  129. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5_01_4.html +2 -2
  130. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5const_01_4.html +2 -2
  131. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html +4 -4
  132. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__wrap.html +2 -2
  133. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html +2 -2
  134. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__simple__type.html +2 -2
  135. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl.html +3 -3
  136. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl_3_01To_00_01From_00_01std_1_1enable__if__t_3_01std_1_1is__base69cc7dc7020ea1b36a974ffb5131e932.html +81 -0
  137. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl_3_01To_00_01From_00_01std_1_1enable__if__t_3_01std_1_1is__baseacbe8554d65d479d86c5b7d994311309.html +132 -0
  138. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl.html +3 -3
  139. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5_01_4.html +3 -3
  140. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5const_01_4.html +3 -3
  141. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_4.html +3 -3
  142. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5_01_4.html +3 -3
  143. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5const_01_4.html +3 -3
  144. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01std_1_1unique__ptr_3_01From_01_4_01_4.html +3 -3
  145. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__wrap.html +5 -5
  146. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html +3 -3
  147. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1simplify__type.html +4 -4
  148. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4-members.html +2 -2
  149. package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html +20 -20
  150. package/SVF-doxygen/html/html/tools_2MTA_2MTAResultValidator_8h_source.html +2 -2
  151. package/include/SVF-LLVM/IRAnnotator.h +1 -0
  152. package/include/Util/Casting.h +85 -29
  153. package/lib/SVF-LLVM/CHGBuilder.cpp +2 -2
  154. package/lib/SVF-LLVM/CPPUtil.cpp +7 -8
  155. package/package.json +1 -1
  156. package/images/svf-stat.pdf +0 -0
@@ -66,7 +66,7 @@ $(function() {
66
66
  <div class="title">Andersen.cpp</div> </div>
67
67
  </div><!--header-->
68
68
  <div class="contents">
69
- <a href="Andersen_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">//===- Andersen.cpp -- Field-sensitive Andersen&#39;s analysis-------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// Copyright (C) &lt;2013-2017&gt; &lt;Yulei Sui&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">// along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment"> * Andersen.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment"> * Created on: Nov 12, 2013</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment"> * Author: Yulei Sui</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Options_8h.html">Util/Options.h</a>&quot;</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="CHG_8h.html">Graphs/CHG.h</a>&quot;</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</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="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="PointsTo_8h.html">MemoryModel/PointsTo.h</a>&quot;</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Andersen_8h.html">WPA/Andersen.h</a>&quot;</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Steensgaard_8h.html">WPA/Steensgaard.h</a>&quot;</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceSVFUtil.html">SVFUtil</a>;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacestd.html">std</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;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a4acad18a6eb585ba9e3d2276dd591067">AndersenBase::numOfProcessedAddr</a> = 0;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a04acd871bd1b98cd9e83e395334ac130">AndersenBase::numOfProcessedCopy</a> = 0;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#aa1246b392aeae1fd10c8a9ebedcc2dd9">AndersenBase::numOfProcessedGep</a> = 0;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a69aae96fc1c99bf108075e5061f50f9e">AndersenBase::numOfProcessedLoad</a> = 0;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a2b763519509ce21cf40893c01f8357b6">AndersenBase::numOfProcessedStore</a> = 0;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a25b00d9ca71cbdd27530fc5d0dc84ee5">AndersenBase::numOfSfrs</a> = 0;</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a9f453ec1b4236b8194ae590981217259">AndersenBase::numOfFieldExpand</a> = 0;</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;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a0d7298cbf83568f24fd2bd1926a32968">AndersenBase::numOfSCCDetection</a> = 0;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a6b7d0e57f741c446d0bf178939960143">AndersenBase::timeOfSCCDetection</a> = 0;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a02c5a50b214d36921e1404784e76704d">AndersenBase::timeOfSCCMerges</a> = 0;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#ad40b196c2c699bd115529b806d20de25">AndersenBase::timeOfCollapse</a> = 0;</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;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#adaf738bee77a4b1fbb8d42911fabdb49">AndersenBase::AveragePointsToSetSize</a> = 0;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#abd73e930450b7c605f478672bdf9bdae">AndersenBase::MaxPointsToSetSize</a> = 0;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#aae14de6fbca9280d8d0290326aa493f0">AndersenBase::timeOfProcessCopyGep</a> = 0;</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a9fe738f1e11c80006d540f246a80bfdf">AndersenBase::timeOfProcessLoadStore</a> = 0;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a2afb49f513c9534fd051117b59dc056b">AndersenBase::timeOfUpdateCallGraph</a> = 0;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;</div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a8da8746b38c55561d3f6904e8fd0a9aa"> 64</a></span>&#160;<a class="code" href="classSVF_1_1AndersenBase.html#a8da8746b38c55561d3f6904e8fd0a9aa">AndersenBase::~AndersenBase</a>()</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; <span class="keyword">delete</span> consCG;</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; consCG = <span class="keyword">nullptr</span>;</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;</div><div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac"> 73</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac">AndersenBase::initialize</a>()</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160;{</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <a class="code" href="classSVF_1_1PointerAnalysis.html#a431ec4f85eb0f029e5740b92fd9ceb32">PointerAnalysis::initialize</a>();</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; consCG = <span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintGraph.html">ConstraintGraph</a>(pag);</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; setGraph(consCG);</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; stat = <span class="keyword">new</span> <a class="code" href="classSVF_1_1AndersenStat.html">AndersenStat</a>(<span class="keyword">this</span>);</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a69a7d0431c0ddfefed1cb97f3571303a">Options::ConsCGDotGraph</a>)</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; consCG-&gt;dump(<span class="stringliteral">&quot;consCG_initial&quot;</span>);</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;</div><div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67"> 89</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67">AndersenBase::finalize</a>()</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;{</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a69a7d0431c0ddfefed1cb97f3571303a">Options::ConsCGDotGraph</a>)</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; consCG-&gt;dump(<span class="stringliteral">&quot;consCG_final&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; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a87516daebb3d1b5fee9037068d60e268">Options::PrintCGGraph</a>)</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; consCG-&gt;print();</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a57ff2bf45ede7a730a8adaba8e61179d">BVDataPTAImpl::finalize</a>();</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;}</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;</div><div class="line"><a name="l00103"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a944966086ecb716184c8cdcc43db5751"> 103</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a944966086ecb716184c8cdcc43db5751">AndersenBase::analyze</a>()</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;{</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; initialize();</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="keywordtype">bool</span> readResultsFromFile = <span class="keyword">false</span>;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keywordflow">if</span>(!<a class="code" href="classSVF_1_1Options.html#a98a521e5c99c5248eae8f8234453b116">Options::ReadAnder</a>.empty())</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; {</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; readResultsFromFile = this-&gt;readFromFile(<a class="code" href="classSVF_1_1Options.html#a98a521e5c99c5248eae8f8234453b116">Options::ReadAnder</a>);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="comment">// Finalize the analysis</span></div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <a class="code" href="classSVF_1_1PointerAnalysis.html#a118dabc50024b5cd91095814ade47166">PointerAnalysis::finalize</a>();</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; }</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">if</span>(!readResultsFromFile)</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; {</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="comment">// Start solving constraints</span></div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">&quot;Start Solving Constraints\n&quot;</span>));</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordtype">bool</span> limitTimerSet = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a757815a2c758695176120509ceb0ce70">SVFUtil::startAnalysisLimitTimer</a>(<a class="code" href="classSVF_1_1Options.html#a620fe156ba70f997eace0ccb0d2c9f67">Options::AnderTimeLimit</a>);</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; initWorklist();</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordflow">do</span></div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; {</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; numOfIteration++;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keywordflow">if</span> (0 == numOfIteration % iterationForPrintStat)</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; printStat();</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; reanalyze = <span class="keyword">false</span>;</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; solveWorklist();</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="keywordflow">if</span> (updateCallGraph(getIndirectCallsites()))</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; reanalyze = <span class="keyword">true</span>;</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"> 138</span>&#160; <span class="keywordflow">while</span> (reanalyze);</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; <span class="comment">// Analysis is finished, reset the alarm if we set it.</span></div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a168f7f7a3a8c70dbf2b5b4269cd4c7c5">SVFUtil::stopAnalysisLimitTimer</a>(limitTimerSet);</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">&quot;Finish Solving Constraints\n&quot;</span>));</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="comment">// Finalize the analysis</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; finalize();</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; }</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classSVF_1_1Options.html#a4c7eb57066c80c62ef394d644833214a">Options::WriteAnder</a>.empty())</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; this-&gt;writeToFile(<a class="code" href="classSVF_1_1Options.html#a4c7eb57066c80c62ef394d644833214a">Options::WriteAnder</a>);</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;</div><div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#aebfe0c7238eb24f74f105b950b86cb5e"> 153</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#aebfe0c7238eb24f74f105b950b86cb5e">AndersenBase::cleanConsCG</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <span class="keywordtype">id</span>)</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; consCG-&gt;resetSubs(consCG-&gt;getRep(<span class="keywordtype">id</span>));</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> sub: consCG-&gt;getSubs(<span class="keywordtype">id</span>))</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; consCG-&gt;resetRep(sub);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; consCG-&gt;resetSubs(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; consCG-&gt;resetRep(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; assert(!consCG-&gt;hasGNode(<span class="keywordtype">id</span>) &amp;&amp; <span class="stringliteral">&quot;this is either a rep nodeid or a sub nodeid should have already been merged to its field-insensitive base! &quot;</span>);</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160;}</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;</div><div class="line"><a name="l00163"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#af37392229dab0a1f2f807a12186c3b39"> 163</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#af37392229dab0a1f2f807a12186c3b39">AndersenBase::normalizePointsTo</a>()</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; <a class="code" href="classSVF_1_1SVFIR.html#ab6abb822445c9b3f5cb2b7206042e940">SVFIR::MemObjToFieldsMap</a> &amp;memToFieldsMap = pag-&gt;getMemToFieldsMap();</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <a class="code" href="classSVF_1_1SVFIR.html#aa5b08d987b37d35e73de88da10a97bc4">SVFIR::NodeLocationSetMap</a> &amp;GepObjVarMap = pag-&gt;getGepObjNodeMap();</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="comment">// clear GepObjVarMap/memToFieldsMap/nodeToSubsMap/nodeToRepMap</span></div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="comment">// for redundant gepnodes and remove those nodes from pag</span></div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>: redundantGepNodes)</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> base = pag-&gt;getBaseObjVar(<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>);</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <a class="code" href="classSVF_1_1GepObjVar.html">GepObjVar</a> *gepNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1GepObjVar.html">GepObjVar</a>&gt;(pag-&gt;getGNode(<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>));</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; assert(gepNode &amp;&amp; <span class="stringliteral">&quot;Not a gep node in redundantGepNodes set&quot;</span>);</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LocationSet.html">LocationSet</a> ls = gepNode-&gt;<a class="code" href="classSVF_1_1GepObjVar.html#a553e648804b39c503e7288dd0434c339">getLocationSet</a>();</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; GepObjVarMap.erase(std::make_pair(base, ls));</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; memToFieldsMap[base].reset(<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; cleanConsCG(<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; pag-&gt;removeGNode(gepNode);</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; }</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160;}</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;</div><div class="line"><a name="l00187"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a20617a69c112ad423b1b5021e48a8548"> 187</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a20617a69c112ad423b1b5021e48a8548">Andersen::initialize</a>()</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160;{</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; resetData();</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <a class="code" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac">AndersenBase::initialize</a>();</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a8459d43a21bcf8a50fc55d14fcf5a81e">Options::ClusterAnder</a>) cluster();</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; processAllAddr();</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;}</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160;</div><div class="line"><a name="l00201"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c"> 201</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c">Andersen::finalize</a>()</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; <span class="comment">// TODO: check -stat too.</span></div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="comment">// TODO: broken</span></div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a8459d43a21bcf8a50fc55d14fcf5a81e">Options::ClusterAnder</a>)</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; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::string, std::string&gt;</a> stats;</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTData.html">PTDataTy</a> *ptd = getPTDataTy();</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="comment">// TODO: should we use liveOnly?</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="comment">// TODO: parameterise final arg.</span></div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#acbbc5c04c79846fe1cc46a3bd5a65aba">NodeIDAllocator::Clusterer::evaluate</a>(*<a class="code" href="classSVF_1_1PointsTo.html#a6c1885ddfcc72604463f7c4ea94d2f74">PointsTo::getCurrentBestNodeMapping</a>(), ptd-&gt;<a class="code" href="classSVF_1_1PTData.html#adbe2b955f119871b54dc502de84b94c4">getAllPts</a>(<span class="keyword">true</span>), stats, <span class="keyword">true</span>);</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7">NodeIDAllocator::Clusterer::printStats</a>(<span class="stringliteral">&quot;post-main&quot;</span>, stats);</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="l00217"></a><span class="lineno"> 217</span>&#160; <span class="comment">// sanitizePts();</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <a class="code" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67">AndersenBase::finalize</a>();</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"> 220</span>&#160;</div><div class="line"><a name="l00224"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1"> 224</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1">Andersen::processNode</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId)</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160;{</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="comment">// sub nodes do not need to be processed</span></div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <span class="keywordflow">if</span> (sccRepNode(nodeId) != nodeId)</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keywordflow">return</span>;</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; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG-&gt;getConstraintNode(nodeId);</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keywordtype">double</span> insertStart = stat-&gt;getClk();</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; handleLoadStore(node);</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordtype">double</span> insertEnd = stat-&gt;getClk();</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; timeOfProcessLoadStore += (insertEnd - insertStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="keywordtype">double</span> propStart = stat-&gt;getClk();</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; handleCopyGep(node);</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="keywordtype">double</span> propEnd = stat-&gt;getClk();</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; timeOfProcessCopyGep += (propEnd - propStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160;}</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160;</div><div class="line"><a name="l00245"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ab069683dd6ca563113efbde2813ab35e"> 245</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ab069683dd6ca563113efbde2813ab35e">Andersen::handleCopyGep</a>(<a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node)</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160;{</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; computeDiffPts(nodeId);</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; <span class="keywordflow">if</span> (!getDiffPts(nodeId).empty())</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; {</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge : node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#ab77173aa8af6155b569f20ff0cdcec72">getCopyOutEdges</a>())</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; processCopy(nodeId, edge);</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge : node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a19d3d2c996ba821227a836717e5443c8">getGepOutEdges</a>())</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; {</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* gepEdge = SVFUtil::dyn_cast&lt;GepCGEdge&gt;(edge))</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; processGep(nodeId, gepEdge);</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; }</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; }</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160;}</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160;</div><div class="line"><a name="l00265"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a0f32ba8cb1109c257552fa775a007ffd"> 265</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a0f32ba8cb1109c257552fa775a007ffd">Andersen::handleLoadStore</a>(<a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a> *node)</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> piter = getPts(nodeId).begin(), epiter =</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; getPts(nodeId).end(); piter != epiter; ++piter)</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> ptd = *piter;</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="comment">// handle load</span></div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#af69c7e623ab5a36644b6aeabaa1a1e28">outgoingLoadsBegin</a>(),</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; eit = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a134e8ed040d7749c2b9a02662115f746">outgoingLoadsEnd</a>(); it != eit; ++it)</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; {</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; <span class="keywordflow">if</span> (processLoad(ptd, *it))</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; pushIntoWorklist(ptd);</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; }</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160;</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="comment">// handle store</span></div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a5a90b39f9e5769bde44a673806270714">incomingStoresBegin</a>(),</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; eit = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a8d58f5224728bb6811f12c94826167f6">incomingStoresEnd</a>(); it != eit; ++it)</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; {</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="keywordflow">if</span> (processStore(ptd, *it))</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; pushIntoWorklist((*it)-&gt;getSrcID());</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; }</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;}</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160;</div><div class="line"><a name="l00293"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10"> 293</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10">Andersen::processAllAddr</a>()</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="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">ConstraintGraph::const_iterator</a> nodeIt = consCG-&gt;begin(), nodeEit = consCG-&gt;end(); nodeIt != nodeEit; nodeIt++)</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; {</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a> * cgNode = nodeIt-&gt;second;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = cgNode-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a19c1ed324f65f4cc58dd2fd21ed4a971">incomingAddrsBegin</a>(), eit = cgNode-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#ae8ac9ad8e766b961c7ce06d7219f37af">incomingAddrsEnd</a>();</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; it != eit; ++it)</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; processAddr(SVFUtil::cast&lt;AddrCGEdge&gt;(*it));</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;}</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160;</div><div class="line"><a name="l00307"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#aca095e135edb5d27efe76bb7ee71184c"> 307</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#aca095e135edb5d27efe76bb7ee71184c">Andersen::processAddr</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1AddrCGEdge.html">AddrCGEdge</a>* addr)</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; numOfProcessedAddr++;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dst = addr-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> src = addr-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="keywordflow">if</span>(addPts(dst,src))</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; pushIntoWorklist(dst);</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="l00322"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de"> 322</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de">Andersen::processLoad</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> node, <span class="keyword">const</span> <a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* load)</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160;{</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160;<span class="comment">// if (pag-&gt;isBlkObjOrConstantObj(node) || isNonPointerObj(node))</span></div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <span class="keywordflow">if</span> (pag-&gt;isConstantObj(node) || isNonPointerObj(node))</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160;</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; numOfProcessedLoad++;</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dst = load-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="keywordflow">return</span> addCopyEdge(node, dst);</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160;}</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160;</div><div class="line"><a name="l00342"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024"> 342</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024">Andersen::processStore</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> node, <span class="keyword">const</span> <a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* store)</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160;{</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160;<span class="comment">// if (pag-&gt;isBlkObjOrConstantObj(node) || isNonPointerObj(node))</span></div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="keywordflow">if</span> (pag-&gt;isConstantObj(node) || isNonPointerObj(node))</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160;</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; numOfProcessedStore++;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160;</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> src = store-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <span class="keywordflow">return</span> addCopyEdge(src, node);</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="l00362"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2"> 362</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2">Andersen::processCopy</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> node, <span class="keyword">const</span> <a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge)</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160;{</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; numOfProcessedCopy++;</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; assert((SVFUtil::isa&lt;CopyCGEdge&gt;(edge)) &amp;&amp; <span class="stringliteral">&quot;not copy/call/ret ??&quot;</span>);</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dst = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; srcPts = getDiffPts(node);</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="keywordtype">bool</span> changed = unionPts(dst, srcPts);</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keywordflow">if</span> (changed)</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; pushIntoWorklist(dst);</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160;}</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160;</div><div class="line"><a name="l00382"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f"> 382</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f">Andersen::processGep</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a>, <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* edge)</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160;{</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; srcPts = getDiffPts(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>());</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keywordflow">return</span> processGepPts(srcPts, edge);</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160;}</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160;</div><div class="line"><a name="l00391"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac6b1efcaadfed48c226701ecf6bac55e"> 391</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac6b1efcaadfed48c226701ecf6bac55e">Andersen::processGepPts</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; pts, <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* edge)</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160;{</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; numOfProcessedGep++;</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> tmpDstPts;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;VariantGepCGEdge&gt;(edge))</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; <span class="comment">// If a pointer is connected by a variant gep edge,</span></div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="comment">// then set this memory object to be field insensitive,</span></div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="comment">// unless the object is a black hole/constant.</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts)</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"> 403</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isBlkObjOrConstantObj(o))</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; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; }</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160;</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="keywordflow">if</span> (!isFieldInsensitive(o))</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; {</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; setObjFieldInsensitive(o);</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; consCG-&gt;addNodeToBeCollapsed(consCG-&gt;getBaseObjVar(o));</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; }</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160;</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="comment">// Add the field-insensitive node into pts.</span></div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> baseId = consCG-&gt;getFIObjVar(o);</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(baseId);</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; }</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; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1NormalGepCGEdge.html">NormalGepCGEdge</a>* normalGepEdge = SVFUtil::dyn_cast&lt;NormalGepCGEdge&gt;(edge))</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; {</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="comment">// TODO: after the node is set to field insensitive, handling invariant</span></div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="comment">// gep edge may lose precision because offsets here are ignored, and the</span></div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; <span class="comment">// base object is always returned.</span></div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts)</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; {</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isBlkObjOrConstantObj(o) || isFieldInsensitive(o))</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; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; }</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160;</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> fieldSrcPtdNode = consCG-&gt;getGepObjVar(o, normalGepEdge-&gt;getLocationSet());</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(fieldSrcPtdNode);</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; }</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; <span class="keywordflow">else</span></div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; {</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;Andersen::processGepPts: New type GEP edge type?&quot;</span>);</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; }</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160;</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dstId = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="keywordflow">if</span> (unionPts(dstId, tmpDstPts))</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; pushIntoWorklist(dstId);</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; }</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160;</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160;}</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160;</div><div class="line"><a name="l00455"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae79bff0e9c49f15e7db00ed605824d98"> 455</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ae79bff0e9c49f15e7db00ed605824d98">Andersen::collapsePWCNode</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId)</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"> 457</span>&#160; <span class="comment">// If a node is a PWC node, collapse all its points-to tarsget.</span></div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="comment">// collapseNodePts() may change the points-to set of the nodes which have been processed</span></div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="comment">// before, in this case, we may need to re-do the analysis.</span></div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isPWCNode(nodeId) &amp;&amp; collapseNodePts(nodeId))</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; reanalyze = <span class="keyword">true</span>;</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;</div><div class="line"><a name="l00464"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac22a6946de30bc5887b9e4ec9259764f"> 464</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ac22a6946de30bc5887b9e4ec9259764f">Andersen::collapseFields</a>()</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="keywordflow">while</span> (consCG-&gt;hasNodesToBeCollapsed())</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; {</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> node = consCG-&gt;getNextCollapseNode();</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="comment">// collapseField() may change the points-to set of the nodes which have been processed</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="comment">// before, in this case, we may need to re-do the analysis.</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="keywordflow">if</span> (collapseField(node))</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; reanalyze = <span class="keyword">true</span>;</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; }</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160;}</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160;</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160;<span class="comment"> * Merge constraint graph nodes based on SCC cycle detected.</span></div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00479"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef"> 479</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef">Andersen::mergeSccCycle</a>()</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160;{</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a> revTopoOrder;</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a> &amp; topoOrder = getSCCDetector()-&gt;topoNodeStack();</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="keywordflow">while</span> (!topoOrder.empty())</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; {</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> repNodeId = topoOrder.top();</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; topoOrder.pop();</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; revTopoOrder.push(repNodeId);</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>&amp; subNodes = getSCCDetector()-&gt;subNodes(repNodeId);</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <span class="comment">// merge sub nodes to rep node</span></div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; mergeSccNodes(repNodeId, subNodes);</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;</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; <span class="comment">// restore the topological order for later solving.</span></div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; <span class="keywordflow">while</span> (!revTopoOrder.empty())</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId = revTopoOrder.top();</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; revTopoOrder.pop();</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; topoOrder.push(nodeId);</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;}</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;</div><div class="line"><a name="l00507"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a"> 507</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a">Andersen::mergeSccNodes</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> repNodeId, <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>&amp; subNodes)</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; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">NodeBS::iterator</a> nodeIt = subNodes.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(); nodeIt != subNodes.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); nodeIt++)</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; {</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> subNodeId = *nodeIt;</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <span class="keywordflow">if</span> (subNodeId != repNodeId)</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; {</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; mergeNodeToRep(subNodeId, repNodeId);</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; }</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; }</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160;}</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160;</div><div class="line"><a name="l00522"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e"> 522</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e">Andersen::collapseNodePts</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId)</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; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; nodePts = getPts(nodeId);</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> ptsClone = nodePts;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> ptsIt = ptsClone.<a class="code" href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">begin</a>(), ptsEit = ptsClone.<a class="code" href="classSVF_1_1PointsTo.html#a8f741cdffbf3c5fe0f602cdca677dee6">end</a>(); ptsIt != ptsEit; ptsIt++)</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; {</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; <span class="keywordflow">if</span> (isFieldInsensitive(*ptsIt))</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <span class="keywordflow">continue</span>;</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; <span class="keywordflow">if</span> (collapseField(*ptsIt))</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; }</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160;}</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160;</div><div class="line"><a name="l00542"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61"> 542</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61">Andersen::collapseField</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId)</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160;{</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isBlkObjOrConstantObj(nodeId))</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</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; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160;</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; <span class="keywordtype">double</span> start = stat-&gt;getClk();</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160;</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="comment">// set base node field-insensitive.</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; setObjFieldInsensitive(nodeId);</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="comment">// replace all occurrences of each field with the field-insensitive node</span></div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> baseId = consCG-&gt;getFIObjVar(nodeId);</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> baseRepNodeId = consCG-&gt;sccRepNode(baseId);</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &amp; allFields = consCG-&gt;getAllFieldsObjVars(baseId);</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">NodeBS::iterator</a> fieldIt = allFields.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), fieldEit = allFields.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); fieldIt != fieldEit; fieldIt++)</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; {</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> fieldId = *fieldIt;</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; <span class="keywordflow">if</span> (fieldId != baseId)</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; {</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="comment">// use the reverse pts of this field node to find all pointers point to it</span></div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a212231734fa43d5c7414137deaac7df3">NodeSet</a> revPts = getRevPts(fieldId);</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : revPts)</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; {</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <span class="comment">// change the points-to target from field to base node</span></div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; clearPts(o, fieldId);</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; addPts(o, baseId);</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; pushIntoWorklist(o);</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160;</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; }</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <span class="comment">// merge field node into base node, including edges and pts.</span></div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> fieldRepNodeId = consCG-&gt;sccRepNode(fieldId);</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; mergeNodeToRep(fieldRepNodeId, baseRepNodeId);</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; <span class="keywordflow">if</span> (fieldId != baseRepNodeId)</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; {</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <span class="comment">// gep node fieldId becomes redundant if it is merged to its base node who is set as field-insensitive</span></div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="comment">// two node IDs should be different otherwise this field is actually the base and should not be removed.</span></div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; redundantGepNodes.set(fieldId);</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; }</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; }</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; }</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isPWCNode(baseRepNodeId))</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="keywordflow">if</span> (collapseNodePts(baseRepNodeId))</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160;</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="keywordtype">double</span> end = stat-&gt;getClk();</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; timeOfCollapse += (end - start) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160;</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <span class="keywordflow">return</span> changed;</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;</div><div class="line"><a name="l00603"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc"> 603</a></span>&#160;<a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a>&amp; <a class="code" href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc">Andersen::SCCDetect</a>()</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160;{</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; numOfSCCDetection++;</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160;</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <span class="keywordtype">double</span> sccStart = stat-&gt;getClk();</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; <a class="code" href="classSVF_1_1WPASolver.html#aaa932894d00b69cfa741f9987a9cc6b8">WPAConstraintSolver::SCCDetect</a>();</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; <span class="keywordtype">double</span> sccEnd = stat-&gt;getClk();</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160;</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; timeOfSCCDetection += (sccEnd - sccStart)/<a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160;</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; <span class="keywordtype">double</span> mergeStart = stat-&gt;getClk();</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160;</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; mergeSccCycle();</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160;</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <span class="keywordtype">double</span> mergeEnd = stat-&gt;getClk();</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; timeOfSCCMerges += (mergeEnd - mergeStart)/<a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</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; <span class="keywordflow">return</span> getSCCDetector()-&gt;topoNodeStack();</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160;}</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160;</div><div class="line"><a name="l00627"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a6c60b761ddf3d6bf08c8a9c3f6fd9f0b"> 627</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#a6c60b761ddf3d6bf08c8a9c3f6fd9f0b">Andersen::updateCallGraph</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PointerAnalysis.html#ad95c842964e6ca46e51fb763fefec585">CallSiteToFunPtrMap</a>&amp; callsites)</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160;{</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160;</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <span class="keywordtype">double</span> cgUpdateStart = stat-&gt;getClk();</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; <a class="code" href="classSVF_1_1PointerAnalysis.html#a35bd5f0fb2c146199e9f1aa6a19b4062">CallEdgeMap</a> newEdges;</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; onTheFlyCallGraphSolve(callsites,newEdges);</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> cpySrcNodes; </div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; <span class="keywordflow">for</span>(CallEdgeMap::iterator it = newEdges.begin(), eit = newEdges.end(); it!=eit; ++it )</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; {</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a9815a5b31ac7dc21239d08e5b9f61106">SVFUtil::getSVFCallSite</a>(it-&gt;first-&gt;getCallSite());</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; <span class="keywordflow">for</span>(FunctionSet::iterator cit = it-&gt;second.begin(), ecit = it-&gt;second.end(); cit!=ecit; ++cit)</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; {</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; connectCaller2CalleeParams(cs,*cit,cpySrcNodes);</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; }</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; }</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; <span class="keywordflow">for</span>(NodePairSet::iterator it = cpySrcNodes.begin(), eit = cpySrcNodes.end(); it!=eit; ++it)</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; {</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; pushIntoWorklist(it-&gt;first);</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;</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; <span class="keywordtype">double</span> cgUpdateEnd = stat-&gt;getClk();</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; timeOfUpdateCallGraph += (cgUpdateEnd - cgUpdateStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160;</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; <span class="keywordflow">return</span> (!newEdges.empty());</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160;}</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160;</div><div class="line"><a name="l00654"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a7b1b9e9b25b5643440aca77e23a8de07"> 654</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a7b1b9e9b25b5643440aca77e23a8de07">Andersen::heapAllocatorViaIndCall</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs, <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> &amp;cpySrcNodes)</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160;{</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; assert(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(cs) == <span class="keyword">nullptr</span> &amp;&amp; <span class="stringliteral">&quot;not an indirect callsite?&quot;</span>);</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; <a class="code" href="classSVF_1_1RetICFGNode.html">RetICFGNode</a>* retBlockNode = pag-&gt;getICFG()-&gt;getRetICFGNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ac2a0091dab3543a398da890b947e42ef">getInstruction</a>());</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a>* cs_return = pag-&gt;getCallSiteRet(retBlockNode);</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> srcret;</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; CallSite2DummyValPN::const_iterator it = callsite2DummyValPN.find(cs);</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; <span class="keywordflow">if</span>(it != callsite2DummyValPN.end())</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"> 663</span>&#160; srcret = sccRepNode(it-&gt;second);</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; <span class="keywordflow">else</span></div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; {</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> valNode = pag-&gt;addDummyValNode();</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> objNode = pag-&gt;addDummyObjNode(cs.<a class="code" href="classSVF_1_1CallSite.html#a93e70225ce9c55ca65ea9d5cf737206f">getType</a>());</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; addPts(valNode,objNode);</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; callsite2DummyValPN.insert(std::make_pair(cs,valNode));</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; consCG-&gt;addConstraintNode(<span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>(valNode),valNode);</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; consCG-&gt;addConstraintNode(<span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>(objNode),objNode);</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; srcret = valNode;</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160; }</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dstrec = sccRepNode(cs_return-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; <span class="keywordflow">if</span>(addCopyEdge(srcret, dstrec))</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; cpySrcNodes.insert(std::make_pair(srcret,dstrec));</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160;}</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160;</div><div class="line"><a name="l00684"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a5a90e681e46c52ffd3debf02910c7ecf"> 684</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a5a90e681e46c52ffd3debf02910c7ecf">Andersen::connectCaller2CalleeParams</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs, <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* F, <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> &amp;cpySrcNodes)</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160;{</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; assert(F);</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;connect parameters from indirect callsite &quot;</span> &lt;&lt; cs.<a class="code" href="classSVF_1_1CallSite.html#ac2a0091dab3543a398da890b947e42ef">getInstruction</a>()-&gt;<a class="code" href="classSVF_1_1SVFValue.html#aa678ca4616a3e69b53726b33d0b9c5a2">toString</a>() &lt;&lt; <span class="stringliteral">&quot; to callee &quot;</span> &lt;&lt; *F &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160;</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* callBlockNode = pag-&gt;getICFG()-&gt;getCallICFGNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ac2a0091dab3543a398da890b947e42ef">getInstruction</a>());</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; <a class="code" href="classSVF_1_1RetICFGNode.html">RetICFGNode</a>* retBlockNode = pag-&gt;getICFG()-&gt;getRetICFGNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ac2a0091dab3543a398da890b947e42ef">getInstruction</a>());</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; <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a19b96a872d9096037f20e25122e469ea">SVFUtil::isHeapAllocExtFunViaRet</a>(F) &amp;&amp; pag-&gt;callsiteHasRet(retBlockNode))</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; heapAllocatorViaIndCall(cs,cpySrcNodes);</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; }</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">if</span> (pag-&gt;funHasRet(F) &amp;&amp; pag-&gt;callsiteHasRet(retBlockNode))</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; {</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a>* cs_return = pag-&gt;getCallSiteRet(retBlockNode);</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a>* fun_return = pag-&gt;getFunRet(F);</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; <span class="keywordflow">if</span> (cs_return-&gt;<a class="code" href="classSVF_1_1SVFVar.html#a3b61042079a6c9dc395f38925c6a1271">isPointer</a>() &amp;&amp; fun_return-&gt;<a class="code" href="classSVF_1_1SVFVar.html#a3b61042079a6c9dc395f38925c6a1271">isPointer</a>())</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dstrec = sccRepNode(cs_return-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> srcret = sccRepNode(fun_return-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <span class="keywordflow">if</span>(addCopyEdge(srcret, dstrec))</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; cpySrcNodes.insert(std::make_pair(srcret,dstrec));</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"> 710</span>&#160; }</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; {</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;not a pointer ignored\n&quot;</span>);</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; }</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;</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; <span class="keywordflow">if</span> (pag-&gt;hasCallSiteArgsMap(callBlockNode) &amp;&amp; pag-&gt;hasFunArgsList(F))</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;</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; <span class="comment">// connect actual and formal param</span></div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFIR.html#a64939d7ecfd8e2cf862782954a56596b">SVFIR::SVFVarList</a>&amp; csArgList = pag-&gt;getCallSiteArgsList(callBlockNode);</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFIR.html#a64939d7ecfd8e2cf862782954a56596b">SVFIR::SVFVarList</a>&amp; funArgList = pag-&gt;getFunArgsList(F);</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; <span class="comment">//Go through the fixed parameters.</span></div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot; args:&quot;</span>);</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; SVFIR::SVFVarList::const_iterator funArgIt = funArgList.begin(), funArgEit = funArgList.end();</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; SVFIR::SVFVarList::const_iterator csArgIt = csArgList.begin(), csArgEit = csArgList.end();</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; <span class="keywordflow">for</span> (; funArgIt != funArgEit; ++csArgIt, ++funArgIt)</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; {</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; <span class="comment">//Some programs (e.g. Linux kernel) leave unneeded parameters empty.</span></div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; <span class="keywordflow">if</span> (csArgIt == csArgEit)</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; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot; !! not enough args\n&quot;</span>);</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; }</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *cs_arg = *csArgIt ;</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *fun_arg = *funArgIt;</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="keywordflow">if</span> (cs_arg-&gt;<a class="code" href="classSVF_1_1SVFVar.html#a3b61042079a6c9dc395f38925c6a1271">isPointer</a>() &amp;&amp; fun_arg-&gt;<a class="code" href="classSVF_1_1SVFVar.html#a3b61042079a6c9dc395f38925c6a1271">isPointer</a>())</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; {</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;process actual parm &quot;</span> &lt;&lt; cs_arg-&gt;<a class="code" href="classSVF_1_1SVFVar.html#ada932ef2ae0a3e712174df479c35b0dd">toString</a>() &lt;&lt; <span class="stringliteral">&quot; \n&quot;</span>);</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> srcAA = sccRepNode(cs_arg-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dstFA = sccRepNode(fun_arg-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; <span class="keywordflow">if</span>(addCopyEdge(srcAA, dstFA))</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; {</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; cpySrcNodes.insert(std::make_pair(srcAA,dstFA));</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; }</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; }</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; <span class="comment">//Any remaining actual args must be varargs.</span></div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; <span class="keywordflow">if</span> (F-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ae578002917b4ccbf28f172dba30d1d58">isVarArg</a>())</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> vaF = sccRepNode(pag-&gt;getVarargNode(F));</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n varargs:&quot;</span>);</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; <span class="keywordflow">for</span> (; csArgIt != csArgEit; ++csArgIt)</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; {</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *cs_arg = *csArgIt;</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160; <span class="keywordflow">if</span> (cs_arg-&gt;<a class="code" href="classSVF_1_1SVFVar.html#a3b61042079a6c9dc395f38925c6a1271">isPointer</a>())</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> vnAA = sccRepNode(cs_arg-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; <span class="keywordflow">if</span> (addCopyEdge(vnAA,vaF))</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; cpySrcNodes.insert(std::make_pair(vnAA,vaF));</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; }</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; }</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; }</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; }</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; <span class="keywordflow">if</span>(csArgIt != csArgEit)</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; {</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">&quot;too many args to non-vararg func.&quot;</span>);</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">&quot;(&quot;</span> + cs.<a class="code" href="classSVF_1_1CallSite.html#ac2a0091dab3543a398da890b947e42ef">getInstruction</a>()-&gt;<a class="code" href="classSVF_1_1SVFValue.html#a7effb0f37f486745e0cdc3ae5e9c732b">getSourceLoc</a>() + <span class="stringliteral">&quot;)&quot;</span>);</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160; }</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; }</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160;}</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160;</div><div class="line"><a name="l00779"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e"> 779</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e">Andersen::mergeSrcToTgt</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> newRepId)</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160;{</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160;</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; <span class="keywordflow">if</span>(nodeId==newRepId)</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160;</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; updatePropaPts(newRepId, nodeId);</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; unionPts(newRepId,nodeId);</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160;</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG-&gt;getConstraintNode(nodeId);</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160; <span class="keywordtype">bool</span> pwc = consCG-&gt;moveEdgesToRepNode(node, consCG-&gt;getConstraintNode(newRepId));</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160;</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; <span class="keywordflow">if</span>(node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a0ffe4f1ca1a6f70466cc1c6b3b12c90d">isPWCNode</a>())</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; pwc = <span class="keyword">true</span>;</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160;</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; updateNodeRepAndSubs(node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(),newRepId);</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; consCG-&gt;removeConstraintNode(node);</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160;</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; <span class="keywordflow">return</span> pwc;</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160;}</div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160;<span class="comment"> * Merge a node to its rep node based on SCC detection</span></div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00810"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848"> 810</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848">Andersen::mergeNodeToRep</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId,<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> newRepId)</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">if</span> (mergeSrcToTgt(nodeId,newRepId))</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; consCG-&gt;setPWCNode(newRepId);</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"> 816</span>&#160;</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160;<span class="comment"> * Updates subnodes of its rep, and rep node of its subs</span></div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00820"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18"> 820</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18">Andersen::updateNodeRepAndSubs</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> newRepId)</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160;{</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; consCG-&gt;setRep(nodeId,newRepId);</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> repSubs;</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; repSubs.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(nodeId);</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; <span class="comment">// update nodeToSubsMap, union its subs with its rep Subs</span></div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>&amp; nodeSubs = consCG-&gt;sccSubNodes(nodeId);</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="keywordflow">for</span>(<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">NodeBS::iterator</a> sit = nodeSubs.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), esit = nodeSubs.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); sit!=esit; ++sit)</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; {</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> subId = *sit;</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; consCG-&gt;setRep(subId,newRepId);</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; repSubs |= nodeSubs;</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; consCG-&gt;setSubs(newRepId,repSubs);</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; consCG-&gt;resetSubs(nodeId);</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;</div><div class="line"><a name="l00838"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae1ff65a411f2c4dfee0973ad4af48daf"> 838</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ae1ff65a411f2c4dfee0973ad4af48daf">Andersen::cluster</a>(<span class="keywordtype">void</span>)<span class="keyword"> const</span></div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; assert(<a class="code" href="classSVF_1_1Options.html#adfc1a5c6098d3867e29fc65ca9ffa1cc">Options::MaxFieldLimit</a> == 0 &amp;&amp; <span class="stringliteral">&quot;Andersen::cluster: clustering for Andersen&#39;s is currently only supported in field-insesnsitive analysis&quot;</span>);</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; <a class="code" href="classSVF_1_1Steensgaard.html">Steensgaard</a> *steens = <a class="code" href="classSVF_1_1Steensgaard.html#acd5f31c3b1f9b47def458637f8e9389e">Steensgaard::createSteensgaard</a>(pag);</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; std::vector&lt;std::pair&lt;unsigned, unsigned&gt;&gt; keys;</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFIR::iterator</a> pit = pag-&gt;begin(); pit != pag-&gt;end(); ++pit)</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; keys.push_back(std::make_pair(pit-&gt;first, 1));</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;</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; std::vector&lt;std::pair&lt;hclust_fast_methods, std::vector&lt;NodeID&gt;&gt;&gt; candidates;</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> nodeMapping =</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; std::make_shared&lt;std::vector&lt;NodeID&gt;&gt;(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b">NodeIDAllocator::Clusterer::cluster</a>(steens, keys, candidates, <span class="stringliteral">&quot;aux-steens&quot;</span>));</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> reverseNodeMapping =</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; std::make_shared&lt;std::vector&lt;NodeID&gt;&gt;(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f">NodeIDAllocator::Clusterer::getReverseNodeMapping</a>(*nodeMapping));</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; <a class="code" href="classSVF_1_1PointsTo.html#a84eca4c7fc833f8ca4d119cd4da08ca8">PointsTo::setCurrentBestNodeMapping</a>(nodeMapping, reverseNodeMapping);</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160;}</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160;</div><div class="line"><a name="l00860"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a"> 860</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a">Andersen::dumpTopLevelPtsTo</a>()</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160;{</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; <span class="keywordflow">for</span> (OrderedNodeSet::iterator nIter = this-&gt;getAllValidPtrs().begin();</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; nIter != this-&gt;getAllValidPtrs().end(); ++nIter)</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; {</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a>* node = getPAG()-&gt;getGNode(*nIter);</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; <span class="keywordflow">if</span> (getPAG()-&gt;isValidTopLevelPtr(node))</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; {</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; pts = this-&gt;getPts(node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nNodeID &quot;</span> &lt;&lt; node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>() &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</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">if</span> (pts.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>())</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; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t\tPointsTo: {empty}\n\n&quot;</span>;</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; }</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; <span class="keywordflow">else</span></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; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t\tPointsTo: { &quot;</span>;</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160;</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; multiset&lt;u32_t&gt; line;</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> it = pts.<a class="code" href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">begin</a>(), eit = pts.<a class="code" href="classSVF_1_1PointsTo.html#a8f741cdffbf3c5fe0f602cdca677dee6">end</a>();</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; it != eit; ++it)</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; line.insert(*it);</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="keywordflow">for</span> (multiset&lt;u32_t&gt;::const_iterator it = line.begin(); it != line.end(); ++it)</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; *it &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;}\n\n&quot;</span>;</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; }</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160;</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>().flush();</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="ttc" id="SVFType_8h_html_a7a295e02c56a93cf9206dd9d3b18dd17"><div class="ttname"><a href="SVFType_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a></div><div class="ttdeci">#define DPAGBuild</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00426">SVFType.h:426</a></div></div>
69
+ <a href="Andersen_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">//===- Andersen.cpp -- Field-sensitive Andersen&#39;s analysis-------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// Copyright (C) &lt;2013-2017&gt; &lt;Yulei Sui&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">// along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment"> * Andersen.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment"> * Created on: Nov 12, 2013</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment"> * Author: Yulei Sui</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Options_8h.html">Util/Options.h</a>&quot;</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="CHG_8h.html">Graphs/CHG.h</a>&quot;</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</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="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="PointsTo_8h.html">MemoryModel/PointsTo.h</a>&quot;</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Andersen_8h.html">WPA/Andersen.h</a>&quot;</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Steensgaard_8h.html">WPA/Steensgaard.h</a>&quot;</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceSVFUtil.html">SVFUtil</a>;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacestd.html">std</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;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a4acad18a6eb585ba9e3d2276dd591067">AndersenBase::numOfProcessedAddr</a> = 0;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a04acd871bd1b98cd9e83e395334ac130">AndersenBase::numOfProcessedCopy</a> = 0;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#aa1246b392aeae1fd10c8a9ebedcc2dd9">AndersenBase::numOfProcessedGep</a> = 0;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a69aae96fc1c99bf108075e5061f50f9e">AndersenBase::numOfProcessedLoad</a> = 0;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a2b763519509ce21cf40893c01f8357b6">AndersenBase::numOfProcessedStore</a> = 0;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a25b00d9ca71cbdd27530fc5d0dc84ee5">AndersenBase::numOfSfrs</a> = 0;</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a9f453ec1b4236b8194ae590981217259">AndersenBase::numOfFieldExpand</a> = 0;</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;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a0d7298cbf83568f24fd2bd1926a32968">AndersenBase::numOfSCCDetection</a> = 0;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a6b7d0e57f741c446d0bf178939960143">AndersenBase::timeOfSCCDetection</a> = 0;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a02c5a50b214d36921e1404784e76704d">AndersenBase::timeOfSCCMerges</a> = 0;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#ad40b196c2c699bd115529b806d20de25">AndersenBase::timeOfCollapse</a> = 0;</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;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#adaf738bee77a4b1fbb8d42911fabdb49">AndersenBase::AveragePointsToSetSize</a> = 0;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#abd73e930450b7c605f478672bdf9bdae">AndersenBase::MaxPointsToSetSize</a> = 0;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#aae14de6fbca9280d8d0290326aa493f0">AndersenBase::timeOfProcessCopyGep</a> = 0;</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a9fe738f1e11c80006d540f246a80bfdf">AndersenBase::timeOfProcessLoadStore</a> = 0;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a2afb49f513c9534fd051117b59dc056b">AndersenBase::timeOfUpdateCallGraph</a> = 0;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;</div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a8da8746b38c55561d3f6904e8fd0a9aa"> 64</a></span>&#160;<a class="code" href="classSVF_1_1AndersenBase.html#a8da8746b38c55561d3f6904e8fd0a9aa">AndersenBase::~AndersenBase</a>()</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; <span class="keyword">delete</span> consCG;</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; consCG = <span class="keyword">nullptr</span>;</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;</div><div class="line"><a name="l00073"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac"> 73</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac">AndersenBase::initialize</a>()</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160;{</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <a class="code" href="classSVF_1_1PointerAnalysis.html#a431ec4f85eb0f029e5740b92fd9ceb32">PointerAnalysis::initialize</a>();</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; consCG = <span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintGraph.html">ConstraintGraph</a>(pag);</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; setGraph(consCG);</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; stat = <span class="keyword">new</span> <a class="code" href="classSVF_1_1AndersenStat.html">AndersenStat</a>(<span class="keyword">this</span>);</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a69a7d0431c0ddfefed1cb97f3571303a">Options::ConsCGDotGraph</a>)</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; consCG-&gt;dump(<span class="stringliteral">&quot;consCG_initial&quot;</span>);</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;</div><div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67"> 89</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67">AndersenBase::finalize</a>()</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;{</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a69a7d0431c0ddfefed1cb97f3571303a">Options::ConsCGDotGraph</a>)</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; consCG-&gt;dump(<span class="stringliteral">&quot;consCG_final&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; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a87516daebb3d1b5fee9037068d60e268">Options::PrintCGGraph</a>)</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; consCG-&gt;print();</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a57ff2bf45ede7a730a8adaba8e61179d">BVDataPTAImpl::finalize</a>();</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;}</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;</div><div class="line"><a name="l00103"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a944966086ecb716184c8cdcc43db5751"> 103</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a944966086ecb716184c8cdcc43db5751">AndersenBase::analyze</a>()</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160;{</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; initialize();</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="keywordtype">bool</span> readResultsFromFile = <span class="keyword">false</span>;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keywordflow">if</span>(!<a class="code" href="classSVF_1_1Options.html#a98a521e5c99c5248eae8f8234453b116">Options::ReadAnder</a>.empty())</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; {</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; readResultsFromFile = this-&gt;readFromFile(<a class="code" href="classSVF_1_1Options.html#a98a521e5c99c5248eae8f8234453b116">Options::ReadAnder</a>);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="comment">// Finalize the analysis</span></div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; <a class="code" href="classSVF_1_1PointerAnalysis.html#a118dabc50024b5cd91095814ade47166">PointerAnalysis::finalize</a>();</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; }</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">if</span>(!readResultsFromFile)</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; {</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="comment">// Start solving constraints</span></div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">&quot;Start Solving Constraints\n&quot;</span>));</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordtype">bool</span> limitTimerSet = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a757815a2c758695176120509ceb0ce70">SVFUtil::startAnalysisLimitTimer</a>(<a class="code" href="classSVF_1_1Options.html#a620fe156ba70f997eace0ccb0d2c9f67">Options::AnderTimeLimit</a>);</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; initWorklist();</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordflow">do</span></div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; {</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; numOfIteration++;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keywordflow">if</span> (0 == numOfIteration % iterationForPrintStat)</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; printStat();</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; reanalyze = <span class="keyword">false</span>;</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; solveWorklist();</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; <span class="keywordflow">if</span> (updateCallGraph(getIndirectCallsites()))</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; reanalyze = <span class="keyword">true</span>;</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"> 138</span>&#160; <span class="keywordflow">while</span> (reanalyze);</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; <span class="comment">// Analysis is finished, reset the alarm if we set it.</span></div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a168f7f7a3a8c70dbf2b5b4269cd4c7c5">SVFUtil::stopAnalysisLimitTimer</a>(limitTimerSet);</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">&quot;Finish Solving Constraints\n&quot;</span>));</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="comment">// Finalize the analysis</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; finalize();</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; }</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classSVF_1_1Options.html#a4c7eb57066c80c62ef394d644833214a">Options::WriteAnder</a>.empty())</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; this-&gt;writeToFile(<a class="code" href="classSVF_1_1Options.html#a4c7eb57066c80c62ef394d644833214a">Options::WriteAnder</a>);</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;</div><div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#aebfe0c7238eb24f74f105b950b86cb5e"> 153</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#aebfe0c7238eb24f74f105b950b86cb5e">AndersenBase::cleanConsCG</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <span class="keywordtype">id</span>)</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; consCG-&gt;resetSubs(consCG-&gt;getRep(<span class="keywordtype">id</span>));</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> sub: consCG-&gt;getSubs(<span class="keywordtype">id</span>))</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; consCG-&gt;resetRep(sub);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; consCG-&gt;resetSubs(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; consCG-&gt;resetRep(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; assert(!consCG-&gt;hasGNode(<span class="keywordtype">id</span>) &amp;&amp; <span class="stringliteral">&quot;this is either a rep nodeid or a sub nodeid should have already been merged to its field-insensitive base! &quot;</span>);</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160;}</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;</div><div class="line"><a name="l00163"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#af37392229dab0a1f2f807a12186c3b39"> 163</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#af37392229dab0a1f2f807a12186c3b39">AndersenBase::normalizePointsTo</a>()</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; <a class="code" href="classSVF_1_1SVFIR.html#ab6abb822445c9b3f5cb2b7206042e940">SVFIR::MemObjToFieldsMap</a> &amp;memToFieldsMap = pag-&gt;getMemToFieldsMap();</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <a class="code" href="classSVF_1_1SVFIR.html#aa5b08d987b37d35e73de88da10a97bc4">SVFIR::NodeLocationSetMap</a> &amp;GepObjVarMap = pag-&gt;getGepObjNodeMap();</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="comment">// clear GepObjVarMap/memToFieldsMap/nodeToSubsMap/nodeToRepMap</span></div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="comment">// for redundant gepnodes and remove those nodes from pag</span></div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>: redundantGepNodes)</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> base = pag-&gt;getBaseObjVar(<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>);</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <a class="code" href="classSVF_1_1GepObjVar.html">GepObjVar</a> *gepNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1GepObjVar.html">GepObjVar</a>&gt;(pag-&gt;getGNode(<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>));</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; assert(gepNode &amp;&amp; <span class="stringliteral">&quot;Not a gep node in redundantGepNodes set&quot;</span>);</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LocationSet.html">LocationSet</a> ls = gepNode-&gt;<a class="code" href="classSVF_1_1GepObjVar.html#a553e648804b39c503e7288dd0434c339">getLocationSet</a>();</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; GepObjVarMap.erase(std::make_pair(base, ls));</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; memToFieldsMap[base].reset(<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; cleanConsCG(<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; pag-&gt;removeGNode(gepNode);</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; }</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160;}</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;</div><div class="line"><a name="l00187"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a20617a69c112ad423b1b5021e48a8548"> 187</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a20617a69c112ad423b1b5021e48a8548">Andersen::initialize</a>()</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160;{</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; resetData();</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <a class="code" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac">AndersenBase::initialize</a>();</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a8459d43a21bcf8a50fc55d14fcf5a81e">Options::ClusterAnder</a>) cluster();</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; processAllAddr();</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;}</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160;</div><div class="line"><a name="l00201"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c"> 201</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c">Andersen::finalize</a>()</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; <span class="comment">// TODO: check -stat too.</span></div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="comment">// TODO: broken</span></div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a8459d43a21bcf8a50fc55d14fcf5a81e">Options::ClusterAnder</a>)</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; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::string, std::string&gt;</a> stats;</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTData.html">PTDataTy</a> *ptd = getPTDataTy();</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="comment">// TODO: should we use liveOnly?</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="comment">// TODO: parameterise final arg.</span></div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#acbbc5c04c79846fe1cc46a3bd5a65aba">NodeIDAllocator::Clusterer::evaluate</a>(*<a class="code" href="classSVF_1_1PointsTo.html#a6c1885ddfcc72604463f7c4ea94d2f74">PointsTo::getCurrentBestNodeMapping</a>(), ptd-&gt;<a class="code" href="classSVF_1_1PTData.html#adbe2b955f119871b54dc502de84b94c4">getAllPts</a>(<span class="keyword">true</span>), stats, <span class="keyword">true</span>);</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7">NodeIDAllocator::Clusterer::printStats</a>(<span class="stringliteral">&quot;post-main&quot;</span>, stats);</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="l00217"></a><span class="lineno"> 217</span>&#160; <span class="comment">// sanitizePts();</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <a class="code" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67">AndersenBase::finalize</a>();</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"> 220</span>&#160;</div><div class="line"><a name="l00224"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1"> 224</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1">Andersen::processNode</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId)</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160;{</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="comment">// sub nodes do not need to be processed</span></div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <span class="keywordflow">if</span> (sccRepNode(nodeId) != nodeId)</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keywordflow">return</span>;</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; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG-&gt;getConstraintNode(nodeId);</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keywordtype">double</span> insertStart = stat-&gt;getClk();</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; handleLoadStore(node);</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordtype">double</span> insertEnd = stat-&gt;getClk();</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; timeOfProcessLoadStore += (insertEnd - insertStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="keywordtype">double</span> propStart = stat-&gt;getClk();</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; handleCopyGep(node);</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="keywordtype">double</span> propEnd = stat-&gt;getClk();</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; timeOfProcessCopyGep += (propEnd - propStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160;}</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160;</div><div class="line"><a name="l00245"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ab069683dd6ca563113efbde2813ab35e"> 245</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ab069683dd6ca563113efbde2813ab35e">Andersen::handleCopyGep</a>(<a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node)</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160;{</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; computeDiffPts(nodeId);</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; <span class="keywordflow">if</span> (!getDiffPts(nodeId).empty())</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; {</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge : node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#ab77173aa8af6155b569f20ff0cdcec72">getCopyOutEdges</a>())</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; processCopy(nodeId, edge);</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge : node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a19d3d2c996ba821227a836717e5443c8">getGepOutEdges</a>())</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; {</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* gepEdge = SVFUtil::dyn_cast&lt;GepCGEdge&gt;(edge))</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; processGep(nodeId, gepEdge);</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; }</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; }</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160;}</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160;</div><div class="line"><a name="l00265"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a0f32ba8cb1109c257552fa775a007ffd"> 265</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a0f32ba8cb1109c257552fa775a007ffd">Andersen::handleLoadStore</a>(<a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a> *node)</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> piter = getPts(nodeId).begin(), epiter =</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; getPts(nodeId).end(); piter != epiter; ++piter)</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> ptd = *piter;</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="comment">// handle load</span></div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#af69c7e623ab5a36644b6aeabaa1a1e28">outgoingLoadsBegin</a>(),</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; eit = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a134e8ed040d7749c2b9a02662115f746">outgoingLoadsEnd</a>(); it != eit; ++it)</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; {</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160; <span class="keywordflow">if</span> (processLoad(ptd, *it))</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; pushIntoWorklist(ptd);</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; }</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160;</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="comment">// handle store</span></div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a5a90b39f9e5769bde44a673806270714">incomingStoresBegin</a>(),</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; eit = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a8d58f5224728bb6811f12c94826167f6">incomingStoresEnd</a>(); it != eit; ++it)</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; {</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="keywordflow">if</span> (processStore(ptd, *it))</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; pushIntoWorklist((*it)-&gt;getSrcID());</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; }</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;}</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160;</div><div class="line"><a name="l00293"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10"> 293</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10">Andersen::processAllAddr</a>()</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="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">ConstraintGraph::const_iterator</a> nodeIt = consCG-&gt;begin(), nodeEit = consCG-&gt;end(); nodeIt != nodeEit; nodeIt++)</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; {</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a> * cgNode = nodeIt-&gt;second;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = cgNode-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a19c1ed324f65f4cc58dd2fd21ed4a971">incomingAddrsBegin</a>(), eit = cgNode-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#ae8ac9ad8e766b961c7ce06d7219f37af">incomingAddrsEnd</a>();</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; it != eit; ++it)</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; processAddr(SVFUtil::cast&lt;AddrCGEdge&gt;(*it));</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;}</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160;</div><div class="line"><a name="l00307"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#aca095e135edb5d27efe76bb7ee71184c"> 307</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#aca095e135edb5d27efe76bb7ee71184c">Andersen::processAddr</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1AddrCGEdge.html">AddrCGEdge</a>* addr)</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; numOfProcessedAddr++;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dst = addr-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> src = addr-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="keywordflow">if</span>(addPts(dst,src))</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; pushIntoWorklist(dst);</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="l00322"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de"> 322</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de">Andersen::processLoad</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> node, <span class="keyword">const</span> <a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* load)</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160;{</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160;<span class="comment">// if (pag-&gt;isBlkObjOrConstantObj(node) || isNonPointerObj(node))</span></div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <span class="keywordflow">if</span> (pag-&gt;isConstantObj(node) || isNonPointerObj(node))</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160;</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; numOfProcessedLoad++;</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dst = load-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <span class="keywordflow">return</span> addCopyEdge(node, dst);</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160;}</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160;</div><div class="line"><a name="l00342"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024"> 342</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024">Andersen::processStore</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> node, <span class="keyword">const</span> <a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* store)</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160;{</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160;<span class="comment">// if (pag-&gt;isBlkObjOrConstantObj(node) || isNonPointerObj(node))</span></div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="keywordflow">if</span> (pag-&gt;isConstantObj(node) || isNonPointerObj(node))</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160;</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; numOfProcessedStore++;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160;</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> src = store-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <span class="keywordflow">return</span> addCopyEdge(src, node);</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="l00362"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2"> 362</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2">Andersen::processCopy</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> node, <span class="keyword">const</span> <a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge)</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160;{</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; numOfProcessedCopy++;</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; assert((SVFUtil::isa&lt;CopyCGEdge&gt;(edge)) &amp;&amp; <span class="stringliteral">&quot;not copy/call/ret ??&quot;</span>);</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dst = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; srcPts = getDiffPts(node);</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="keywordtype">bool</span> changed = unionPts(dst, srcPts);</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keywordflow">if</span> (changed)</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; pushIntoWorklist(dst);</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160;}</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160;</div><div class="line"><a name="l00382"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f"> 382</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f">Andersen::processGep</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a>, <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* edge)</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160;{</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; srcPts = getDiffPts(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>());</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <span class="keywordflow">return</span> processGepPts(srcPts, edge);</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160;}</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160;</div><div class="line"><a name="l00391"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac6b1efcaadfed48c226701ecf6bac55e"> 391</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac6b1efcaadfed48c226701ecf6bac55e">Andersen::processGepPts</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; pts, <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* edge)</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160;{</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; numOfProcessedGep++;</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> tmpDstPts;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;VariantGepCGEdge&gt;(edge))</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; <span class="comment">// If a pointer is connected by a variant gep edge,</span></div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="comment">// then set this memory object to be field insensitive,</span></div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="comment">// unless the object is a black hole/constant.</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts)</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"> 403</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isBlkObjOrConstantObj(o))</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; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; }</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160;</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="keywordflow">if</span> (!isFieldInsensitive(o))</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; {</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; setObjFieldInsensitive(o);</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; consCG-&gt;addNodeToBeCollapsed(consCG-&gt;getBaseObjVar(o));</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; }</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160;</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="comment">// Add the field-insensitive node into pts.</span></div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> baseId = consCG-&gt;getFIObjVar(o);</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(baseId);</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; }</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; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1NormalGepCGEdge.html">NormalGepCGEdge</a>* normalGepEdge = SVFUtil::dyn_cast&lt;NormalGepCGEdge&gt;(edge))</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; {</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="comment">// TODO: after the node is set to field insensitive, handling invariant</span></div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <span class="comment">// gep edge may lose precision because offsets here are ignored, and the</span></div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; <span class="comment">// base object is always returned.</span></div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : pts)</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; {</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isBlkObjOrConstantObj(o) || isFieldInsensitive(o))</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; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; }</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160;</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> fieldSrcPtdNode = consCG-&gt;getGepObjVar(o, normalGepEdge-&gt;getLocationSet());</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(fieldSrcPtdNode);</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; }</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; <span class="keywordflow">else</span></div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; {</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;Andersen::processGepPts: New type GEP edge type?&quot;</span>);</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; }</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160;</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dstId = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="keywordflow">if</span> (unionPts(dstId, tmpDstPts))</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; pushIntoWorklist(dstId);</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; }</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160;</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160;}</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160;</div><div class="line"><a name="l00455"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae79bff0e9c49f15e7db00ed605824d98"> 455</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ae79bff0e9c49f15e7db00ed605824d98">Andersen::collapsePWCNode</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId)</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"> 457</span>&#160; <span class="comment">// If a node is a PWC node, collapse all its points-to tarsget.</span></div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="comment">// collapseNodePts() may change the points-to set of the nodes which have been processed</span></div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="comment">// before, in this case, we may need to re-do the analysis.</span></div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isPWCNode(nodeId) &amp;&amp; collapseNodePts(nodeId))</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; reanalyze = <span class="keyword">true</span>;</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;</div><div class="line"><a name="l00464"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac22a6946de30bc5887b9e4ec9259764f"> 464</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ac22a6946de30bc5887b9e4ec9259764f">Andersen::collapseFields</a>()</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="keywordflow">while</span> (consCG-&gt;hasNodesToBeCollapsed())</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; {</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> node = consCG-&gt;getNextCollapseNode();</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="comment">// collapseField() may change the points-to set of the nodes which have been processed</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="comment">// before, in this case, we may need to re-do the analysis.</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="keywordflow">if</span> (collapseField(node))</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; reanalyze = <span class="keyword">true</span>;</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; }</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160;}</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160;</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160;<span class="comment"> * Merge constraint graph nodes based on SCC cycle detected.</span></div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00479"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef"> 479</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef">Andersen::mergeSccCycle</a>()</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160;{</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a> revTopoOrder;</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a> &amp; topoOrder = getSCCDetector()-&gt;topoNodeStack();</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="keywordflow">while</span> (!topoOrder.empty())</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; {</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> repNodeId = topoOrder.top();</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; topoOrder.pop();</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; revTopoOrder.push(repNodeId);</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>&amp; subNodes = getSCCDetector()-&gt;subNodes(repNodeId);</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <span class="comment">// merge sub nodes to rep node</span></div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; mergeSccNodes(repNodeId, subNodes);</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;</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; <span class="comment">// restore the topological order for later solving.</span></div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; <span class="keywordflow">while</span> (!revTopoOrder.empty())</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId = revTopoOrder.top();</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; revTopoOrder.pop();</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; topoOrder.push(nodeId);</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;}</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;</div><div class="line"><a name="l00507"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a"> 507</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a">Andersen::mergeSccNodes</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> repNodeId, <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>&amp; subNodes)</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; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">NodeBS::iterator</a> nodeIt = subNodes.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(); nodeIt != subNodes.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); nodeIt++)</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; {</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> subNodeId = *nodeIt;</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; <span class="keywordflow">if</span> (subNodeId != repNodeId)</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; {</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; mergeNodeToRep(subNodeId, repNodeId);</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; }</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; }</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160;}</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160;</div><div class="line"><a name="l00522"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e"> 522</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e">Andersen::collapseNodePts</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId)</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; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; nodePts = getPts(nodeId);</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> ptsClone = nodePts;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> ptsIt = ptsClone.<a class="code" href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">begin</a>(), ptsEit = ptsClone.<a class="code" href="classSVF_1_1PointsTo.html#a8f741cdffbf3c5fe0f602cdca677dee6">end</a>(); ptsIt != ptsEit; ptsIt++)</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; {</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; <span class="keywordflow">if</span> (isFieldInsensitive(*ptsIt))</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <span class="keywordflow">continue</span>;</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; <span class="keywordflow">if</span> (collapseField(*ptsIt))</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; }</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160;}</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160;</div><div class="line"><a name="l00542"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61"> 542</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61">Andersen::collapseField</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId)</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160;{</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isBlkObjOrConstantObj(nodeId))</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</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; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160;</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; <span class="keywordtype">double</span> start = stat-&gt;getClk();</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160;</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="comment">// set base node field-insensitive.</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; setObjFieldInsensitive(nodeId);</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="comment">// replace all occurrences of each field with the field-insensitive node</span></div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> baseId = consCG-&gt;getFIObjVar(nodeId);</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> baseRepNodeId = consCG-&gt;sccRepNode(baseId);</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &amp; allFields = consCG-&gt;getAllFieldsObjVars(baseId);</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">NodeBS::iterator</a> fieldIt = allFields.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), fieldEit = allFields.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); fieldIt != fieldEit; fieldIt++)</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; {</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> fieldId = *fieldIt;</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; <span class="keywordflow">if</span> (fieldId != baseId)</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; {</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="comment">// use the reverse pts of this field node to find all pointers point to it</span></div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a212231734fa43d5c7414137deaac7df3">NodeSet</a> revPts = getRevPts(fieldId);</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o : revPts)</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; {</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <span class="comment">// change the points-to target from field to base node</span></div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; clearPts(o, fieldId);</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; addPts(o, baseId);</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; pushIntoWorklist(o);</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160;</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; }</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <span class="comment">// merge field node into base node, including edges and pts.</span></div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> fieldRepNodeId = consCG-&gt;sccRepNode(fieldId);</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; mergeNodeToRep(fieldRepNodeId, baseRepNodeId);</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; <span class="keywordflow">if</span> (fieldId != baseRepNodeId)</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; {</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <span class="comment">// gep node fieldId becomes redundant if it is merged to its base node who is set as field-insensitive</span></div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="comment">// two node IDs should be different otherwise this field is actually the base and should not be removed.</span></div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; redundantGepNodes.set(fieldId);</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; }</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; }</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; }</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isPWCNode(baseRepNodeId))</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="keywordflow">if</span> (collapseNodePts(baseRepNodeId))</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160;</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="keywordtype">double</span> end = stat-&gt;getClk();</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; timeOfCollapse += (end - start) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160;</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <span class="keywordflow">return</span> changed;</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;</div><div class="line"><a name="l00603"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc"> 603</a></span>&#160;<a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a>&amp; <a class="code" href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc">Andersen::SCCDetect</a>()</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160;{</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; numOfSCCDetection++;</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160;</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <span class="keywordtype">double</span> sccStart = stat-&gt;getClk();</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; <a class="code" href="classSVF_1_1WPASolver.html#aaa932894d00b69cfa741f9987a9cc6b8">WPAConstraintSolver::SCCDetect</a>();</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; <span class="keywordtype">double</span> sccEnd = stat-&gt;getClk();</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160;</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; timeOfSCCDetection += (sccEnd - sccStart)/<a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160;</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; <span class="keywordtype">double</span> mergeStart = stat-&gt;getClk();</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160;</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; mergeSccCycle();</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160;</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <span class="keywordtype">double</span> mergeEnd = stat-&gt;getClk();</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; timeOfSCCMerges += (mergeEnd - mergeStart)/<a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</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; <span class="keywordflow">return</span> getSCCDetector()-&gt;topoNodeStack();</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160;}</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160;</div><div class="line"><a name="l00627"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a6c60b761ddf3d6bf08c8a9c3f6fd9f0b"> 627</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#a6c60b761ddf3d6bf08c8a9c3f6fd9f0b">Andersen::updateCallGraph</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PointerAnalysis.html#ad95c842964e6ca46e51fb763fefec585">CallSiteToFunPtrMap</a>&amp; callsites)</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160;{</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160;</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <span class="keywordtype">double</span> cgUpdateStart = stat-&gt;getClk();</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; <a class="code" href="classSVF_1_1PointerAnalysis.html#a35bd5f0fb2c146199e9f1aa6a19b4062">CallEdgeMap</a> newEdges;</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; onTheFlyCallGraphSolve(callsites,newEdges);</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> cpySrcNodes; </div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; <span class="keywordflow">for</span>(CallEdgeMap::iterator it = newEdges.begin(), eit = newEdges.end(); it!=eit; ++it )</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; {</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a9815a5b31ac7dc21239d08e5b9f61106">SVFUtil::getSVFCallSite</a>(it-&gt;first-&gt;getCallSite());</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; <span class="keywordflow">for</span>(FunctionSet::iterator cit = it-&gt;second.begin(), ecit = it-&gt;second.end(); cit!=ecit; ++cit)</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; {</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; connectCaller2CalleeParams(cs,*cit,cpySrcNodes);</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; }</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; }</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; <span class="keywordflow">for</span>(NodePairSet::iterator it = cpySrcNodes.begin(), eit = cpySrcNodes.end(); it!=eit; ++it)</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; {</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; pushIntoWorklist(it-&gt;first);</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;</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; <span class="keywordtype">double</span> cgUpdateEnd = stat-&gt;getClk();</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; timeOfUpdateCallGraph += (cgUpdateEnd - cgUpdateStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160;</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; <span class="keywordflow">return</span> (!newEdges.empty());</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160;}</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160;</div><div class="line"><a name="l00654"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a7b1b9e9b25b5643440aca77e23a8de07"> 654</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a7b1b9e9b25b5643440aca77e23a8de07">Andersen::heapAllocatorViaIndCall</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs, <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> &amp;cpySrcNodes)</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160;{</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; assert(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(cs) == <span class="keyword">nullptr</span> &amp;&amp; <span class="stringliteral">&quot;not an indirect callsite?&quot;</span>);</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; <a class="code" href="classSVF_1_1RetICFGNode.html">RetICFGNode</a>* retBlockNode = pag-&gt;getICFG()-&gt;getRetICFGNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ac2a0091dab3543a398da890b947e42ef">getInstruction</a>());</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a>* cs_return = pag-&gt;getCallSiteRet(retBlockNode);</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> srcret;</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; CallSite2DummyValPN::const_iterator it = callsite2DummyValPN.find(cs);</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; <span class="keywordflow">if</span>(it != callsite2DummyValPN.end())</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"> 663</span>&#160; srcret = sccRepNode(it-&gt;second);</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; <span class="keywordflow">else</span></div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; {</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> valNode = pag-&gt;addDummyValNode();</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> objNode = pag-&gt;addDummyObjNode(cs.<a class="code" href="classSVF_1_1CallSite.html#a93e70225ce9c55ca65ea9d5cf737206f">getType</a>());</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; addPts(valNode,objNode);</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; callsite2DummyValPN.insert(std::make_pair(cs,valNode));</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; consCG-&gt;addConstraintNode(<span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>(valNode),valNode);</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; consCG-&gt;addConstraintNode(<span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>(objNode),objNode);</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; srcret = valNode;</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160; }</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dstrec = sccRepNode(cs_return-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; <span class="keywordflow">if</span>(addCopyEdge(srcret, dstrec))</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; cpySrcNodes.insert(std::make_pair(srcret,dstrec));</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160;}</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160;</div><div class="line"><a name="l00684"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a5a90e681e46c52ffd3debf02910c7ecf"> 684</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a5a90e681e46c52ffd3debf02910c7ecf">Andersen::connectCaller2CalleeParams</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs, <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* F, <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> &amp;cpySrcNodes)</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160;{</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; assert(F);</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;connect parameters from indirect callsite &quot;</span> &lt;&lt; cs.<a class="code" href="classSVF_1_1CallSite.html#ac2a0091dab3543a398da890b947e42ef">getInstruction</a>()-&gt;<a class="code" href="classSVF_1_1SVFValue.html#aa678ca4616a3e69b53726b33d0b9c5a2">toString</a>() &lt;&lt; <span class="stringliteral">&quot; to callee &quot;</span> &lt;&lt; *F &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160;</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* callBlockNode = pag-&gt;getICFG()-&gt;getCallICFGNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ac2a0091dab3543a398da890b947e42ef">getInstruction</a>());</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; <a class="code" href="classSVF_1_1RetICFGNode.html">RetICFGNode</a>* retBlockNode = pag-&gt;getICFG()-&gt;getRetICFGNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ac2a0091dab3543a398da890b947e42ef">getInstruction</a>());</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; <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a19b96a872d9096037f20e25122e469ea">SVFUtil::isHeapAllocExtFunViaRet</a>(F) &amp;&amp; pag-&gt;callsiteHasRet(retBlockNode))</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; heapAllocatorViaIndCall(cs,cpySrcNodes);</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; }</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">if</span> (pag-&gt;funHasRet(F) &amp;&amp; pag-&gt;callsiteHasRet(retBlockNode))</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; {</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a>* cs_return = pag-&gt;getCallSiteRet(retBlockNode);</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a>* fun_return = pag-&gt;getFunRet(F);</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; <span class="keywordflow">if</span> (cs_return-&gt;<a class="code" href="classSVF_1_1SVFVar.html#a3b61042079a6c9dc395f38925c6a1271">isPointer</a>() &amp;&amp; fun_return-&gt;<a class="code" href="classSVF_1_1SVFVar.html#a3b61042079a6c9dc395f38925c6a1271">isPointer</a>())</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dstrec = sccRepNode(cs_return-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> srcret = sccRepNode(fun_return-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <span class="keywordflow">if</span>(addCopyEdge(srcret, dstrec))</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; cpySrcNodes.insert(std::make_pair(srcret,dstrec));</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"> 710</span>&#160; }</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; {</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;not a pointer ignored\n&quot;</span>);</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; }</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;</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; <span class="keywordflow">if</span> (pag-&gt;hasCallSiteArgsMap(callBlockNode) &amp;&amp; pag-&gt;hasFunArgsList(F))</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;</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; <span class="comment">// connect actual and formal param</span></div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFIR.html#a64939d7ecfd8e2cf862782954a56596b">SVFIR::SVFVarList</a>&amp; csArgList = pag-&gt;getCallSiteArgsList(callBlockNode);</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFIR.html#a64939d7ecfd8e2cf862782954a56596b">SVFIR::SVFVarList</a>&amp; funArgList = pag-&gt;getFunArgsList(F);</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; <span class="comment">//Go through the fixed parameters.</span></div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot; args:&quot;</span>);</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; SVFIR::SVFVarList::const_iterator funArgIt = funArgList.begin(), funArgEit = funArgList.end();</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; SVFIR::SVFVarList::const_iterator csArgIt = csArgList.begin(), csArgEit = csArgList.end();</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; <span class="keywordflow">for</span> (; funArgIt != funArgEit; ++csArgIt, ++funArgIt)</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; {</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; <span class="comment">//Some programs (e.g. Linux kernel) leave unneeded parameters empty.</span></div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; <span class="keywordflow">if</span> (csArgIt == csArgEit)</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; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot; !! not enough args\n&quot;</span>);</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; }</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *cs_arg = *csArgIt ;</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *fun_arg = *funArgIt;</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="keywordflow">if</span> (cs_arg-&gt;<a class="code" href="classSVF_1_1SVFVar.html#a3b61042079a6c9dc395f38925c6a1271">isPointer</a>() &amp;&amp; fun_arg-&gt;<a class="code" href="classSVF_1_1SVFVar.html#a3b61042079a6c9dc395f38925c6a1271">isPointer</a>())</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; {</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;process actual parm &quot;</span> &lt;&lt; cs_arg-&gt;<a class="code" href="classSVF_1_1SVFVar.html#ada932ef2ae0a3e712174df479c35b0dd">toString</a>() &lt;&lt; <span class="stringliteral">&quot; \n&quot;</span>);</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> srcAA = sccRepNode(cs_arg-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dstFA = sccRepNode(fun_arg-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; <span class="keywordflow">if</span>(addCopyEdge(srcAA, dstFA))</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; {</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; cpySrcNodes.insert(std::make_pair(srcAA,dstFA));</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; }</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; }</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; <span class="comment">//Any remaining actual args must be varargs.</span></div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; <span class="keywordflow">if</span> (F-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ae578002917b4ccbf28f172dba30d1d58">isVarArg</a>())</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> vaF = sccRepNode(pag-&gt;getVarargNode(F));</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n varargs:&quot;</span>);</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; <span class="keywordflow">for</span> (; csArgIt != csArgEit; ++csArgIt)</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; {</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *cs_arg = *csArgIt;</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160; <span class="keywordflow">if</span> (cs_arg-&gt;<a class="code" href="classSVF_1_1SVFVar.html#a3b61042079a6c9dc395f38925c6a1271">isPointer</a>())</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; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> vnAA = sccRepNode(cs_arg-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; <span class="keywordflow">if</span> (addCopyEdge(vnAA,vaF))</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; cpySrcNodes.insert(std::make_pair(vnAA,vaF));</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; }</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; }</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; }</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; }</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; <span class="keywordflow">if</span>(csArgIt != csArgEit)</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; {</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">&quot;too many args to non-vararg func.&quot;</span>);</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">&quot;(&quot;</span> + cs.<a class="code" href="classSVF_1_1CallSite.html#ac2a0091dab3543a398da890b947e42ef">getInstruction</a>()-&gt;<a class="code" href="classSVF_1_1SVFValue.html#a7effb0f37f486745e0cdc3ae5e9c732b">getSourceLoc</a>() + <span class="stringliteral">&quot;)&quot;</span>);</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160; }</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; }</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160;}</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160;</div><div class="line"><a name="l00779"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e"> 779</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e">Andersen::mergeSrcToTgt</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> newRepId)</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160;{</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160;</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; <span class="keywordflow">if</span>(nodeId==newRepId)</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160;</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; updatePropaPts(newRepId, nodeId);</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; unionPts(newRepId,nodeId);</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160;</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG-&gt;getConstraintNode(nodeId);</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160; <span class="keywordtype">bool</span> pwc = consCG-&gt;moveEdgesToRepNode(node, consCG-&gt;getConstraintNode(newRepId));</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160;</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; <span class="keywordflow">if</span>(node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a0ffe4f1ca1a6f70466cc1c6b3b12c90d">isPWCNode</a>())</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; pwc = <span class="keyword">true</span>;</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160;</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160; updateNodeRepAndSubs(node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(),newRepId);</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; consCG-&gt;removeConstraintNode(node);</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160;</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; <span class="keywordflow">return</span> pwc;</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160;}</div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160;<span class="comment"> * Merge a node to its rep node based on SCC detection</span></div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00810"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848"> 810</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848">Andersen::mergeNodeToRep</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId,<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> newRepId)</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">if</span> (mergeSrcToTgt(nodeId,newRepId))</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; consCG-&gt;setPWCNode(newRepId);</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"> 816</span>&#160;</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160;<span class="comment"> * Updates subnodes of its rep, and rep node of its subs</span></div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00820"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18"> 820</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18">Andersen::updateNodeRepAndSubs</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> nodeId, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> newRepId)</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160;{</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; consCG-&gt;setRep(nodeId,newRepId);</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> repSubs;</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; repSubs.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(nodeId);</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; <span class="comment">// update nodeToSubsMap, union its subs with its rep Subs</span></div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>&amp; nodeSubs = consCG-&gt;sccSubNodes(nodeId);</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="keywordflow">for</span>(<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">NodeBS::iterator</a> sit = nodeSubs.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), esit = nodeSubs.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); sit!=esit; ++sit)</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; {</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> subId = *sit;</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; consCG-&gt;setRep(subId,newRepId);</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; repSubs |= nodeSubs;</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; consCG-&gt;setSubs(newRepId,repSubs);</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; consCG-&gt;resetSubs(nodeId);</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;</div><div class="line"><a name="l00838"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae1ff65a411f2c4dfee0973ad4af48daf"> 838</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ae1ff65a411f2c4dfee0973ad4af48daf">Andersen::cluster</a>(<span class="keywordtype">void</span>)<span class="keyword"> const</span></div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; assert(<a class="code" href="classSVF_1_1Options.html#adfc1a5c6098d3867e29fc65ca9ffa1cc">Options::MaxFieldLimit</a> == 0 &amp;&amp; <span class="stringliteral">&quot;Andersen::cluster: clustering for Andersen&#39;s is currently only supported in field-insesnsitive analysis&quot;</span>);</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; <a class="code" href="classSVF_1_1Steensgaard.html">Steensgaard</a> *steens = <a class="code" href="classSVF_1_1Steensgaard.html#acd5f31c3b1f9b47def458637f8e9389e">Steensgaard::createSteensgaard</a>(pag);</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; std::vector&lt;std::pair&lt;unsigned, unsigned&gt;&gt; keys;</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFIR::iterator</a> pit = pag-&gt;begin(); pit != pag-&gt;end(); ++pit)</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; keys.push_back(std::make_pair(pit-&gt;first, 1));</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;</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; std::vector&lt;std::pair&lt;hclust_fast_methods, std::vector&lt;NodeID&gt;&gt;&gt; candidates;</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> nodeMapping =</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; std::make_shared&lt;std::vector&lt;NodeID&gt;&gt;(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b">NodeIDAllocator::Clusterer::cluster</a>(steens, keys, candidates, <span class="stringliteral">&quot;aux-steens&quot;</span>));</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> reverseNodeMapping =</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; std::make_shared&lt;std::vector&lt;NodeID&gt;&gt;(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f">NodeIDAllocator::Clusterer::getReverseNodeMapping</a>(*nodeMapping));</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; <a class="code" href="classSVF_1_1PointsTo.html#a84eca4c7fc833f8ca4d119cd4da08ca8">PointsTo::setCurrentBestNodeMapping</a>(nodeMapping, reverseNodeMapping);</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160;}</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160;</div><div class="line"><a name="l00860"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a"> 860</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a">Andersen::dumpTopLevelPtsTo</a>()</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160;{</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; <span class="keywordflow">for</span> (OrderedNodeSet::iterator nIter = this-&gt;getAllValidPtrs().begin();</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; nIter != this-&gt;getAllValidPtrs().end(); ++nIter)</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; {</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a>* node = getPAG()-&gt;getGNode(*nIter);</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; <span class="keywordflow">if</span> (getPAG()-&gt;isValidTopLevelPtr(node))</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; {</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; pts = this-&gt;getPts(node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nNodeID &quot;</span> &lt;&lt; node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>() &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</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">if</span> (pts.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>())</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; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t\tPointsTo: {empty}\n\n&quot;</span>;</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; }</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; <span class="keywordflow">else</span></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; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t\tPointsTo: { &quot;</span>;</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160;</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; multiset&lt;u32_t&gt; line;</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> it = pts.<a class="code" href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">begin</a>(), eit = pts.<a class="code" href="classSVF_1_1PointsTo.html#a8f741cdffbf3c5fe0f602cdca677dee6">end</a>();</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; it != eit; ++it)</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; line.insert(*it);</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="keywordflow">for</span> (multiset&lt;u32_t&gt;::const_iterator it = line.begin(); it != line.end(); ++it)</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; *it &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;}\n\n&quot;</span>;</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; }</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160;</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>().flush();</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="ttc" id="SVFType_8h_html_a7a295e02c56a93cf9206dd9d3b18dd17"><div class="ttname"><a href="SVFType_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a></div><div class="ttdeci">#define DPAGBuild</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00426">SVFType.h:426</a></div></div>
70
70
  <div class="ttc" id="Andersen_8h_html"><div class="ttname"><a href="Andersen_8h.html">Andersen.h</a></div></div>
71
71
  <div class="ttc" id="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator_html"><div class="ttname"><a href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVF::SparseBitVector::SparseBitVectorIterator</a></div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l00536">SparseBitVector.h:536</a></div></div>
72
72
  <div class="ttc" id="classSVF_1_1SVFIR_html_aa5b08d987b37d35e73de88da10a97bc4"><div class="ttname"><a href="classSVF_1_1SVFIR.html#aa5b08d987b37d35e73de88da10a97bc4">SVF::SVFIR::NodeLocationSetMap</a></div><div class="ttdeci">Map&lt; NodeLocationSet, NodeID &gt; NodeLocationSetMap</div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#l00069">SVFIR.h:69</a></div></div>
@@ -102,6 +102,7 @@ $(function() {
102
102
  <div class="ttc" id="classSVF_1_1SVFVar_html"><div class="ttname"><a href="classSVF_1_1SVFVar.html">SVF::SVFVar</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00045">SVFVariables.h:45</a></div></div>
103
103
  <div class="ttc" id="classSVF_1_1Options_html_adfc1a5c6098d3867e29fc65ca9ffa1cc"><div class="ttname"><a href="classSVF_1_1Options.html#adfc1a5c6098d3867e29fc65ca9ffa1cc">SVF::Options::MaxFieldLimit</a></div><div class="ttdeci">static const llvm::cl::opt&lt; unsigned &gt; MaxFieldLimit</div><div class="ttdoc">Maximum number of field derivations for an object. </div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00038">Options.h:38</a></div></div>
104
104
  <div class="ttc" id="namespacestd_html"><div class="ttname"><a href="namespacestd.html">std</a></div></div>
105
+ <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_af6e96694d983643a66c238cce01bff0e"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if_t&lt;!is_simple_type&lt; Y &gt;::value, typename cast_retty&lt; X, const Y &gt;::ret_type &gt; dyn_cast(const Y &amp;Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00398">Casting.h:398</a></div></div>
105
106
  <div class="ttc" id="namespaceSVF_html_ac82022f3f81965c3ce9b26c299f537a7"><div class="ttname"><a href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">SVF::NodePairSet</a></div><div class="ttdeci">Set&lt; NodePair &gt; NodePairSet</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00111">SVFType.h:111</a></div></div>
106
107
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a04acd871bd1b98cd9e83e395334ac130"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a04acd871bd1b98cd9e83e395334ac130">SVF::AndersenBase::numOfProcessedCopy</a></div><div class="ttdeci">static u32_t numOfProcessedCopy</div><div class="ttdoc">Number of processed Addr edge. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00124">Andersen.h:124</a></div></div>
107
108
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a02c5a50b214d36921e1404784e76704d"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a02c5a50b214d36921e1404784e76704d">SVF::AndersenBase::timeOfSCCMerges</a></div><div class="ttdeci">static double timeOfSCCMerges</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00133">Andersen.h:133</a></div></div>
@@ -195,7 +196,6 @@ $(function() {
195
196
  <div class="ttc" id="SVFType_8h_html_adbfc4364261f019dc6cf33234a5177d2"><div class="ttname"><a href="SVFType_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a></div><div class="ttdeci">#define DAndersen</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00437">SVFType.h:437</a></div></div>
196
197
  <div class="ttc" id="classSVF_1_1Andersen_html_a31ea24432ff42ab86a4728f2bde571bc"><div class="ttname"><a href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc">SVF::Andersen::SCCDetect</a></div><div class="ttdeci">virtual NodeStack &amp; SCCDetect()</div><div class="ttdoc">SCC detection. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00603">Andersen.cpp:603</a></div></div>
197
198
  <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#l00747">SparseBitVector.h:747</a></div></div>
198
- <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#l00342">Casting.h:342</a></div></div>
199
199
  <div class="ttc" id="classSVF_1_1AndersenBase_html_ad40b196c2c699bd115529b806d20de25"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#ad40b196c2c699bd115529b806d20de25">SVF::AndersenBase::timeOfCollapse</a></div><div class="ttdeci">static double timeOfCollapse</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00134">Andersen.h:134</a></div></div>
200
200
  <div class="ttc" id="classSVF_1_1CallSite_html_a93e70225ce9c55ca65ea9d5cf737206f"><div class="ttname"><a href="classSVF_1_1CallSite.html#a93e70225ce9c55ca65ea9d5cf737206f">SVF::CallSite::getType</a></div><div class="ttdeci">const SVFType * getType() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l01031">SVFValue.h:1031</a></div></div>
201
201
  <div class="ttc" id="classSVF_1_1Options_html_a620fe156ba70f997eace0ccb0d2c9f67"><div class="ttname"><a href="classSVF_1_1Options.html#a620fe156ba70f997eace0ccb0d2c9f67">SVF::Options::AnderTimeLimit</a></div><div class="ttdeci">static const llvm::cl::opt&lt; unsigned &gt; AnderTimeLimit</div><div class="ttdoc">Time limit for the Andersen&amp;#39;s analyses. </div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00075">Options.h:75</a></div></div>