svf-tools 1.0.293 → 1.0.294
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.
|
@@ -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> <span class="comment">//===- Andersen.cpp -- Field-sensitive Andersen's analysis-------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// Copyright (C) <2013-2017> <Yulei Sui></span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> </div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <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> <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> <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> <span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <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> <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> <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> <span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <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> <span class="comment">// along with this program. If not, see <http://www.gnu.org/licenses/>.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"> * Andersen.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> * Created on: Nov 12, 2013</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * Author: Yulei Sui</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include "<a class="code" href="LLVMUtil_8h.html">SVF-FE/LLVMUtil.h</a>"</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include "<a class="code" href="PointsTo_8h.html">MemoryModel/PointsTo.h</a>"</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include "<a class="code" href="Andersen_8h.html">WPA/Andersen.h</a>"</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="preprocessor">#include "<a class="code" href="Steensgaard_8h.html">WPA/Steensgaard.h</a>"</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> </div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <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> <span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> </div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a70e60ce2e6f4cfd575c6f5c974ca1081">AndersenBase::numOfProcessedAddr</a> = 0;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a9d7b6e602e1764f76583824dddebf985">AndersenBase::numOfProcessedCopy</a> = 0;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a25de7638a692832f0d4727815ff270f6">AndersenBase::numOfProcessedGep</a> = 0;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a5f1b0711583aa8947dfb4619658f1904">AndersenBase::numOfProcessedLoad</a> = 0;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#ae18183a5d8ebd46fcdb9246bd643b150">AndersenBase::numOfProcessedStore</a> = 0;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#aa31bc83cdeaa30dd0975976e29a5be12">AndersenBase::numOfSfrs</a> = 0;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#ad21fc4e60abc4e6030880f8197e1c93f">AndersenBase::numOfFieldExpand</a> = 0;</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> </div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a6da6e1231a46fde6925493045b8b2490">AndersenBase::numOfSCCDetection</a> = 0;</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a6b7d0e57f741c446d0bf178939960143">AndersenBase::timeOfSCCDetection</a> = 0;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a02c5a50b214d36921e1404784e76704d">AndersenBase::timeOfSCCMerges</a> = 0;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#ad40b196c2c699bd115529b806d20de25">AndersenBase::timeOfCollapse</a> = 0;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#abdc249ea291d0247f6b91a8fcc7df341">AndersenBase::AveragePointsToSetSize</a> = 0;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a7cfafe54d564c9401f435362d44d3f9c">AndersenBase::MaxPointsToSetSize</a> = 0;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#aae14de6fbca9280d8d0290326aa493f0">AndersenBase::timeOfProcessCopyGep</a> = 0;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a9fe738f1e11c80006d540f246a80bfdf">AndersenBase::timeOfProcessLoadStore</a> = 0;</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a2afb49f513c9534fd051117b59dc056b">AndersenBase::timeOfUpdateCallGraph</a> = 0;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> </div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> </div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac"> 64</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac">AndersenBase::initialize</a>()</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> {</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a431ec4f85eb0f029e5740b92fd9ceb32">PointerAnalysis::initialize</a>();</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  consCG = <span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintGraph.html">ConstraintGraph</a>(pag);</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  setGraph(consCG);</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  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="l00073"></a><span class="lineno"> 73</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a69a7d0431c0ddfefed1cb97f3571303a">Options::ConsCGDotGraph</a>)</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  consCG->dump(<span class="stringliteral">"consCG_initial"</span>);</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> }</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> </div><div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67"> 80</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67">AndersenBase::finalize</a>()</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a69a7d0431c0ddfefed1cb97f3571303a">Options::ConsCGDotGraph</a>)</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  consCG->dump(<span class="stringliteral">"consCG_final"</span>);</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> </div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a87516daebb3d1b5fee9037068d60e268">Options::PrintCGGraph</a>)</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  consCG->print();</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a9128b7d4aaf4912b5db20aca4c22e852">BVDataPTAImpl::finalize</a>();</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> }</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> </div><div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a944966086ecb716184c8cdcc43db5751"> 94</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a944966086ecb716184c8cdcc43db5751">AndersenBase::analyze</a>()</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> {</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  initialize();</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> </div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keywordtype">bool</span> readResultsFromFile = <span class="keyword">false</span>;</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keywordflow">if</span>(!<a class="code" href="classSVF_1_1Options.html#a98a521e5c99c5248eae8f8234453b116">Options::ReadAnder</a>.<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>()) {</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  readResultsFromFile = this->readFromFile(<a class="code" href="classSVF_1_1Options.html#a98a521e5c99c5248eae8f8234453b116">Options::ReadAnder</a>);</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="comment">// Finalize the analysis</span></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a118dabc50024b5cd91095814ade47166">PointerAnalysis::finalize</a>();</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  }</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> </div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="keywordflow">if</span>(!readResultsFromFile)</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  {</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <span class="comment">// Start solving constraints</span></div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"Start Solving Constraints\n"</span>));</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> </div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <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="l00112"></a><span class="lineno"> 112</span> </div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  initWorklist();</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keywordflow">do</span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  {</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  numOfIteration++;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keywordflow">if</span> (0 == numOfIteration % iterationForPrintStat)</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  printStat();</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> </div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  reanalyze = <span class="keyword">false</span>;</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> </div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  solveWorklist();</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keywordflow">if</span> (updateCallGraph(getIndirectCallsites()))</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  reanalyze = <span class="keyword">true</span>;</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> </div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  }</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">while</span> (reanalyze);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> </div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="comment">// Analysis is finished, reset the alarm if we set it.</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a168f7f7a3a8c70dbf2b5b4269cd4c7c5">SVFUtil::stopAnalysisLimitTimer</a>(limitTimerSet);</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span> </div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"Finish Solving Constraints\n"</span>));</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span> </div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="comment">// Finalize the analysis</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  finalize();</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  }</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span> </div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keywordflow">if</span> (!<a class="code" href="classSVF_1_1Options.html#a4c7eb57066c80c62ef394d644833214a">Options::WriteAnder</a>.<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>())</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  this->writeToFile(<a class="code" href="classSVF_1_1Options.html#a4c7eb57066c80c62ef394d644833214a">Options::WriteAnder</a>);</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span> }</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> </div><div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#aebfe0c7238eb24f74f105b950b86cb5e"> 143</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#aebfe0c7238eb24f74f105b950b86cb5e">AndersenBase::cleanConsCG</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <span class="keywordtype">id</span>) {</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  consCG->resetSubs(consCG->getRep(<span class="keywordtype">id</span>));</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> sub: consCG->getSubs(<span class="keywordtype">id</span>))</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  consCG->resetRep(sub);</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  consCG->resetSubs(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  consCG->resetRep(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(!consCG->hasGNode(<span class="keywordtype">id</span>) && <span class="stringliteral">"this node should already have been merged to its field-insensitive base! "</span>);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> }</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> </div><div class="line"><a name="l00152"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#af37392229dab0a1f2f807a12186c3b39"> 152</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#af37392229dab0a1f2f807a12186c3b39">AndersenBase::normalizePointsTo</a>()</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span> {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <a class="code" href="classSVF_1_1PAG.html#a49da7e7d6273a0d8798166f95ce6bb16">PAG::MemObjToFieldsMap</a> &memToFieldsMap = pag->getMemToFieldsMap();</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <a class="code" href="classSVF_1_1PAG.html#a80b31ccc3263c7d5d93aa1247eea0853">PAG::NodeLocationSetMap</a> &GepObjNodeMap = pag->getGepObjNodeMap();</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span> </div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="comment">// clear GepObjNodeMap/memToFieldsMap/nodeToSubsMap/nodeToRepMap</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="comment">// for redundant gepnodes and remove those nodes from pag</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n: redundantGepNodes) {</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> base = pag->getBaseObjNode(n);</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <a class="code" href="classSVF_1_1GepObjPN.html">GepObjPN</a> *gepNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1GepObjPN.html">GepObjPN</a>>(pag->getPAGNode(n));</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(gepNode && <span class="stringliteral">"Not a gep node in redundantGepNodes set"</span>);</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LocationSet.html">LocationSet</a> ls = gepNode-><a class="code" href="classSVF_1_1GepObjPN.html#aeb05e3a512e89c7af36c675e0efeec7e">getLocationSet</a>();</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  GepObjNodeMap.erase(std::make_pair(base, ls));</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  memToFieldsMap[base].reset(n);</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  cleanConsCG(n);</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> </div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  pag->removeGNode(gepNode);</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  }</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> }</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> </div><div class="line"><a name="l00175"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a20617a69c112ad423b1b5021e48a8548"> 175</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a20617a69c112ad423b1b5021e48a8548">Andersen::initialize</a>()</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> {</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  resetData();</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  setDiffOpt(<a class="code" href="classSVF_1_1Options.html#acf7262c0b0bd91e6dab56a631be51206">Options::PtsDiff</a>);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  setPWCOpt(<a class="code" href="classSVF_1_1Options.html#a69579e2f37962afdbb292a36782511ed">Options::MergePWC</a>);</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <a class="code" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac">AndersenBase::initialize</a>();</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span> </div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a8459d43a21bcf8a50fc55d14fcf5a81e">Options::ClusterAnder</a>) cluster();</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> </div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  processAllAddr();</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> }</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> </div><div class="line"><a name="l00191"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c"> 191</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c">Andersen::finalize</a>()</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span> {</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="comment">// TODO: check -stat too.</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="comment">// TODO: broken</span></div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a8459d43a21bcf8a50fc55d14fcf5a81e">Options::ClusterAnder</a>)</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  {</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<std::string, std::string></a> stats;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTData.html">PTDataTy</a> *ptd = getPTDataTy();</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="comment">// TODO: should we use liveOnly?</span></div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <span class="comment">// TODO: parameterise final arg.</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <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-><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="l00202"></a><span class="lineno"> 202</span>  <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7">NodeIDAllocator::Clusterer::printStats</a>(<span class="stringliteral">"post-main"</span>, stats);</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  }</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span> </div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="comment">// sanitizePts();</span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <a class="code" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67">AndersenBase::finalize</a>();</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> }</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> </div><div class="line"><a name="l00214"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1"> 214</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1">Andersen::processNode</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> {</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="comment">// sub nodes do not need to be processed</span></div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordflow">if</span> (sccRepNode(nodeId) != nodeId)</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span> </div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG->getConstraintNode(nodeId);</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="keywordtype">double</span> insertStart = stat->getClk();</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  handleLoadStore(node);</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="keywordtype">double</span> insertEnd = stat->getClk();</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  timeOfProcessLoadStore += (insertEnd - insertStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span> </div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keywordtype">double</span> propStart = stat->getClk();</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  handleCopyGep(node);</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keywordtype">double</span> propEnd = stat->getClk();</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  timeOfProcessCopyGep += (propEnd - propStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span> }</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> </div><div class="line"><a name="l00235"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ab069683dd6ca563113efbde2813ab35e"> 235</a></span> <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="l00236"></a><span class="lineno"> 236</span> {</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId = node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  computeDiffPts(nodeId);</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> </div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordflow">if</span> (!getDiffPts(nodeId).<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>())</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  {</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge : node-><a class="code" href="classSVF_1_1ConstraintNode.html#ab77173aa8af6155b569f20ff0cdcec72">getCopyOutEdges</a>())</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  processCopy(nodeId, edge);</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge : node-><a class="code" href="classSVF_1_1ConstraintNode.html#a19d3d2c996ba821227a836717e5443c8">getGepOutEdges</a>())</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  {</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* gepEdge = SVFUtil::dyn_cast<GepCGEdge>(edge))</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  processGep(nodeId, gepEdge);</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  }</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  }</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span> }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> </div><div class="line"><a name="l00255"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a0f32ba8cb1109c257552fa775a007ffd"> 255</a></span> <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="l00256"></a><span class="lineno"> 256</span> {</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId = node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <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="l00259"></a><span class="lineno"> 259</span>  getPts(nodeId).end(); piter != epiter; ++piter)</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  {</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> ptd = *piter;</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <span class="comment">// handle load</span></div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = node-><a class="code" href="classSVF_1_1ConstraintNode.html#af69c7e623ab5a36644b6aeabaa1a1e28">outgoingLoadsBegin</a>(),</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  eit = node-><a class="code" href="classSVF_1_1ConstraintNode.html#a134e8ed040d7749c2b9a02662115f746">outgoingLoadsEnd</a>(); it != eit; ++it)</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  {</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">if</span> (processLoad(ptd, *it))</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  pushIntoWorklist(ptd);</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  }</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span> </div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="comment">// handle store</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = node-><a class="code" href="classSVF_1_1ConstraintNode.html#a5a90b39f9e5769bde44a673806270714">incomingStoresBegin</a>(),</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  eit = node-><a class="code" href="classSVF_1_1ConstraintNode.html#a8d58f5224728bb6811f12c94826167f6">incomingStoresEnd</a>(); it != eit; ++it)</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  {</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="keywordflow">if</span> (processStore(ptd, *it))</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  pushIntoWorklist((*it)->getSrcID());</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  }</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  }</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span> }</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> </div><div class="line"><a name="l00283"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10"> 283</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10">Andersen::processAllAddr</a>()</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span> {</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">ConstraintGraph::const_iterator</a> nodeIt = consCG->begin(), nodeEit = consCG->end(); nodeIt != nodeEit; nodeIt++)</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  {</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a> * cgNode = nodeIt->second;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = cgNode-><a class="code" href="classSVF_1_1ConstraintNode.html#a19c1ed324f65f4cc58dd2fd21ed4a971">incomingAddrsBegin</a>(), eit = cgNode-><a class="code" href="classSVF_1_1ConstraintNode.html#ae8ac9ad8e766b961c7ce06d7219f37af">incomingAddrsEnd</a>();</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  it != eit; ++it)</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  processAddr(SVFUtil::cast<AddrCGEdge>(*it));</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  }</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span> }</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span> </div><div class="line"><a name="l00297"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#aca095e135edb5d27efe76bb7ee71184c"> 297</a></span> <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="l00298"></a><span class="lineno"> 298</span> {</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  numOfProcessedAddr++;</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span> </div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = addr-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = addr-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keywordflow">if</span>(addPts(dst,src))</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  pushIntoWorklist(dst);</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span> }</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span> </div><div class="line"><a name="l00312"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de"> 312</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de">Andersen::processLoad</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">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="l00313"></a><span class="lineno"> 313</span> {</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span> <span class="comment">// if (pag->isBlkObjOrConstantObj(node) || isNonPointerObj(node))</span></div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <span class="keywordflow">if</span> (pag->isConstantObj(node) || isNonPointerObj(node))</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span> </div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  numOfProcessedLoad++;</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span> </div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = load-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <span class="keywordflow">return</span> addCopyEdge(node, dst);</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span> }</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span> </div><div class="line"><a name="l00332"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024"> 332</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024">Andersen::processStore</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">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="l00333"></a><span class="lineno"> 333</span> {</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span> <span class="comment">// if (pag->isBlkObjOrConstantObj(node) || isNonPointerObj(node))</span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="keywordflow">if</span> (pag->isConstantObj(node) || isNonPointerObj(node))</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span> </div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  numOfProcessedStore++;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span> </div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = store-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <span class="keywordflow">return</span> addCopyEdge(src, node);</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span> }</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span> </div><div class="line"><a name="l00352"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2"> 352</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2">Andersen::processCopy</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">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="l00353"></a><span class="lineno"> 353</span> {</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  numOfProcessedCopy++;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span> </div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>((SVFUtil::isa<CopyCGEdge>(edge)) && <span class="stringliteral">"not copy/call/ret ??"</span>);</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = edge-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& srcPts = getDiffPts(node);</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> </div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  <span class="keywordtype">bool</span> changed = unionPts(dst, srcPts);</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="keywordflow">if</span> (changed)</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  pushIntoWorklist(dst);</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span> }</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span> </div><div class="line"><a name="l00372"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f"> 372</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f">Andersen::processGep</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* edge)</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> {</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& srcPts = getDiffPts(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>());</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="keywordflow">return</span> processGepPts(srcPts, edge);</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span> }</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span> </div><div class="line"><a name="l00381"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac6b1efcaadfed48c226701ecf6bac55e"> 381</a></span> <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>& pts, <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* edge)</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> {</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  numOfProcessedGep++;</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> </div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> tmpDstPts;</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="keywordflow">if</span> (SVFUtil::isa<VariantGepCGEdge>(edge))</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  {</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="comment">// If a pointer is connected by a variant gep edge,</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <span class="comment">// then set this memory object to be field insensitive,</span></div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <span class="comment">// unless the object is a black hole/constant.</span></div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  {</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keywordflow">if</span> (consCG->isBlkObjOrConstantObj(o))</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  {</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  }</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span> </div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="keywordflow">if</span> (!isFieldInsensitive(o))</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  {</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  setObjFieldInsensitive(o);</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  consCG->addNodeToBeCollapsed(consCG->getBaseObjNode(o));</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  }</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> </div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <span class="comment">// Add the field-insensitive node into pts.</span></div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseId = consCG->getFIObjNode(o);</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(baseId);</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  }</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  }</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <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<NormalGepCGEdge>(edge))</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  {</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="comment">// TODO: after the node is set to field insensitive, handling invariant</span></div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <span class="comment">// gep edge may lose precision because offsets here are ignored, and the</span></div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <span class="comment">// base object is always returned.</span></div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  {</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="keywordflow">if</span> (consCG->isBlkObjOrConstantObj(o))</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  {</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  }</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> </div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <span class="keywordflow">if</span> (!matchType(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>(), o, normalGepEdge)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span> </div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldSrcPtdNode = consCG->getGepObjNode(o, normalGepEdge->getLocationSet());</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(fieldSrcPtdNode);</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  addTypeForGepObjNode(fieldSrcPtdNode, normalGepEdge);</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  }</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  }</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  {</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> && <span class="stringliteral">"Andersen::processGepPts: New type GEP edge type?"</span>);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  }</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span> </div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstId = edge-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <span class="keywordflow">if</span> (unionPts(dstId, tmpDstPts))</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  {</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  pushIntoWorklist(dstId);</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  }</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span> </div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span> }</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span> </div><div class="line"><a name="l00448"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae79bff0e9c49f15e7db00ed605824d98"> 448</a></span> <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#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span> {</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="comment">// If a node is a PWC node, collapse all its points-to tarsget.</span></div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="comment">// collapseNodePts() may change the points-to set of the nodes which have been processed</span></div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  <span class="comment">// before, in this case, we may need to re-do the analysis.</span></div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="keywordflow">if</span> (mergePWC() && consCG->isPWCNode(nodeId) && collapseNodePts(nodeId))</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  reanalyze = <span class="keyword">true</span>;</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span> }</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span> </div><div class="line"><a name="l00457"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac22a6946de30bc5887b9e4ec9259764f"> 457</a></span> <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="l00458"></a><span class="lineno"> 458</span> {</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordflow">while</span> (consCG->hasNodesToBeCollapsed())</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  {</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> node = consCG->getNextCollapseNode();</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="comment">// collapseField() may change the points-to set of the nodes which have been processed</span></div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="comment">// before, in this case, we may need to re-do the analysis.</span></div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keywordflow">if</span> (collapseField(node))</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  reanalyze = <span class="keyword">true</span>;</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  }</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span> }</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span> </div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span> <span class="comment">/*</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span> <span class="comment"> * Merge constraint graph nodes based on SCC cycle detected.</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span> <span class="comment"> */</span></div><div class="line"><a name="l00472"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef"> 472</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef">Andersen::mergeSccCycle</a>()</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span> {</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a> revTopoOrder;</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a> & topoOrder = getSCCDetector()->topoNodeStack();</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="keywordflow">while</span> (!topoOrder.empty())</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  {</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> repNodeId = topoOrder.top();</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  topoOrder.pop();</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  revTopoOrder.push(repNodeId);</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>& subNodes = getSCCDetector()->subNodes(repNodeId);</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <span class="comment">// merge sub nodes to rep node</span></div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  mergeSccNodes(repNodeId, subNodes);</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  }</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span> </div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <span class="comment">// restore the topological order for later solving.</span></div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keywordflow">while</span> (!revTopoOrder.empty())</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  {</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId = revTopoOrder.top();</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  revTopoOrder.pop();</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  topoOrder.push(nodeId);</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  }</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span> }</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span> </div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span> </div><div class="line"><a name="l00500"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a"> 500</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a">Andersen::mergeSccNodes</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> repNodeId, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>& subNodes)</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span> {</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  <span class="keywordflow">for</span> (NodeBS::iterator nodeIt = subNodes.begin(); nodeIt != subNodes.end(); nodeIt++)</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  {</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> subNodeId = *nodeIt;</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="keywordflow">if</span> (subNodeId != repNodeId)</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  {</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  mergeNodeToRep(subNodeId, repNodeId);</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  }</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  }</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span> }</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span> </div><div class="line"><a name="l00515"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e"> 515</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e">Andersen::collapseNodePts</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span> {</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& nodePts = getPts(nodeId);</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> ptsClone = nodePts;</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <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="l00522"></a><span class="lineno"> 522</span>  {</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keywordflow">if</span> (isFieldInsensitive(*ptsIt))</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span> </div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="keywordflow">if</span> (collapseField(*ptsIt))</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  }</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span> }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> </div><div class="line"><a name="l00535"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61"> 535</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61">Andersen::collapseField</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span> {</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <span class="keywordflow">if</span> (consCG->isBlkObjOrConstantObj(nodeId))</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span> </div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span> </div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="keywordtype">double</span> start = stat->getClk();</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> </div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="comment">// set base node field-insensitive.</span></div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  setObjFieldInsensitive(nodeId);</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span> </div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="comment">// replace all occurrences of each field with the field-insensitive node</span></div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseId = consCG->getFIObjNode(nodeId);</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseRepNodeId = consCG->sccRepNode(baseId);</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> & allFields = consCG->getAllFieldsObjNode(baseId);</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <span class="keywordflow">for</span> (NodeBS::iterator fieldIt = allFields.begin(), fieldEit = allFields.end(); fieldIt != fieldEit; fieldIt++)</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  {</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldId = *fieldIt;</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <span class="keywordflow">if</span> (fieldId != baseId)</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  {</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <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="l00561"></a><span class="lineno"> 561</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a212231734fa43d5c7414137deaac7df3">NodeSet</a> revPts = getRevPts(fieldId);</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : revPts)</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  {</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="comment">// change the points-to target from field to base node</span></div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  clearPts(o, fieldId);</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  addPts(o, baseId);</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  pushIntoWorklist(o);</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span> </div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  }</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="comment">// merge field node into base node, including edges and pts.</span></div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldRepNodeId = consCG->sccRepNode(fieldId);</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  <span class="keywordflow">if</span> (fieldRepNodeId != baseRepNodeId){</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  mergeNodeToRep(fieldRepNodeId, baseRepNodeId);</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span> </div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <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="l00577"></a><span class="lineno"> 577</span>  redundantGepNodes.set(fieldId);</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  }</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  }</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  }</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span> </div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  <span class="keywordflow">if</span> (consCG->isPWCNode(baseRepNodeId))</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="keywordflow">if</span> (collapseNodePts(baseRepNodeId))</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span> </div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="keywordtype">double</span> end = stat->getClk();</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  timeOfCollapse += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span> </div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span> }</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span> </div><div class="line"><a name="l00595"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc"> 595</a></span> <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a>& <a class="code" href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc">Andersen::SCCDetect</a>()</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span> {</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  numOfSCCDetection++;</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span> </div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordtype">double</span> sccStart = stat->getClk();</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <a class="code" href="classSVF_1_1WPASolver.html#aaa932894d00b69cfa741f9987a9cc6b8">WPAConstraintSolver::SCCDetect</a>();</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  <span class="keywordtype">double</span> sccEnd = stat->getClk();</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span> </div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  timeOfSCCDetection += (sccEnd - sccStart)/<a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span> </div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <span class="keywordtype">double</span> mergeStart = stat->getClk();</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span> </div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  mergeSccCycle();</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span> </div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="keywordtype">double</span> mergeEnd = stat->getClk();</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span> </div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  timeOfSCCMerges += (mergeEnd - mergeStart)/<a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> </div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <span class="keywordflow">return</span> getSCCDetector()->topoNodeStack();</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> }</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span> </div><div class="line"><a name="l00619"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a6c60b761ddf3d6bf08c8a9c3f6fd9f0b"> 619</a></span> <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#afc2e412fe96c1fad268ba0255a2042e7">CallSiteToFunPtrMap</a>& callsites)</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span> {</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span> </div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  <span class="keywordtype">double</span> cgUpdateStart = stat->getClk();</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span> </div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#aa9661d26d1ae9c829a9296d1b6d874f4">CallEdgeMap</a> newEdges;</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  onTheFlyCallGraphSolve(callsites,newEdges);</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> cpySrcNodes; </div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  <span class="keywordflow">for</span>(CallEdgeMap::iterator it = newEdges.begin(), eit = newEdges.end(); it!=eit; ++it )</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  {</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">SVFUtil::getLLVMCallSite</a>(it->first->getCallSite());</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <span class="keywordflow">for</span>(FunctionSet::iterator cit = it->second.begin(), ecit = it->second.end(); cit!=ecit; ++cit)</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  {</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  connectCaller2CalleeParams(cs,*cit,cpySrcNodes);</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  }</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  }</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keywordflow">for</span>(NodePairSet::iterator it = cpySrcNodes.begin(), eit = cpySrcNodes.end(); it!=eit; ++it)</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  {</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  pushIntoWorklist(it->first);</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  }</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span> </div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  <span class="keywordtype">double</span> cgUpdateEnd = stat->getClk();</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  timeOfUpdateCallGraph += (cgUpdateEnd - cgUpdateStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span> </div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <span class="keywordflow">return</span> (!newEdges.empty());</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span> }</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span> </div><div class="line"><a name="l00646"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a7b1b9e9b25b5643440aca77e23a8de07"> 646</a></span> <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> &cpySrcNodes)</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span> {</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(cs) == <span class="keyword">nullptr</span> && <span class="stringliteral">"not an indirect callsite?"</span>);</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <a class="code" href="classSVF_1_1RetBlockNode.html">RetBlockNode</a>* retBlockNode = pag->getICFG()->getRetBlockNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* cs_return = pag->getCallSiteRet(retBlockNode);</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcret;</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  CallSite2DummyValPN::const_iterator it = callsite2DummyValPN.find(cs);</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  <span class="keywordflow">if</span>(it != callsite2DummyValPN.end())</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  {</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  srcret = sccRepNode(it->second);</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  }</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  {</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> valNode = pag->addDummyValNode();</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> objNode = pag->addDummyObjNode(cs.<a class="code" href="classSVF_1_1CallSite.html#a9b7d53a345875e4e6c72eb23ac6475de">getType</a>());</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  addPts(valNode,objNode);</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  callsite2DummyValPN.insert(std::make_pair(cs,valNode));</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  consCG->addConstraintNode(<span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>(valNode),valNode);</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  consCG->addConstraintNode(<span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>(objNode),objNode);</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  srcret = valNode;</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  }</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span> </div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstrec = sccRepNode(cs_return-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <span class="keywordflow">if</span>(addCopyEdge(srcret, dstrec))</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  cpySrcNodes.insert(std::make_pair(srcret,dstrec));</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span> }</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span> </div><div class="line"><a name="l00676"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a5a90e681e46c52ffd3debf02910c7ecf"> 676</a></span> <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> &cpySrcNodes)</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span> {</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(F);</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span> </div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"connect parameters from indirect callsite "</span> << *cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>() << <span class="stringliteral">" to callee "</span> << *F << <span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span> </div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* callBlockNode = pag->getICFG()->getCallBlockNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  <a class="code" href="classSVF_1_1RetBlockNode.html">RetBlockNode</a>* retBlockNode = pag->getICFG()->getRetBlockNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span> </div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a19b96a872d9096037f20e25122e469ea">SVFUtil::isHeapAllocExtFunViaRet</a>(F) && pag->callsiteHasRet(retBlockNode))</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  {</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  heapAllocatorViaIndCall(cs,cpySrcNodes);</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  }</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span> </div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <span class="keywordflow">if</span> (pag->funHasRet(F) && pag->callsiteHasRet(retBlockNode))</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  {</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* cs_return = pag->getCallSiteRet(retBlockNode);</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* fun_return = pag->getFunRet(F);</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  <span class="keywordflow">if</span> (cs_return-><a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>() && fun_return-><a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>())</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  {</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstrec = sccRepNode(cs_return-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcret = sccRepNode(fun_return-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  <span class="keywordflow">if</span>(addCopyEdge(srcret, dstrec))</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  {</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  cpySrcNodes.insert(std::make_pair(srcret,dstrec));</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  }</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  }</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  {</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"not a pointer ignored\n"</span>);</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  }</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  }</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span> </div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="keywordflow">if</span> (pag->hasCallSiteArgsMap(callBlockNode) && pag->hasFunArgsList(F))</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  {</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span> </div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <span class="comment">// connect actual and formal param</span></div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAG.html#a1aedb70211aa31a4741615e611d64397">PAG::PAGNodeList</a>& csArgList = pag->getCallSiteArgsList(callBlockNode);</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAG.html#a1aedb70211aa31a4741615e611d64397">PAG::PAGNodeList</a>& funArgList = pag->getFunArgsList(F);</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <span class="comment">//Go through the fixed parameters.</span></div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">" args:"</span>);</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  PAG::PAGNodeList::const_iterator funArgIt = funArgList.begin(), funArgEit = funArgList.end();</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  PAG::PAGNodeList::const_iterator csArgIt = csArgList.begin(), csArgEit = csArgList.end();</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  <span class="keywordflow">for</span> (; funArgIt != funArgEit; ++csArgIt, ++funArgIt)</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  {</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <span class="comment">//Some programs (e.g. Linux kernel) leave unneeded parameters empty.</span></div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  <span class="keywordflow">if</span> (csArgIt == csArgEit)</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  {</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">" !! not enough args\n"</span>);</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  }</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a> *cs_arg = *csArgIt ;</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a> *fun_arg = *funArgIt;</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span> </div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  <span class="keywordflow">if</span> (cs_arg-><a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>() && fun_arg-><a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>())</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  {</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"process actual parm "</span> << cs_arg-><a class="code" href="classSVF_1_1PAGNode.html#a2a9a5feb62138307b0b6f901cb5e0e0f">toString</a>() << <span class="stringliteral">" \n"</span>);</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcAA = sccRepNode(cs_arg-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstFA = sccRepNode(fun_arg-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <span class="keywordflow">if</span>(addCopyEdge(srcAA, dstFA))</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  {</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  cpySrcNodes.insert(std::make_pair(srcAA,dstFA));</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  }</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  }</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  }</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span> </div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <span class="comment">//Any remaining actual args must be varargs.</span></div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  <span class="keywordflow">if</span> (F-><a class="code" href="classSVF_1_1SVFFunction.html#a3c1fa59deae39c75c72c97e47326d982">isVarArg</a>())</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  {</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vaF = sccRepNode(pag->getVarargNode(F));</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"\n varargs:"</span>);</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="keywordflow">for</span> (; csArgIt != csArgEit; ++csArgIt)</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  {</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a> *cs_arg = *csArgIt;</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  <span class="keywordflow">if</span> (cs_arg-><a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>())</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  {</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnAA = sccRepNode(cs_arg-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  <span class="keywordflow">if</span> (addCopyEdge(vnAA,vaF))</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  {</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  cpySrcNodes.insert(std::make_pair(vnAA,vaF));</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  }</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  }</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  }</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  }</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  <span class="keywordflow">if</span>(csArgIt != csArgEit)</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  {</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">"too many args to non-vararg func."</span>);</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">"("</span> + <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>()) + <span class="stringliteral">")"</span>);</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  }</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  }</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span> }</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span> </div><div class="line"><a name="l00771"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e"> 771</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e">Andersen::mergeSrcToTgt</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newRepId)</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span> {</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span> </div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <span class="keywordflow">if</span>(nodeId==newRepId)</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span> </div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  updatePropaPts(newRepId, nodeId);</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  unionPts(newRepId,nodeId);</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span> </div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG->getConstraintNode(nodeId);</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  <span class="keywordtype">bool</span> gepInsideScc = consCG->moveEdgesToRepNode(node, consCG->getConstraintNode(newRepId));</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span> </div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  updateNodeRepAndSubs(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(),newRepId);</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span> </div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  consCG->removeConstraintNode(node);</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span> </div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  <span class="keywordflow">return</span> gepInsideScc;</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span> }</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span> <span class="comment">/*</span></div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span> <span class="comment"> * Merge a node to its rep node based on SCC detection</span></div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span> <span class="comment"> */</span></div><div class="line"><a name="l00795"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848"> 795</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848">Andersen::mergeNodeToRep</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId,<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newRepId)</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span> {</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span> </div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG->getConstraintNode(nodeId);</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  <span class="keywordtype">bool</span> gepInsideScc = mergeSrcToTgt(nodeId,newRepId);</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  <span class="keywordflow">if</span> (gepInsideScc || node-><a class="code" href="classSVF_1_1ConstraintNode.html#a0ffe4f1ca1a6f70466cc1c6b3b12c90d">isPWCNode</a>())</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  consCG->setPWCNode(newRepId);</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span> }</div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span> </div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span> <span class="comment">/*</span></div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span> <span class="comment"> * Updates subnodes of its rep, and rep node of its subs</span></div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span> <span class="comment"> */</span></div><div class="line"><a name="l00811"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18"> 811</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18">Andersen::updateNodeRepAndSubs</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newRepId)</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span> {</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  consCG->setRep(nodeId,newRepId);</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> repSubs;</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  repSubs.set(nodeId);</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  <span class="comment">// update nodeToSubsMap, union its subs with its rep Subs</span></div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>& nodeSubs = consCG->sccSubNodes(nodeId);</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  <span class="keywordflow">for</span>(NodeBS::iterator sit = nodeSubs.begin(), esit = nodeSubs.end(); sit!=esit; ++sit)</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  {</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> subId = *sit;</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  consCG->setRep(subId,newRepId);</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  }</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  repSubs |= nodeSubs;</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  consCG->setSubs(newRepId,repSubs);</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  consCG->resetSubs(nodeId);</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span> }</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span> </div><div class="line"><a name="l00829"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae1ff65a411f2c4dfee0973ad4af48daf"> 829</a></span> <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="l00830"></a><span class="lineno"> 830</span> <span class="keyword"></span>{</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="classSVF_1_1Options.html#adfc1a5c6098d3867e29fc65ca9ffa1cc">Options::MaxFieldLimit</a> == 0 && <span class="stringliteral">"Andersen::cluster: clustering for Andersen's is currently only supported in field-insesnsitive analysis"</span>);</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  <a class="code" href="classSVF_1_1Steensgaard.html">Steensgaard</a> *steens = <a class="code" href="classSVF_1_1Steensgaard.html#a33714348b5ed79d579039014f3092b87">Steensgaard::createSteensgaard</a>(pag);</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  std::vector<std::pair<unsigned, unsigned>> keys;</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">PAG::iterator</a> pit = pag->begin(); pit != pag->end(); ++pit)</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  {</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  keys.push_back(std::make_pair(pit->first, 1));</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  }</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span> </div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  std::vector<std::pair<hclust_fast_methods, std::vector<NodeID>>> candidates;</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> nodeMapping =</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  std::make_shared<std::vector<NodeID>>(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b">NodeIDAllocator::Clusterer::cluster</a>(steens, keys, candidates, <span class="stringliteral">"aux-steens"</span>));</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> reverseNodeMapping =</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  std::make_shared<std::vector<NodeID>>(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f">NodeIDAllocator::Clusterer::getReverseNodeMapping</a>(*nodeMapping));</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span> </div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  <a class="code" href="classSVF_1_1PointsTo.html#a84eca4c7fc833f8ca4d119cd4da08ca8">PointsTo::setCurrentBestNodeMapping</a>(nodeMapping, reverseNodeMapping);</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span> }</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span> </div><div class="line"><a name="l00851"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a"> 851</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a">Andersen::dumpTopLevelPtsTo</a>()</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span> {</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="keywordflow">for</span> (OrderedNodeSet::iterator nIter = this->getAllValidPtrs().begin();</div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  nIter != this->getAllValidPtrs().end(); ++nIter)</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  {</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* node = getPAG()->getPAGNode(*nIter);</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="keywordflow">if</span> (getPAG()->isValidTopLevelPtr(node))</div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  {</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& pts = this->getPts(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"\nNodeID "</span> << node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>() << <span class="stringliteral">" "</span>;</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span> </div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  <span class="keywordflow">if</span> (pts.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>())</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  {</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"\t\tPointsTo: {empty}\n\n"</span>;</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  }</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  {</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"\t\tPointsTo: { "</span>;</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span> </div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  multiset<Size_t> line;</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  <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="l00872"></a><span class="lineno"> 872</span>  it != eit; ++it)</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  {</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  line.insert(*it);</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  }</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="keywordflow">for</span> (multiset<Size_t>::const_iterator it = line.begin(); it != line.end(); ++it)</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << *it << <span class="stringliteral">" "</span>;</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"}\n\n"</span>;</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  }</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  }</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  }</div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span> </div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>().flush();</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span> }</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span> </div><div class="ttc" id="Andersen_8h_html"><div class="ttname"><a href="Andersen_8h.html">Andersen.h</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> <span class="comment">//===- Andersen.cpp -- Field-sensitive Andersen's analysis-------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// Copyright (C) <2013-2017> <Yulei Sui></span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> </div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <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> <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> <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> <span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <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> <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> <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> <span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <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> <span class="comment">// along with this program. If not, see <http://www.gnu.org/licenses/>.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"> * Andersen.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> * Created on: Nov 12, 2013</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * Author: Yulei Sui</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include "<a class="code" href="LLVMUtil_8h.html">SVF-FE/LLVMUtil.h</a>"</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include "<a class="code" href="PointsTo_8h.html">MemoryModel/PointsTo.h</a>"</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include "<a class="code" href="Andersen_8h.html">WPA/Andersen.h</a>"</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="preprocessor">#include "<a class="code" href="Steensgaard_8h.html">WPA/Steensgaard.h</a>"</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> </div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <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> <span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> </div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a70e60ce2e6f4cfd575c6f5c974ca1081">AndersenBase::numOfProcessedAddr</a> = 0;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a9d7b6e602e1764f76583824dddebf985">AndersenBase::numOfProcessedCopy</a> = 0;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a25de7638a692832f0d4727815ff270f6">AndersenBase::numOfProcessedGep</a> = 0;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a5f1b0711583aa8947dfb4619658f1904">AndersenBase::numOfProcessedLoad</a> = 0;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#ae18183a5d8ebd46fcdb9246bd643b150">AndersenBase::numOfProcessedStore</a> = 0;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#aa31bc83cdeaa30dd0975976e29a5be12">AndersenBase::numOfSfrs</a> = 0;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#ad21fc4e60abc4e6030880f8197e1c93f">AndersenBase::numOfFieldExpand</a> = 0;</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> </div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a6da6e1231a46fde6925493045b8b2490">AndersenBase::numOfSCCDetection</a> = 0;</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a6b7d0e57f741c446d0bf178939960143">AndersenBase::timeOfSCCDetection</a> = 0;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a02c5a50b214d36921e1404784e76704d">AndersenBase::timeOfSCCMerges</a> = 0;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#ad40b196c2c699bd115529b806d20de25">AndersenBase::timeOfCollapse</a> = 0;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#abdc249ea291d0247f6b91a8fcc7df341">AndersenBase::AveragePointsToSetSize</a> = 0;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a7cfafe54d564c9401f435362d44d3f9c">AndersenBase::MaxPointsToSetSize</a> = 0;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#aae14de6fbca9280d8d0290326aa493f0">AndersenBase::timeOfProcessCopyGep</a> = 0;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a9fe738f1e11c80006d540f246a80bfdf">AndersenBase::timeOfProcessLoadStore</a> = 0;</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a2afb49f513c9534fd051117b59dc056b">AndersenBase::timeOfUpdateCallGraph</a> = 0;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> </div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> </div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac"> 64</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac">AndersenBase::initialize</a>()</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> {</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a431ec4f85eb0f029e5740b92fd9ceb32">PointerAnalysis::initialize</a>();</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  consCG = <span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintGraph.html">ConstraintGraph</a>(pag);</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  setGraph(consCG);</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  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="l00073"></a><span class="lineno"> 73</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a69a7d0431c0ddfefed1cb97f3571303a">Options::ConsCGDotGraph</a>)</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  consCG->dump(<span class="stringliteral">"consCG_initial"</span>);</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> }</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> </div><div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67"> 80</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67">AndersenBase::finalize</a>()</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a69a7d0431c0ddfefed1cb97f3571303a">Options::ConsCGDotGraph</a>)</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  consCG->dump(<span class="stringliteral">"consCG_final"</span>);</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> </div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a87516daebb3d1b5fee9037068d60e268">Options::PrintCGGraph</a>)</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  consCG->print();</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a9128b7d4aaf4912b5db20aca4c22e852">BVDataPTAImpl::finalize</a>();</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> }</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> </div><div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a944966086ecb716184c8cdcc43db5751"> 94</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a944966086ecb716184c8cdcc43db5751">AndersenBase::analyze</a>()</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> {</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  initialize();</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> </div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keywordtype">bool</span> readResultsFromFile = <span class="keyword">false</span>;</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keywordflow">if</span>(!<a class="code" href="classSVF_1_1Options.html#a98a521e5c99c5248eae8f8234453b116">Options::ReadAnder</a>.<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>()) {</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  readResultsFromFile = this->readFromFile(<a class="code" href="classSVF_1_1Options.html#a98a521e5c99c5248eae8f8234453b116">Options::ReadAnder</a>);</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="comment">// Finalize the analysis</span></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a118dabc50024b5cd91095814ade47166">PointerAnalysis::finalize</a>();</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  }</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> </div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="keywordflow">if</span>(!readResultsFromFile)</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  {</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <span class="comment">// Start solving constraints</span></div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"Start Solving Constraints\n"</span>));</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> </div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <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="l00112"></a><span class="lineno"> 112</span> </div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  initWorklist();</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keywordflow">do</span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  {</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  numOfIteration++;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keywordflow">if</span> (0 == numOfIteration % iterationForPrintStat)</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  printStat();</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> </div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  reanalyze = <span class="keyword">false</span>;</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> </div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  solveWorklist();</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keywordflow">if</span> (updateCallGraph(getIndirectCallsites()))</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  reanalyze = <span class="keyword">true</span>;</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> </div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  }</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">while</span> (reanalyze);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> </div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="comment">// Analysis is finished, reset the alarm if we set it.</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a168f7f7a3a8c70dbf2b5b4269cd4c7c5">SVFUtil::stopAnalysisLimitTimer</a>(limitTimerSet);</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span> </div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"Finish Solving Constraints\n"</span>));</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span> </div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="comment">// Finalize the analysis</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  finalize();</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  }</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span> </div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keywordflow">if</span> (!<a class="code" href="classSVF_1_1Options.html#a4c7eb57066c80c62ef394d644833214a">Options::WriteAnder</a>.<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>())</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  this->writeToFile(<a class="code" href="classSVF_1_1Options.html#a4c7eb57066c80c62ef394d644833214a">Options::WriteAnder</a>);</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span> }</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> </div><div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#aebfe0c7238eb24f74f105b950b86cb5e"> 143</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#aebfe0c7238eb24f74f105b950b86cb5e">AndersenBase::cleanConsCG</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <span class="keywordtype">id</span>) {</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  consCG->resetSubs(consCG->getRep(<span class="keywordtype">id</span>));</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> sub: consCG->getSubs(<span class="keywordtype">id</span>))</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  consCG->resetRep(sub);</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  consCG->resetSubs(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  consCG->resetRep(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(!consCG->hasGNode(<span class="keywordtype">id</span>) && <span class="stringliteral">"this is either a rep nodeid or a sub nodeid should have already been merged to its field-insensitive base! "</span>);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> }</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> </div><div class="line"><a name="l00152"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#af37392229dab0a1f2f807a12186c3b39"> 152</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#af37392229dab0a1f2f807a12186c3b39">AndersenBase::normalizePointsTo</a>()</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span> {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <a class="code" href="classSVF_1_1PAG.html#a49da7e7d6273a0d8798166f95ce6bb16">PAG::MemObjToFieldsMap</a> &memToFieldsMap = pag->getMemToFieldsMap();</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <a class="code" href="classSVF_1_1PAG.html#a80b31ccc3263c7d5d93aa1247eea0853">PAG::NodeLocationSetMap</a> &GepObjNodeMap = pag->getGepObjNodeMap();</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span> </div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="comment">// clear GepObjNodeMap/memToFieldsMap/nodeToSubsMap/nodeToRepMap</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="comment">// for redundant gepnodes and remove those nodes from pag</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n: redundantGepNodes) {</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> base = pag->getBaseObjNode(n);</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <a class="code" href="classSVF_1_1GepObjPN.html">GepObjPN</a> *gepNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1GepObjPN.html">GepObjPN</a>>(pag->getPAGNode(n));</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(gepNode && <span class="stringliteral">"Not a gep node in redundantGepNodes set"</span>);</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LocationSet.html">LocationSet</a> ls = gepNode-><a class="code" href="classSVF_1_1GepObjPN.html#aeb05e3a512e89c7af36c675e0efeec7e">getLocationSet</a>();</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  GepObjNodeMap.erase(std::make_pair(base, ls));</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  memToFieldsMap[base].reset(n);</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  cleanConsCG(n);</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> </div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  pag->removeGNode(gepNode);</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  }</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> }</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> </div><div class="line"><a name="l00175"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a20617a69c112ad423b1b5021e48a8548"> 175</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a20617a69c112ad423b1b5021e48a8548">Andersen::initialize</a>()</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> {</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  resetData();</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  setDiffOpt(<a class="code" href="classSVF_1_1Options.html#acf7262c0b0bd91e6dab56a631be51206">Options::PtsDiff</a>);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  setPWCOpt(<a class="code" href="classSVF_1_1Options.html#a69579e2f37962afdbb292a36782511ed">Options::MergePWC</a>);</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <a class="code" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac">AndersenBase::initialize</a>();</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span> </div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a8459d43a21bcf8a50fc55d14fcf5a81e">Options::ClusterAnder</a>) cluster();</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> </div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  processAllAddr();</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> }</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> </div><div class="line"><a name="l00191"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c"> 191</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c">Andersen::finalize</a>()</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span> {</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="comment">// TODO: check -stat too.</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="comment">// TODO: broken</span></div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a8459d43a21bcf8a50fc55d14fcf5a81e">Options::ClusterAnder</a>)</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  {</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<std::string, std::string></a> stats;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTData.html">PTDataTy</a> *ptd = getPTDataTy();</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="comment">// TODO: should we use liveOnly?</span></div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <span class="comment">// TODO: parameterise final arg.</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <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-><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="l00202"></a><span class="lineno"> 202</span>  <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7">NodeIDAllocator::Clusterer::printStats</a>(<span class="stringliteral">"post-main"</span>, stats);</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  }</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span> </div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="comment">// sanitizePts();</span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <a class="code" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67">AndersenBase::finalize</a>();</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> }</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> </div><div class="line"><a name="l00214"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1"> 214</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1">Andersen::processNode</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> {</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="comment">// sub nodes do not need to be processed</span></div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordflow">if</span> (sccRepNode(nodeId) != nodeId)</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span> </div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG->getConstraintNode(nodeId);</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="keywordtype">double</span> insertStart = stat->getClk();</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  handleLoadStore(node);</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="keywordtype">double</span> insertEnd = stat->getClk();</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  timeOfProcessLoadStore += (insertEnd - insertStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span> </div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keywordtype">double</span> propStart = stat->getClk();</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  handleCopyGep(node);</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keywordtype">double</span> propEnd = stat->getClk();</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  timeOfProcessCopyGep += (propEnd - propStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span> }</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> </div><div class="line"><a name="l00235"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ab069683dd6ca563113efbde2813ab35e"> 235</a></span> <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="l00236"></a><span class="lineno"> 236</span> {</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId = node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  computeDiffPts(nodeId);</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> </div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordflow">if</span> (!getDiffPts(nodeId).<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>())</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  {</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge : node-><a class="code" href="classSVF_1_1ConstraintNode.html#ab77173aa8af6155b569f20ff0cdcec72">getCopyOutEdges</a>())</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  processCopy(nodeId, edge);</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge : node-><a class="code" href="classSVF_1_1ConstraintNode.html#a19d3d2c996ba821227a836717e5443c8">getGepOutEdges</a>())</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  {</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* gepEdge = SVFUtil::dyn_cast<GepCGEdge>(edge))</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  processGep(nodeId, gepEdge);</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  }</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  }</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span> }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> </div><div class="line"><a name="l00255"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a0f32ba8cb1109c257552fa775a007ffd"> 255</a></span> <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="l00256"></a><span class="lineno"> 256</span> {</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId = node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <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="l00259"></a><span class="lineno"> 259</span>  getPts(nodeId).end(); piter != epiter; ++piter)</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  {</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> ptd = *piter;</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <span class="comment">// handle load</span></div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = node-><a class="code" href="classSVF_1_1ConstraintNode.html#af69c7e623ab5a36644b6aeabaa1a1e28">outgoingLoadsBegin</a>(),</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  eit = node-><a class="code" href="classSVF_1_1ConstraintNode.html#a134e8ed040d7749c2b9a02662115f746">outgoingLoadsEnd</a>(); it != eit; ++it)</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  {</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">if</span> (processLoad(ptd, *it))</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  pushIntoWorklist(ptd);</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  }</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span> </div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="comment">// handle store</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = node-><a class="code" href="classSVF_1_1ConstraintNode.html#a5a90b39f9e5769bde44a673806270714">incomingStoresBegin</a>(),</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  eit = node-><a class="code" href="classSVF_1_1ConstraintNode.html#a8d58f5224728bb6811f12c94826167f6">incomingStoresEnd</a>(); it != eit; ++it)</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  {</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="keywordflow">if</span> (processStore(ptd, *it))</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  pushIntoWorklist((*it)->getSrcID());</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  }</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  }</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span> }</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> </div><div class="line"><a name="l00283"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10"> 283</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10">Andersen::processAllAddr</a>()</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span> {</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">ConstraintGraph::const_iterator</a> nodeIt = consCG->begin(), nodeEit = consCG->end(); nodeIt != nodeEit; nodeIt++)</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  {</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a> * cgNode = nodeIt->second;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = cgNode-><a class="code" href="classSVF_1_1ConstraintNode.html#a19c1ed324f65f4cc58dd2fd21ed4a971">incomingAddrsBegin</a>(), eit = cgNode-><a class="code" href="classSVF_1_1ConstraintNode.html#ae8ac9ad8e766b961c7ce06d7219f37af">incomingAddrsEnd</a>();</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  it != eit; ++it)</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  processAddr(SVFUtil::cast<AddrCGEdge>(*it));</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  }</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span> }</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span> </div><div class="line"><a name="l00297"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#aca095e135edb5d27efe76bb7ee71184c"> 297</a></span> <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="l00298"></a><span class="lineno"> 298</span> {</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  numOfProcessedAddr++;</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span> </div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = addr-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = addr-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keywordflow">if</span>(addPts(dst,src))</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  pushIntoWorklist(dst);</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span> }</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span> </div><div class="line"><a name="l00312"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de"> 312</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de">Andersen::processLoad</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">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="l00313"></a><span class="lineno"> 313</span> {</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span> <span class="comment">// if (pag->isBlkObjOrConstantObj(node) || isNonPointerObj(node))</span></div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <span class="keywordflow">if</span> (pag->isConstantObj(node) || isNonPointerObj(node))</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span> </div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  numOfProcessedLoad++;</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span> </div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = load-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <span class="keywordflow">return</span> addCopyEdge(node, dst);</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span> }</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span> </div><div class="line"><a name="l00332"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024"> 332</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024">Andersen::processStore</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">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="l00333"></a><span class="lineno"> 333</span> {</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span> <span class="comment">// if (pag->isBlkObjOrConstantObj(node) || isNonPointerObj(node))</span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="keywordflow">if</span> (pag->isConstantObj(node) || isNonPointerObj(node))</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span> </div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  numOfProcessedStore++;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span> </div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = store-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <span class="keywordflow">return</span> addCopyEdge(src, node);</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span> }</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span> </div><div class="line"><a name="l00352"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2"> 352</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2">Andersen::processCopy</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">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="l00353"></a><span class="lineno"> 353</span> {</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  numOfProcessedCopy++;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span> </div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>((SVFUtil::isa<CopyCGEdge>(edge)) && <span class="stringliteral">"not copy/call/ret ??"</span>);</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = edge-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& srcPts = getDiffPts(node);</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> </div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  <span class="keywordtype">bool</span> changed = unionPts(dst, srcPts);</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="keywordflow">if</span> (changed)</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  pushIntoWorklist(dst);</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span> }</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span> </div><div class="line"><a name="l00372"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f"> 372</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f">Andersen::processGep</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* edge)</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> {</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& srcPts = getDiffPts(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>());</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="keywordflow">return</span> processGepPts(srcPts, edge);</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span> }</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span> </div><div class="line"><a name="l00381"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac6b1efcaadfed48c226701ecf6bac55e"> 381</a></span> <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>& pts, <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* edge)</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> {</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  numOfProcessedGep++;</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> </div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> tmpDstPts;</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="keywordflow">if</span> (SVFUtil::isa<VariantGepCGEdge>(edge))</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  {</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="comment">// If a pointer is connected by a variant gep edge,</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <span class="comment">// then set this memory object to be field insensitive,</span></div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <span class="comment">// unless the object is a black hole/constant.</span></div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  {</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keywordflow">if</span> (consCG->isBlkObjOrConstantObj(o))</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  {</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  }</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span> </div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="keywordflow">if</span> (!isFieldInsensitive(o))</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  {</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  setObjFieldInsensitive(o);</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  consCG->addNodeToBeCollapsed(consCG->getBaseObjNode(o));</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  }</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> </div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <span class="comment">// Add the field-insensitive node into pts.</span></div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseId = consCG->getFIObjNode(o);</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(baseId);</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  }</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  }</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <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<NormalGepCGEdge>(edge))</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  {</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="comment">// TODO: after the node is set to field insensitive, handling invariant</span></div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <span class="comment">// gep edge may lose precision because offsets here are ignored, and the</span></div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <span class="comment">// base object is always returned.</span></div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  {</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="keywordflow">if</span> (consCG->isBlkObjOrConstantObj(o))</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  {</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  }</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> </div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <span class="keywordflow">if</span> (!matchType(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>(), o, normalGepEdge)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span> </div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldSrcPtdNode = consCG->getGepObjNode(o, normalGepEdge->getLocationSet());</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(fieldSrcPtdNode);</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  addTypeForGepObjNode(fieldSrcPtdNode, normalGepEdge);</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  }</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  }</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  {</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> && <span class="stringliteral">"Andersen::processGepPts: New type GEP edge type?"</span>);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  }</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span> </div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstId = edge-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <span class="keywordflow">if</span> (unionPts(dstId, tmpDstPts))</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  {</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  pushIntoWorklist(dstId);</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  }</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span> </div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span> }</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span> </div><div class="line"><a name="l00448"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae79bff0e9c49f15e7db00ed605824d98"> 448</a></span> <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#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span> {</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="comment">// If a node is a PWC node, collapse all its points-to tarsget.</span></div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="comment">// collapseNodePts() may change the points-to set of the nodes which have been processed</span></div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  <span class="comment">// before, in this case, we may need to re-do the analysis.</span></div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="keywordflow">if</span> (mergePWC() && consCG->isPWCNode(nodeId) && collapseNodePts(nodeId))</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  reanalyze = <span class="keyword">true</span>;</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span> }</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span> </div><div class="line"><a name="l00457"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac22a6946de30bc5887b9e4ec9259764f"> 457</a></span> <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="l00458"></a><span class="lineno"> 458</span> {</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordflow">while</span> (consCG->hasNodesToBeCollapsed())</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  {</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> node = consCG->getNextCollapseNode();</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="comment">// collapseField() may change the points-to set of the nodes which have been processed</span></div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="comment">// before, in this case, we may need to re-do the analysis.</span></div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keywordflow">if</span> (collapseField(node))</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  reanalyze = <span class="keyword">true</span>;</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  }</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span> }</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span> </div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span> <span class="comment">/*</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span> <span class="comment"> * Merge constraint graph nodes based on SCC cycle detected.</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span> <span class="comment"> */</span></div><div class="line"><a name="l00472"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef"> 472</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef">Andersen::mergeSccCycle</a>()</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span> {</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a> revTopoOrder;</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a> & topoOrder = getSCCDetector()->topoNodeStack();</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="keywordflow">while</span> (!topoOrder.empty())</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  {</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> repNodeId = topoOrder.top();</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  topoOrder.pop();</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  revTopoOrder.push(repNodeId);</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>& subNodes = getSCCDetector()->subNodes(repNodeId);</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <span class="comment">// merge sub nodes to rep node</span></div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  mergeSccNodes(repNodeId, subNodes);</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  }</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span> </div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <span class="comment">// restore the topological order for later solving.</span></div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keywordflow">while</span> (!revTopoOrder.empty())</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  {</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId = revTopoOrder.top();</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  revTopoOrder.pop();</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  topoOrder.push(nodeId);</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  }</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span> }</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span> </div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span> </div><div class="line"><a name="l00500"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a"> 500</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a">Andersen::mergeSccNodes</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> repNodeId, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>& subNodes)</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span> {</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  <span class="keywordflow">for</span> (NodeBS::iterator nodeIt = subNodes.begin(); nodeIt != subNodes.end(); nodeIt++)</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  {</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> subNodeId = *nodeIt;</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="keywordflow">if</span> (subNodeId != repNodeId)</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  {</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  mergeNodeToRep(subNodeId, repNodeId);</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  }</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  }</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span> }</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span> </div><div class="line"><a name="l00515"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e"> 515</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e">Andersen::collapseNodePts</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span> {</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& nodePts = getPts(nodeId);</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> ptsClone = nodePts;</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <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="l00522"></a><span class="lineno"> 522</span>  {</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keywordflow">if</span> (isFieldInsensitive(*ptsIt))</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span> </div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="keywordflow">if</span> (collapseField(*ptsIt))</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  }</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span> }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> </div><div class="line"><a name="l00535"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61"> 535</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61">Andersen::collapseField</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span> {</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <span class="keywordflow">if</span> (consCG->isBlkObjOrConstantObj(nodeId))</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span> </div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span> </div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="keywordtype">double</span> start = stat->getClk();</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> </div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="comment">// set base node field-insensitive.</span></div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  setObjFieldInsensitive(nodeId);</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span> </div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="comment">// replace all occurrences of each field with the field-insensitive node</span></div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseId = consCG->getFIObjNode(nodeId);</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseRepNodeId = consCG->sccRepNode(baseId);</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> & allFields = consCG->getAllFieldsObjNode(baseId);</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <span class="keywordflow">for</span> (NodeBS::iterator fieldIt = allFields.begin(), fieldEit = allFields.end(); fieldIt != fieldEit; fieldIt++)</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  {</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldId = *fieldIt;</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <span class="keywordflow">if</span> (fieldId != baseId)</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  {</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <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="l00561"></a><span class="lineno"> 561</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a212231734fa43d5c7414137deaac7df3">NodeSet</a> revPts = getRevPts(fieldId);</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : revPts)</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  {</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="comment">// change the points-to target from field to base node</span></div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  clearPts(o, fieldId);</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  addPts(o, baseId);</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  pushIntoWorklist(o);</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span> </div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  }</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="comment">// merge field node into base node, including edges and pts.</span></div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldRepNodeId = consCG->sccRepNode(fieldId);</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  mergeNodeToRep(fieldRepNodeId, baseRepNodeId);</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <span class="keywordflow">if</span> (fieldId != baseRepNodeId){</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <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="l00576"></a><span class="lineno"> 576</span>  <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="l00577"></a><span class="lineno"> 577</span>  redundantGepNodes.set(fieldId);</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  }</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  }</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  }</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span> </div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  <span class="keywordflow">if</span> (consCG->isPWCNode(baseRepNodeId))</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="keywordflow">if</span> (collapseNodePts(baseRepNodeId))</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span> </div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="keywordtype">double</span> end = stat->getClk();</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  timeOfCollapse += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span> </div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span> }</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span> </div><div class="line"><a name="l00595"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc"> 595</a></span> <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a>& <a class="code" href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc">Andersen::SCCDetect</a>()</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span> {</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  numOfSCCDetection++;</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span> </div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordtype">double</span> sccStart = stat->getClk();</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <a class="code" href="classSVF_1_1WPASolver.html#aaa932894d00b69cfa741f9987a9cc6b8">WPAConstraintSolver::SCCDetect</a>();</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  <span class="keywordtype">double</span> sccEnd = stat->getClk();</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span> </div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  timeOfSCCDetection += (sccEnd - sccStart)/<a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span> </div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <span class="keywordtype">double</span> mergeStart = stat->getClk();</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span> </div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  mergeSccCycle();</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span> </div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="keywordtype">double</span> mergeEnd = stat->getClk();</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span> </div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  timeOfSCCMerges += (mergeEnd - mergeStart)/<a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> </div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <span class="keywordflow">return</span> getSCCDetector()->topoNodeStack();</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> }</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span> </div><div class="line"><a name="l00619"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a6c60b761ddf3d6bf08c8a9c3f6fd9f0b"> 619</a></span> <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#afc2e412fe96c1fad268ba0255a2042e7">CallSiteToFunPtrMap</a>& callsites)</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span> {</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span> </div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  <span class="keywordtype">double</span> cgUpdateStart = stat->getClk();</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span> </div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#aa9661d26d1ae9c829a9296d1b6d874f4">CallEdgeMap</a> newEdges;</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  onTheFlyCallGraphSolve(callsites,newEdges);</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> cpySrcNodes; </div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  <span class="keywordflow">for</span>(CallEdgeMap::iterator it = newEdges.begin(), eit = newEdges.end(); it!=eit; ++it )</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  {</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">SVFUtil::getLLVMCallSite</a>(it->first->getCallSite());</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <span class="keywordflow">for</span>(FunctionSet::iterator cit = it->second.begin(), ecit = it->second.end(); cit!=ecit; ++cit)</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  {</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  connectCaller2CalleeParams(cs,*cit,cpySrcNodes);</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  }</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  }</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keywordflow">for</span>(NodePairSet::iterator it = cpySrcNodes.begin(), eit = cpySrcNodes.end(); it!=eit; ++it)</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  {</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  pushIntoWorklist(it->first);</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  }</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span> </div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  <span class="keywordtype">double</span> cgUpdateEnd = stat->getClk();</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  timeOfUpdateCallGraph += (cgUpdateEnd - cgUpdateStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span> </div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <span class="keywordflow">return</span> (!newEdges.empty());</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span> }</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span> </div><div class="line"><a name="l00646"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a7b1b9e9b25b5643440aca77e23a8de07"> 646</a></span> <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> &cpySrcNodes)</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span> {</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(cs) == <span class="keyword">nullptr</span> && <span class="stringliteral">"not an indirect callsite?"</span>);</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <a class="code" href="classSVF_1_1RetBlockNode.html">RetBlockNode</a>* retBlockNode = pag->getICFG()->getRetBlockNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* cs_return = pag->getCallSiteRet(retBlockNode);</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcret;</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  CallSite2DummyValPN::const_iterator it = callsite2DummyValPN.find(cs);</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  <span class="keywordflow">if</span>(it != callsite2DummyValPN.end())</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  {</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  srcret = sccRepNode(it->second);</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  }</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  {</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> valNode = pag->addDummyValNode();</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> objNode = pag->addDummyObjNode(cs.<a class="code" href="classSVF_1_1CallSite.html#a9b7d53a345875e4e6c72eb23ac6475de">getType</a>());</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  addPts(valNode,objNode);</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  callsite2DummyValPN.insert(std::make_pair(cs,valNode));</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  consCG->addConstraintNode(<span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>(valNode),valNode);</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  consCG->addConstraintNode(<span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>(objNode),objNode);</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  srcret = valNode;</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  }</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span> </div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstrec = sccRepNode(cs_return-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <span class="keywordflow">if</span>(addCopyEdge(srcret, dstrec))</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  cpySrcNodes.insert(std::make_pair(srcret,dstrec));</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span> }</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span> </div><div class="line"><a name="l00676"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a5a90e681e46c52ffd3debf02910c7ecf"> 676</a></span> <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> &cpySrcNodes)</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span> {</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(F);</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span> </div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"connect parameters from indirect callsite "</span> << *cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>() << <span class="stringliteral">" to callee "</span> << *F << <span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span> </div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* callBlockNode = pag->getICFG()->getCallBlockNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  <a class="code" href="classSVF_1_1RetBlockNode.html">RetBlockNode</a>* retBlockNode = pag->getICFG()->getRetBlockNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span> </div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a19b96a872d9096037f20e25122e469ea">SVFUtil::isHeapAllocExtFunViaRet</a>(F) && pag->callsiteHasRet(retBlockNode))</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  {</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  heapAllocatorViaIndCall(cs,cpySrcNodes);</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  }</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span> </div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <span class="keywordflow">if</span> (pag->funHasRet(F) && pag->callsiteHasRet(retBlockNode))</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  {</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* cs_return = pag->getCallSiteRet(retBlockNode);</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* fun_return = pag->getFunRet(F);</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  <span class="keywordflow">if</span> (cs_return-><a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>() && fun_return-><a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>())</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  {</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstrec = sccRepNode(cs_return-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcret = sccRepNode(fun_return-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  <span class="keywordflow">if</span>(addCopyEdge(srcret, dstrec))</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  {</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  cpySrcNodes.insert(std::make_pair(srcret,dstrec));</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  }</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  }</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  {</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"not a pointer ignored\n"</span>);</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  }</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  }</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span> </div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="keywordflow">if</span> (pag->hasCallSiteArgsMap(callBlockNode) && pag->hasFunArgsList(F))</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  {</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span> </div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <span class="comment">// connect actual and formal param</span></div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAG.html#a1aedb70211aa31a4741615e611d64397">PAG::PAGNodeList</a>& csArgList = pag->getCallSiteArgsList(callBlockNode);</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAG.html#a1aedb70211aa31a4741615e611d64397">PAG::PAGNodeList</a>& funArgList = pag->getFunArgsList(F);</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <span class="comment">//Go through the fixed parameters.</span></div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">" args:"</span>);</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  PAG::PAGNodeList::const_iterator funArgIt = funArgList.begin(), funArgEit = funArgList.end();</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  PAG::PAGNodeList::const_iterator csArgIt = csArgList.begin(), csArgEit = csArgList.end();</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  <span class="keywordflow">for</span> (; funArgIt != funArgEit; ++csArgIt, ++funArgIt)</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  {</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <span class="comment">//Some programs (e.g. Linux kernel) leave unneeded parameters empty.</span></div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  <span class="keywordflow">if</span> (csArgIt == csArgEit)</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  {</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">" !! not enough args\n"</span>);</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  }</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a> *cs_arg = *csArgIt ;</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a> *fun_arg = *funArgIt;</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span> </div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  <span class="keywordflow">if</span> (cs_arg-><a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>() && fun_arg-><a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>())</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  {</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"process actual parm "</span> << cs_arg-><a class="code" href="classSVF_1_1PAGNode.html#a2a9a5feb62138307b0b6f901cb5e0e0f">toString</a>() << <span class="stringliteral">" \n"</span>);</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcAA = sccRepNode(cs_arg-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstFA = sccRepNode(fun_arg-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <span class="keywordflow">if</span>(addCopyEdge(srcAA, dstFA))</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  {</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  cpySrcNodes.insert(std::make_pair(srcAA,dstFA));</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  }</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  }</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  }</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span> </div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <span class="comment">//Any remaining actual args must be varargs.</span></div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  <span class="keywordflow">if</span> (F-><a class="code" href="classSVF_1_1SVFFunction.html#a3c1fa59deae39c75c72c97e47326d982">isVarArg</a>())</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  {</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vaF = sccRepNode(pag->getVarargNode(F));</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"\n varargs:"</span>);</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="keywordflow">for</span> (; csArgIt != csArgEit; ++csArgIt)</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  {</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a> *cs_arg = *csArgIt;</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  <span class="keywordflow">if</span> (cs_arg-><a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>())</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  {</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnAA = sccRepNode(cs_arg-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  <span class="keywordflow">if</span> (addCopyEdge(vnAA,vaF))</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  {</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  cpySrcNodes.insert(std::make_pair(vnAA,vaF));</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  }</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  }</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  }</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  }</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  <span class="keywordflow">if</span>(csArgIt != csArgEit)</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  {</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">"too many args to non-vararg func."</span>);</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">"("</span> + <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>()) + <span class="stringliteral">")"</span>);</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  }</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  }</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span> }</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span> </div><div class="line"><a name="l00771"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e"> 771</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e">Andersen::mergeSrcToTgt</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newRepId)</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span> {</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span> </div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <span class="keywordflow">if</span>(nodeId==newRepId)</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span> </div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  updatePropaPts(newRepId, nodeId);</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  unionPts(newRepId,nodeId);</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span> </div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG->getConstraintNode(nodeId);</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  <span class="keywordtype">bool</span> gepInsideScc = consCG->moveEdgesToRepNode(node, consCG->getConstraintNode(newRepId));</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span> </div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  updateNodeRepAndSubs(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(),newRepId);</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span> </div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  consCG->removeConstraintNode(node);</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span> </div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  <span class="keywordflow">return</span> gepInsideScc;</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span> }</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span> <span class="comment">/*</span></div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span> <span class="comment"> * Merge a node to its rep node based on SCC detection</span></div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span> <span class="comment"> */</span></div><div class="line"><a name="l00795"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848"> 795</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848">Andersen::mergeNodeToRep</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId,<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newRepId)</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span> {</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span> </div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG->getConstraintNode(nodeId);</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  <span class="keywordtype">bool</span> gepInsideScc = mergeSrcToTgt(nodeId,newRepId);</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  <span class="keywordflow">if</span> (gepInsideScc || node-><a class="code" href="classSVF_1_1ConstraintNode.html#a0ffe4f1ca1a6f70466cc1c6b3b12c90d">isPWCNode</a>())</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  consCG->setPWCNode(newRepId);</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span> }</div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span> </div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span> <span class="comment">/*</span></div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span> <span class="comment"> * Updates subnodes of its rep, and rep node of its subs</span></div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span> <span class="comment"> */</span></div><div class="line"><a name="l00811"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18"> 811</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18">Andersen::updateNodeRepAndSubs</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newRepId)</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span> {</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  consCG->setRep(nodeId,newRepId);</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> repSubs;</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  repSubs.set(nodeId);</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span>  <span class="comment">// update nodeToSubsMap, union its subs with its rep Subs</span></div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>  <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>& nodeSubs = consCG->sccSubNodes(nodeId);</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>  <span class="keywordflow">for</span>(NodeBS::iterator sit = nodeSubs.begin(), esit = nodeSubs.end(); sit!=esit; ++sit)</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span>  {</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> subId = *sit;</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  consCG->setRep(subId,newRepId);</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  }</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  repSubs |= nodeSubs;</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  consCG->setSubs(newRepId,repSubs);</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  consCG->resetSubs(nodeId);</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span> }</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span> </div><div class="line"><a name="l00829"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae1ff65a411f2c4dfee0973ad4af48daf"> 829</a></span> <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="l00830"></a><span class="lineno"> 830</span> <span class="keyword"></span>{</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="classSVF_1_1Options.html#adfc1a5c6098d3867e29fc65ca9ffa1cc">Options::MaxFieldLimit</a> == 0 && <span class="stringliteral">"Andersen::cluster: clustering for Andersen's is currently only supported in field-insesnsitive analysis"</span>);</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  <a class="code" href="classSVF_1_1Steensgaard.html">Steensgaard</a> *steens = <a class="code" href="classSVF_1_1Steensgaard.html#a33714348b5ed79d579039014f3092b87">Steensgaard::createSteensgaard</a>(pag);</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  std::vector<std::pair<unsigned, unsigned>> keys;</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">PAG::iterator</a> pit = pag->begin(); pit != pag->end(); ++pit)</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  {</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>  keys.push_back(std::make_pair(pit->first, 1));</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  }</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span> </div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  std::vector<std::pair<hclust_fast_methods, std::vector<NodeID>>> candidates;</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> nodeMapping =</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  std::make_shared<std::vector<NodeID>>(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b">NodeIDAllocator::Clusterer::cluster</a>(steens, keys, candidates, <span class="stringliteral">"aux-steens"</span>));</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>  <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> reverseNodeMapping =</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  std::make_shared<std::vector<NodeID>>(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f">NodeIDAllocator::Clusterer::getReverseNodeMapping</a>(*nodeMapping));</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span> </div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  <a class="code" href="classSVF_1_1PointsTo.html#a84eca4c7fc833f8ca4d119cd4da08ca8">PointsTo::setCurrentBestNodeMapping</a>(nodeMapping, reverseNodeMapping);</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span> }</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span> </div><div class="line"><a name="l00851"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a"> 851</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a">Andersen::dumpTopLevelPtsTo</a>()</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span> {</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="keywordflow">for</span> (OrderedNodeSet::iterator nIter = this->getAllValidPtrs().begin();</div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  nIter != this->getAllValidPtrs().end(); ++nIter)</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  {</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* node = getPAG()->getPAGNode(*nIter);</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="keywordflow">if</span> (getPAG()->isValidTopLevelPtr(node))</div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  {</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& pts = this->getPts(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"\nNodeID "</span> << node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>() << <span class="stringliteral">" "</span>;</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span> </div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  <span class="keywordflow">if</span> (pts.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>())</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  {</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"\t\tPointsTo: {empty}\n\n"</span>;</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  }</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  {</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"\t\tPointsTo: { "</span>;</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span> </div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  multiset<Size_t> line;</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  <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="l00872"></a><span class="lineno"> 872</span>  it != eit; ++it)</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  {</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  line.insert(*it);</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  }</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="keywordflow">for</span> (multiset<Size_t>::const_iterator it = line.begin(); it != line.end(); ++it)</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << *it << <span class="stringliteral">" "</span>;</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"}\n\n"</span>;</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  }</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  }</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  }</div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span> </div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>().flush();</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span> }</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span> </div><div class="ttc" id="Andersen_8h_html"><div class="ttname"><a href="Andersen_8h.html">Andersen.h</a></div></div>
|
|
70
70
|
<div class="ttc" id="classSVF_1_1AndersenBase_html_aae14de6fbca9280d8d0290326aa493f0"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#aae14de6fbca9280d8d0290326aa493f0">SVF::AndersenBase::timeOfProcessCopyGep</a></div><div class="ttdeci">static double timeOfProcessCopyGep</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00142">Andersen.h:142</a></div></div>
|
|
71
71
|
<div class="ttc" id="classSVF_1_1Andersen_html_af4a0d960ef198047517bb32ee1e24a61"><div class="ttname"><a href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61">SVF::Andersen::collapseField</a></div><div class="ttdeci">bool collapseField(NodeID nodeId)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00535">Andersen.cpp:535</a></div></div>
|
|
72
72
|
<div class="ttc" id="classSVF_1_1PAGNode_html_a2a9a5feb62138307b0b6f901cb5e0e0f"><div class="ttname"><a href="classSVF_1_1PAGNode.html#a2a9a5feb62138307b0b6f901cb5e0e0f">SVF::PAGNode::toString</a></div><div class="ttdeci">virtual const std::string toString() const</div><div class="ttdef"><b>Definition:</b> <a href="PAG_8cpp_source.html#l00046">PAG.cpp:46</a></div></div>
|
|
@@ -1163,7 +1163,7 @@ Additional Inherited Members</h2></td></tr>
|
|
|
1163
1163
|
<p>Black hole doesn't have structures, no collapse is needed. In later versions, instead of using base node to represent the struct, we'll create new field-insensitive node. To avoid creating a new "black hole" node, do not collapse field for black hole node. </p>
|
|
1164
1164
|
|
|
1165
1165
|
<p class="definition">Definition at line <a class="el" href="Andersen_8cpp_source.html#l00535">535</a> of file <a class="el" href="Andersen_8cpp_source.html">Andersen.cpp</a>.</p>
|
|
1166
|
-
<div class="fragment"><div class="line"><a name="l00536"></a><span class="lineno"> 536</span> {</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a8ba74f82c1e796f2888ba34bc8355ce9">isBlkObjOrConstantObj</a>(nodeId))</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span> </div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span> </div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> </div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="comment">// set base node field-insensitive.</span></div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#ac5683fe2e24b393ccc5cb6d8bc92cf2b">setObjFieldInsensitive</a>(nodeId);</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span> </div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="comment">// replace all occurrences of each field with the field-insensitive node</span></div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseId = <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a5fbbfb7b935e0b8867f7beab32ab7763">getFIObjNode</a>(nodeId);</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseRepNodeId = <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a39b973543acdcdc5493832cc9d0f586f">sccRepNode</a>(baseId);</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> & allFields = <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a8200b7cbd600958c662f24169ccbc8d6">getAllFieldsObjNode</a>(baseId);</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <span class="keywordflow">for</span> (NodeBS::iterator fieldIt = allFields.begin(), fieldEit = allFields.end(); fieldIt != fieldEit; fieldIt++)</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  {</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldId = *fieldIt;</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <span class="keywordflow">if</span> (fieldId != baseId)</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  {</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <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="l00561"></a><span class="lineno"> 561</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a212231734fa43d5c7414137deaac7df3">NodeSet</a> revPts = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a58113943e4e7144d94d26991dcc8bcc7">getRevPts</a>(fieldId);</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : revPts)</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  {</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="comment">// change the points-to target from field to base node</span></div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a3f78f60e1947a6d6fbcd3a0ee11e262a">clearPts</a>(o, fieldId);</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  <a class="code" href="classSVF_1_1BVDataPTAImpl.html#af68485a2208553579f9c2e4b2cb20cff">addPts</a>(o, baseId);</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(o);</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span> </div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  }</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="comment">// merge field node into base node, including edges and pts.</span></div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldRepNodeId = <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a39b973543acdcdc5493832cc9d0f586f">sccRepNode</a>(fieldId);</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  <span class="keywordflow">if</span> (fieldRepNodeId != baseRepNodeId){</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <a class="code" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848">mergeNodeToRep</a>(fieldRepNodeId, baseRepNodeId);</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span> </div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <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="l00577"></a><span class="lineno"> 577</span>  <a class="code" href="classSVF_1_1AndersenBase.html#a6c3d6b4c004d9e43690c3807502eed74">redundantGepNodes</a>.set(fieldId);</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  }</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  }</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  }</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span> </div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a84468bc9355d31e8c3e18369036ddf5c">isPWCNode</a>(baseRepNodeId))</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e">collapseNodePts</a>(baseRepNodeId))</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span> </div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <a class="code" href="classSVF_1_1AndersenBase.html#ad40b196c2c699bd115529b806d20de25">timeOfCollapse</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span> </div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span> }</div><div class="ttc" id="classSVF_1_1ConstraintGraph_html_a8ba74f82c1e796f2888ba34bc8355ce9"><div class="ttname"><a href="classSVF_1_1ConstraintGraph.html#a8ba74f82c1e796f2888ba34bc8355ce9">SVF::ConstraintGraph::isBlkObjOrConstantObj</a></div><div class="ttdeci">bool isBlkObjOrConstantObj(NodeID id)</div><div class="ttdef"><b>Definition:</b> <a href="ConsG_8h_source.html#l00309">ConsG.h:309</a></div></div>
|
|
1166
|
+
<div class="fragment"><div class="line"><a name="l00536"></a><span class="lineno"> 536</span> {</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a8ba74f82c1e796f2888ba34bc8355ce9">isBlkObjOrConstantObj</a>(nodeId))</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span> </div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span> </div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> </div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="comment">// set base node field-insensitive.</span></div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#ac5683fe2e24b393ccc5cb6d8bc92cf2b">setObjFieldInsensitive</a>(nodeId);</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span> </div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="comment">// replace all occurrences of each field with the field-insensitive node</span></div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseId = <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a5fbbfb7b935e0b8867f7beab32ab7763">getFIObjNode</a>(nodeId);</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseRepNodeId = <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a39b973543acdcdc5493832cc9d0f586f">sccRepNode</a>(baseId);</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> & allFields = <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a8200b7cbd600958c662f24169ccbc8d6">getAllFieldsObjNode</a>(baseId);</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <span class="keywordflow">for</span> (NodeBS::iterator fieldIt = allFields.begin(), fieldEit = allFields.end(); fieldIt != fieldEit; fieldIt++)</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  {</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldId = *fieldIt;</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <span class="keywordflow">if</span> (fieldId != baseId)</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  {</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <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="l00561"></a><span class="lineno"> 561</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a212231734fa43d5c7414137deaac7df3">NodeSet</a> revPts = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a58113943e4e7144d94d26991dcc8bcc7">getRevPts</a>(fieldId);</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : revPts)</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  {</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="comment">// change the points-to target from field to base node</span></div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a3f78f60e1947a6d6fbcd3a0ee11e262a">clearPts</a>(o, fieldId);</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  <a class="code" href="classSVF_1_1BVDataPTAImpl.html#af68485a2208553579f9c2e4b2cb20cff">addPts</a>(o, baseId);</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(o);</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span> </div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  }</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="comment">// merge field node into base node, including edges and pts.</span></div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldRepNodeId = <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a39b973543acdcdc5493832cc9d0f586f">sccRepNode</a>(fieldId);</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  <a class="code" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848">mergeNodeToRep</a>(fieldRepNodeId, baseRepNodeId);</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <span class="keywordflow">if</span> (fieldId != baseRepNodeId){</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <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="l00576"></a><span class="lineno"> 576</span>  <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="l00577"></a><span class="lineno"> 577</span>  <a class="code" href="classSVF_1_1AndersenBase.html#a6c3d6b4c004d9e43690c3807502eed74">redundantGepNodes</a>.set(fieldId);</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  }</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  }</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  }</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span> </div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a84468bc9355d31e8c3e18369036ddf5c">isPWCNode</a>(baseRepNodeId))</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e">collapseNodePts</a>(baseRepNodeId))</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span> </div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <a class="code" href="classSVF_1_1AndersenBase.html#ad40b196c2c699bd115529b806d20de25">timeOfCollapse</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span> </div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span> }</div><div class="ttc" id="classSVF_1_1ConstraintGraph_html_a8ba74f82c1e796f2888ba34bc8355ce9"><div class="ttname"><a href="classSVF_1_1ConstraintGraph.html#a8ba74f82c1e796f2888ba34bc8355ce9">SVF::ConstraintGraph::isBlkObjOrConstantObj</a></div><div class="ttdeci">bool isBlkObjOrConstantObj(NodeID id)</div><div class="ttdef"><b>Definition:</b> <a href="ConsG_8h_source.html#l00309">ConsG.h:309</a></div></div>
|
|
1167
1167
|
<div class="ttc" id="classSVF_1_1WPASolver_html_a4af1c3e72f5af96c4facff672108da58"><div class="ttname"><a href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">SVF::WPASolver::pushIntoWorklist</a></div><div class="ttdeci">virtual void pushIntoWorklist(NodeID id)</div><div class="ttdef"><b>Definition:</b> <a href="WPASolver_8h_source.html#l00163">WPASolver.h:163</a></div></div>
|
|
1168
1168
|
<div class="ttc" id="namespaceSVF_html_a212231734fa43d5c7414137deaac7df3"><div class="ttname"><a href="namespaceSVF.html#a212231734fa43d5c7414137deaac7df3">SVF::NodeSet</a></div><div class="ttdeci">Set< NodeID > NodeSet</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00116">SVFBasicTypes.h:116</a></div></div>
|
|
1169
1169
|
<div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00018">MTAResultValidator.h:18</a></div></div>
|
|
@@ -912,7 +912,7 @@ Additional Inherited Members</h2></td></tr>
|
|
|
912
912
|
<p>remove redundant gepnodes in constraint graph </p>
|
|
913
913
|
|
|
914
914
|
<p class="definition">Definition at line <a class="el" href="Andersen_8cpp_source.html#l00143">143</a> of file <a class="el" href="Andersen_8cpp_source.html">Andersen.cpp</a>.</p>
|
|
915
|
-
<div class="fragment"><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  {</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a5fe3815a7990e16b99cf46e90529f8b3">resetSubs</a>(<a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#acd1f0ce7936ced59bfaf04956a0f8214">getRep</a>(<span class="keywordtype">id</span>));</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> sub: <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#ade6a90ed5e0a9e8615bafec54d9d1d73">getSubs</a>(<span class="keywordtype">id</span>))</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#aa30231dab5b7c759e4e5d76422a5eb8e">resetRep</a>(sub);</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a5fe3815a7990e16b99cf46e90529f8b3">resetSubs</a>(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#aa30231dab5b7c759e4e5d76422a5eb8e">resetRep</a>(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(!<a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a6885064afa211958af7b73f0233284e5">hasGNode</a>(<span class="keywordtype">id</span>) && <span class="stringliteral">"this
|
|
915
|
+
<div class="fragment"><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  {</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a5fe3815a7990e16b99cf46e90529f8b3">resetSubs</a>(<a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#acd1f0ce7936ced59bfaf04956a0f8214">getRep</a>(<span class="keywordtype">id</span>));</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> sub: <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#ade6a90ed5e0a9e8615bafec54d9d1d73">getSubs</a>(<span class="keywordtype">id</span>))</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#aa30231dab5b7c759e4e5d76422a5eb8e">resetRep</a>(sub);</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#a5fe3815a7990e16b99cf46e90529f8b3">resetSubs</a>(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1ConstraintGraph.html#aa30231dab5b7c759e4e5d76422a5eb8e">resetRep</a>(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(!<a class="code" href="classSVF_1_1AndersenBase.html#ae21e38a06a4397d11cdd17b0f8f282fd">consCG</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a6885064afa211958af7b73f0233284e5">hasGNode</a>(<span class="keywordtype">id</span>) && <span class="stringliteral">"this is either a rep nodeid or a sub nodeid should have already been merged to its field-insensitive base! "</span>);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> }</div><div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00018">MTAResultValidator.h:18</a></div></div>
|
|
916
916
|
<div class="ttc" id="util_8h_html_a07d17d6d5d1074c0969bc5d3c3d1d84a"><div class="ttname"><a href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a></div><div class="ttdeci">#define assert(ex)</div><div class="ttdef"><b>Definition:</b> <a href="util_8h_source.html#l00141">util.h:141</a></div></div>
|
|
917
917
|
<div class="ttc" id="classSVF_1_1ConstraintGraph_html_acd1f0ce7936ced59bfaf04956a0f8214"><div class="ttname"><a href="classSVF_1_1ConstraintGraph.html#acd1f0ce7936ced59bfaf04956a0f8214">SVF::ConstraintGraph::getRep</a></div><div class="ttdeci">NodeID getRep(NodeID node)</div><div class="ttdef"><b>Definition:</b> <a href="ConsG_8h_source.html#l00261">ConsG.h:261</a></div></div>
|
|
918
918
|
<div class="ttc" id="classSVF_1_1GenericGraph_html_a6885064afa211958af7b73f0233284e5"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a6885064afa211958af7b73f0233284e5">SVF::GenericGraph::hasGNode</a></div><div class="ttdeci">bool hasGNode(NodeID id) const</div><div class="ttdoc">Has a node. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00399">GenericGraph.h:399</a></div></div>
|
package/lib/WPA/Andersen.cpp
CHANGED
|
@@ -146,7 +146,7 @@ void AndersenBase::cleanConsCG(NodeID id) {
|
|
|
146
146
|
consCG->resetRep(sub);
|
|
147
147
|
consCG->resetSubs(id);
|
|
148
148
|
consCG->resetRep(id);
|
|
149
|
-
assert(!consCG->hasGNode(id) && "this
|
|
149
|
+
assert(!consCG->hasGNode(id) && "this is either a rep nodeid or a sub nodeid should have already been merged to its field-insensitive base! ");
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
void AndersenBase::normalizePointsTo()
|
|
@@ -570,10 +570,10 @@ bool Andersen::collapseField(NodeID nodeId)
|
|
|
570
570
|
}
|
|
571
571
|
// merge field node into base node, including edges and pts.
|
|
572
572
|
NodeID fieldRepNodeId = consCG->sccRepNode(fieldId);
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
573
|
+
mergeNodeToRep(fieldRepNodeId, baseRepNodeId);
|
|
574
|
+
if (fieldId != baseRepNodeId){
|
|
576
575
|
// gep node fieldId becomes redundant if it is merged to its base node who is set as field-insensitive
|
|
576
|
+
// two node IDs should be different otherwise this field is actually the base and should not be removed.
|
|
577
577
|
redundantGepNodes.set(fieldId);
|
|
578
578
|
}
|
|
579
579
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svf-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.294",
|
|
4
4
|
"description": "* <b>[TypeClone](https://github.com/SVF-tools/SVF/wiki/TypeClone) published in our [ECOOP paper](https://yuleisui.github.io/publications/ecoop20.pdf) is now available in SVF </b> * <b>SVF now uses a single script for its build. Just type [`source ./build.sh`](https://github.com/SVF-tools/SVF/blob/master/build.sh) in your terminal, that's it!</b> * <b>SVF now supports LLVM-10.0.0! </b> * <b>We thank [bsauce](https://github.com/bsauce) for writing a user manual of SVF ([link1](https://www.jianshu.com/p/068a08ec749c) and [link2](https://www.jianshu.com/p/777c30d4240e)) in Chinese </b> * <b>SVF now supports LLVM-9.0.0 (Thank [Byoungyoung Lee](https://github.com/SVF-tools/SVF/issues/142) for his help!). </b> * <b>SVF now supports a set of [field-sensitive pointer analyses](https://yuleisui.github.io/publications/sas2019a.pdf). </b> * <b>[Use SVF as an external lib](https://github.com/SVF-tools/SVF/wiki/Using-SVF-as-a-lib-in-your-own-tool) for your own project (Contributed by [Hongxu Chen](https://github.com/HongxuChen)). </b> * <b>SVF now supports LLVM-7.0.0. </b> * <b>SVF now supports Docker. [Try SVF in Docker](https://github.com/SVF-tools/SVF/wiki/Try-SVF-in-Docker)! </b> * <b>SVF now supports [LLVM-6.0.0](https://github.com/svf-tools/SVF/pull/38) (Contributed by [Jack Anthony](https://github.com/jackanth)). </b> * <b>SVF now supports [LLVM-4.0.0](https://github.com/svf-tools/SVF/pull/23) (Contributed by Jared Carlson. Thank [Jared](https://github.com/jcarlson23) and [Will](https://github.com/dtzWill) for their in-depth [discussions](https://github.com/svf-tools/SVF/pull/18) about updating SVF!) </b> * <b>SVF now supports analysis for C++ programs.</b> <br />",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|