svf-tools 1.0.549 → 1.0.552

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +38 -41
  2. package/SVF-doxygen/html/html/ExtAPI_8h_source.html +70 -81
  3. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +2 -4
  4. package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +9 -10
  5. package/SVF-doxygen/html/html/SVFUtil_8h_source.html +7 -7
  6. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +28 -28
  7. package/SVF-doxygen/html/html/VersionedFlowSensitive_8h_source.html +27 -27
  8. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI-members.html +24 -36
  9. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +141 -224
  10. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI_1_1Operation-members.html +8 -7
  11. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI_1_1Operation.html +81 -56
  12. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder-members.html +1 -1
  13. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +60 -76
  14. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +84 -82
  15. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive_1_1SCC.html +8 -8
  16. package/SVF-doxygen/html/html/functions_a.html +6 -9
  17. package/SVF-doxygen/html/html/functions_c.html +2 -2
  18. package/SVF-doxygen/html/html/functions_e.html +2 -35
  19. package/SVF-doxygen/html/html/functions_enum.html +0 -3
  20. package/SVF-doxygen/html/html/functions_eval_e.html +0 -30
  21. package/SVF-doxygen/html/html/functions_f.html +3 -3
  22. package/SVF-doxygen/html/html/functions_func_g.html +20 -17
  23. package/SVF-doxygen/html/html/functions_func_o.html +1 -1
  24. package/SVF-doxygen/html/html/functions_func_p.html +3 -3
  25. package/SVF-doxygen/html/html/functions_func_s.html +10 -13
  26. package/SVF-doxygen/html/html/functions_g.html +21 -18
  27. package/SVF-doxygen/html/html/functions_i.html +6 -6
  28. package/SVF-doxygen/html/html/functions_l.html +3 -3
  29. package/SVF-doxygen/html/html/functions_o.html +20 -17
  30. package/SVF-doxygen/html/html/functions_p.html +12 -14
  31. package/SVF-doxygen/html/html/functions_r.html +7 -5
  32. package/SVF-doxygen/html/html/functions_s.html +22 -23
  33. package/SVF-doxygen/html/html/functions_t.html +7 -5
  34. package/SVF-doxygen/html/html/functions_v.html +6 -6
  35. package/SVF-doxygen/html/html/functions_vars_a.html +0 -3
  36. package/SVF-doxygen/html/html/functions_vars_o.html +7 -4
  37. package/SVF-doxygen/html/html/search/all_1.js +0 -1
  38. package/SVF-doxygen/html/html/search/all_10.js +10 -10
  39. package/SVF-doxygen/html/html/search/all_11.js +2 -2
  40. package/SVF-doxygen/html/html/search/all_12.js +7 -8
  41. package/SVF-doxygen/html/html/search/all_13.js +2 -2
  42. package/SVF-doxygen/html/html/search/all_14.js +1 -1
  43. package/SVF-doxygen/html/html/search/all_15.js +3 -3
  44. package/SVF-doxygen/html/html/search/all_16.js +1 -1
  45. package/SVF-doxygen/html/html/search/all_3.js +1 -1
  46. package/SVF-doxygen/html/html/search/all_5.js +0 -11
  47. package/SVF-doxygen/html/html/search/all_6.js +1 -1
  48. package/SVF-doxygen/html/html/search/all_7.js +5 -4
  49. package/SVF-doxygen/html/html/search/all_9.js +2 -2
  50. package/SVF-doxygen/html/html/search/all_c.js +3 -3
  51. package/SVF-doxygen/html/html/search/all_e.js +4 -4
  52. package/SVF-doxygen/html/html/search/all_f.js +6 -4
  53. package/SVF-doxygen/html/html/search/enums_3.js +0 -1
  54. package/SVF-doxygen/html/html/search/enumvalues_4.js +1 -11
  55. package/SVF-doxygen/html/html/search/functions_11.js +1 -2
  56. package/SVF-doxygen/html/html/search/functions_6.js +5 -4
  57. package/SVF-doxygen/html/html/search/functions_e.js +1 -1
  58. package/SVF-doxygen/html/html/search/functions_f.js +2 -2
  59. package/SVF-doxygen/html/html/search/variables_1.js +0 -1
  60. package/SVF-doxygen/html/html/search/variables_13.js +1 -1
  61. package/SVF-doxygen/html/html/search/variables_14.js +1 -1
  62. package/SVF-doxygen/html/html/search/variables_e.js +3 -3
  63. package/SVF-doxygen/html/html/search/variables_f.js +3 -2
  64. package/include/SVF-FE/SVFIRBuilder.h +1 -1
  65. package/include/Util/ExtAPI.h +17 -42
  66. package/include/Util/ExtAPI.json +1013 -989
  67. package/lib/SVF-FE/SVFIRBuilder.cpp +122 -222
  68. package/lib/Util/ExtAPI.cpp +53 -68
  69. package/lib/WPA/VersionedFlowSensitive.cpp +41 -15
  70. package/package.json +1 -1
@@ -1204,8 +1204,8 @@ Additional Inherited Members</h2></td></tr>
1204
1204
  <p>Fills in deltaMap and deltaSourceMap for the <a class="el" href="classSVF_1_1SVFG.html">SVFG</a>. </p>
1205
1205
  <p>use pre-analysis call graph to approximate all potential callsites </p>
1206
1206
 
1207
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00441">441</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1208
- <div class="fragment"><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160;{</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a11ddfa1faebf56e74e6dcc53e16142e1">deltaMap</a>.resize(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">getTotalNodeNum</a>(), <span class="keyword">false</span>);</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160;</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="comment">// Call block nodes corresponding to all delta nodes.</span></div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const CallICFGNode *&gt;</a> deltaCBNs;</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160;</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFG.html#a225a91c04afac6a8fe198e9860890a52">SVFG::const_iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; {</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = it-&gt;first;</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *s = it-&gt;second;</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160;</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; <span class="comment">// Cases:</span></div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <span class="comment">// * Function entry: can get new incoming indirect edges through ind. callsites.</span></div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; <span class="comment">// * Callsite returns: can get new incoming indirect edges if the callsite is indirect.</span></div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; <span class="comment">// * Otherwise: static.</span></div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <span class="keywordtype">bool</span> isDelta = <span class="keyword">false</span>;</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *fn = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#ae2cff3c963136f474fac0a66aa8cff7b">isFunEntrySVFGNode</a>(s))</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; {</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <a class="code" href="classSVF_1_1PTACallGraphEdge.html#adbedb15ac0f9395c5264f087a63bad3b">PTACallGraphEdge::CallInstSet</a> callsites;</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a>-&gt;<a class="code" href="classSVF_1_1PointerAnalysis.html#a7c9b7e5fe37ae31ba84d167945ca57df">getPTACallGraph</a>()-&gt;<a class="code" href="classSVF_1_1PTACallGraph.html#a9a4b0c6672288b9201ab254b4c49548d">getIndCallSitesInvokingCallee</a>(fn, callsites);</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; isDelta = !callsites.empty();</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160;</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <span class="keywordflow">if</span> (isDelta)</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; {</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="comment">// TODO: could we use deltaCBNs in the call above, avoiding this loop?</span></div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *cbn : callsites) deltaCBNs.insert(cbn);</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; }</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; }</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *cbn = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#ad189e45b0c810e68566ccc3bdb3f2e59">isCallSiteRetSVFGNode</a>(s))</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; {</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; isDelta = cbn-&gt;isIndirectCall();</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <span class="keywordflow">if</span> (isDelta) deltaCBNs.insert(cbn);</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; }</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160;</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a11ddfa1faebf56e74e6dcc53e16142e1">deltaMap</a>[l] = isDelta;</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; }</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160;</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aee97e196225aaad29c0bd31d3ccbabf6">deltaSourceMap</a>.resize(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">getTotalNodeNum</a>(), <span class="keyword">false</span>);</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160;</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFG.html#a225a91c04afac6a8fe198e9860890a52">SVFG::const_iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; {</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = it-&gt;first;</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *s = it-&gt;second;</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160;</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *cbn = SVFUtil::dyn_cast&lt;CallICFGNode&gt;(s-&gt;<a class="code" href="classSVF_1_1VFGNode.html#a0675465e11d1d42ee7e2b7ab3c5de829">getICFGNode</a>()))</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; {</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <span class="keywordflow">if</span> (deltaCBNs.find(cbn) != deltaCBNs.end()) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aee97e196225aaad29c0bd31d3ccbabf6">deltaSourceMap</a>[l] = <span class="keyword">true</span>;</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; }</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160;</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; <span class="comment">// TODO: this is an over-approximation but it sound, marking every formal out as</span></div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; <span class="comment">// a delta-source.</span></div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;FormalOUTSVFGNode&gt;(s)) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aee97e196225aaad29c0bd31d3ccbabf6">deltaSourceMap</a>[l] = <span class="keyword">true</span>;</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; }</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160;}</div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
1207
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00467">467</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1208
+ <div class="fragment"><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160;{</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a11ddfa1faebf56e74e6dcc53e16142e1">deltaMap</a>.resize(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">getTotalNodeNum</a>(), <span class="keyword">false</span>);</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160;</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="comment">// Call block nodes corresponding to all delta nodes.</span></div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const CallICFGNode *&gt;</a> deltaCBNs;</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160;</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFG.html#a225a91c04afac6a8fe198e9860890a52">SVFG::const_iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; {</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = it-&gt;first;</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *s = it-&gt;second;</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160;</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; <span class="comment">// Cases:</span></div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="comment">// * Function entry: can get new incoming indirect edges through ind. callsites.</span></div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <span class="comment">// * Callsite returns: can get new incoming indirect edges if the callsite is indirect.</span></div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; <span class="comment">// * Otherwise: static.</span></div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="keywordtype">bool</span> isDelta = <span class="keyword">false</span>;</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *fn = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#ae2cff3c963136f474fac0a66aa8cff7b">isFunEntrySVFGNode</a>(s))</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; {</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <a class="code" href="classSVF_1_1PTACallGraphEdge.html#adbedb15ac0f9395c5264f087a63bad3b">PTACallGraphEdge::CallInstSet</a> callsites;</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a>-&gt;<a class="code" href="classSVF_1_1PointerAnalysis.html#a7c9b7e5fe37ae31ba84d167945ca57df">getPTACallGraph</a>()-&gt;<a class="code" href="classSVF_1_1PTACallGraph.html#a9a4b0c6672288b9201ab254b4c49548d">getIndCallSitesInvokingCallee</a>(fn, callsites);</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; isDelta = !callsites.empty();</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160;</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; <span class="keywordflow">if</span> (isDelta)</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; {</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; <span class="comment">// TODO: could we use deltaCBNs in the call above, avoiding this loop?</span></div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *cbn : callsites) deltaCBNs.insert(cbn);</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; }</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; }</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *cbn = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#ad189e45b0c810e68566ccc3bdb3f2e59">isCallSiteRetSVFGNode</a>(s))</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160; {</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; isDelta = cbn-&gt;isIndirectCall();</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; <span class="keywordflow">if</span> (isDelta) deltaCBNs.insert(cbn);</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; }</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160;</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a11ddfa1faebf56e74e6dcc53e16142e1">deltaMap</a>[l] = isDelta;</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; }</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160;</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aee97e196225aaad29c0bd31d3ccbabf6">deltaSourceMap</a>.resize(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">getTotalNodeNum</a>(), <span class="keyword">false</span>);</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160;</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFG.html#a225a91c04afac6a8fe198e9860890a52">SVFG::const_iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; {</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = it-&gt;first;</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *s = it-&gt;second;</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160;</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *cbn = SVFUtil::dyn_cast&lt;CallICFGNode&gt;(s-&gt;<a class="code" href="classSVF_1_1VFGNode.html#a0675465e11d1d42ee7e2b7ab3c5de829">getICFGNode</a>()))</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; {</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; <span class="keywordflow">if</span> (deltaCBNs.find(cbn) != deltaCBNs.end()) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aee97e196225aaad29c0bd31d3ccbabf6">deltaSourceMap</a>[l] = <span class="keyword">true</span>;</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; }</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160;</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="comment">// TODO: this is an over-approximation but it sound, marking every formal out as</span></div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="comment">// a delta-source.</span></div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;FormalOUTSVFGNode&gt;(s)) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aee97e196225aaad29c0bd31d3ccbabf6">deltaSourceMap</a>[l] = <span class="keyword">true</span>;</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; }</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160;}</div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
1209
1209
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a11ddfa1faebf56e74e6dcc53e16142e1"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a11ddfa1faebf56e74e6dcc53e16142e1">SVF::VersionedFlowSensitive::deltaMap</a></div><div class="ttdeci">std::vector&lt; bool &gt; deltaMap</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00214">VersionedFlowSensitive.h:214</a></div></div>
1210
1210
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_aae032e5f5d53b131d0112dc8faa464a9"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">SVF::FlowSensitive::svfg</a></div><div class="ttdeci">SVFG * svfg</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00246">FlowSensitive.h:246</a></div></div>
1211
1211
  <div class="ttc" id="classSVF_1_1GenericGraph_html_a8c8d16036008f87c7811586047599858"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">SVF::GenericGraph::getTotalNodeNum</a></div><div class="ttdeci">u32_t getTotalNodeNum() const</div><div class="ttdoc">Get total number of node/edge. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00418">GenericGraph.h:418</a></div></div>
@@ -1253,8 +1253,8 @@ Additional Inherited Members</h2></td></tr>
1253
1253
 
1254
1254
  <p>Fills in isStoreMap and isLoadMap. </p>
1255
1255
 
1256
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00418">418</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1257
- <div class="fragment"><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160;{</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a18e25c3871d7cc1a6bb0592ceca90f88">isStoreMap</a>.resize(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">getTotalNodeNum</a>(), <span class="keyword">false</span>);</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6bb3db072db0b899f306b37f1146f83d">isLoadMap</a>.resize(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">getTotalNodeNum</a>(), <span class="keyword">false</span>);</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFG.html#a225a91c04afac6a8fe198e9860890a52">SVFG::const_iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; {</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;StoreSVFGNode&gt;(it-&gt;second)) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a18e25c3871d7cc1a6bb0592ceca90f88">isStoreMap</a>[it-&gt;first] = <span class="keyword">true</span>;</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keywordflow">else</span> <a class="code" href="cJSON_8cpp.html#a90e6101bee79e6d18c535254695e91e3">if</a> (SVFUtil::isa&lt;LoadSVFGNode&gt;(it-&gt;second)) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6bb3db072db0b899f306b37f1146f83d">isLoadMap</a>[it-&gt;first] = <span class="keyword">true</span>;</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; }</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160;}</div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
1256
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00444">444</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1257
+ <div class="fragment"><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160;{</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a18e25c3871d7cc1a6bb0592ceca90f88">isStoreMap</a>.resize(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">getTotalNodeNum</a>(), <span class="keyword">false</span>);</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6bb3db072db0b899f306b37f1146f83d">isLoadMap</a>.resize(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">getTotalNodeNum</a>(), <span class="keyword">false</span>);</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFG.html#a225a91c04afac6a8fe198e9860890a52">SVFG::const_iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; {</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;StoreSVFGNode&gt;(it-&gt;second)) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a18e25c3871d7cc1a6bb0592ceca90f88">isStoreMap</a>[it-&gt;first] = <span class="keyword">true</span>;</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <span class="keywordflow">else</span> <a class="code" href="cJSON_8cpp.html#a90e6101bee79e6d18c535254695e91e3">if</a> (SVFUtil::isa&lt;LoadSVFGNode&gt;(it-&gt;second)) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6bb3db072db0b899f306b37f1146f83d">isLoadMap</a>[it-&gt;first] = <span class="keyword">true</span>;</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; }</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160;}</div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
1258
1258
  <div class="ttc" id="cJSON_8cpp_html_a90e6101bee79e6d18c535254695e91e3"><div class="ttname"><a href="cJSON_8cpp.html#a90e6101bee79e6d18c535254695e91e3">if</a></div><div class="ttdeci">if(!(object-&gt;type &amp;cJSON_String)||(object-&gt;type &amp;cJSON_IsReference))</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l00405">cJSON.cpp:405</a></div></div>
1259
1259
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_aae032e5f5d53b131d0112dc8faa464a9"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">SVF::FlowSensitive::svfg</a></div><div class="ttdeci">SVFG * svfg</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00246">FlowSensitive.h:246</a></div></div>
1260
1260
  <div class="ttc" id="classSVF_1_1GenericGraph_html_a8c8d16036008f87c7811586047599858"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">SVF::GenericGraph::getTotalNodeNum</a></div><div class="ttdeci">u32_t getTotalNodeNum() const</div><div class="ttdoc">Get total number of node/edge. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00418">GenericGraph.h:418</a></div></div>
@@ -1352,8 +1352,8 @@ Additional Inherited Members</h2></td></tr>
1352
1352
 
1353
1353
  <p>Reimplemented from <a class="el" href="classSVF_1_1FlowSensitive.html#a89d3b97b8077027514135c9201c4d02c">SVF::FlowSensitive</a>.</p>
1354
1354
 
1355
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00747">747</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1356
- <div class="fragment"><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160;{</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; std::vector&lt;std::pair&lt;unsigned, unsigned&gt;&gt; keys;</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFIR::iterator</a> pit = <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); pit != <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++pit)</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; {</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; <span class="keywordtype">unsigned</span> occ = 1;</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; <span class="keywordtype">unsigned</span> v = pit-&gt;first;</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#af34d8a738db4f40addc1de930e79654f">Options::PredictPtOcc</a> &amp;&amp; <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1SVFIR.html#a2dd4d5f704906270af13e7a07f900eb1">getObject</a>(v) != <span class="keyword">nullptr</span>) occ = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>[v].size() + 1;</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; assert(occ != 0);</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; keys.push_back(std::make_pair(v, occ));</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; }</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160;</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> nodeMapping =</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; std::make_shared&lt;std::vector&lt;NodeID&gt;&gt;(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b">NodeIDAllocator::Clusterer::cluster</a>(<a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a>, keys, <a class="code" href="classSVF_1_1FlowSensitive.html#adba7ffe68ae7edce9b3aa896f978da6b">candidateMappings</a>, <span class="stringliteral">&quot;aux-ander&quot;</span>));</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> reverseNodeMapping =</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160; std::make_shared&lt;std::vector&lt;NodeID&gt;&gt;(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f">NodeIDAllocator::Clusterer::getReverseNodeMapping</a>(*nodeMapping));</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160;</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html#a84eca4c7fc833f8ca4d119cd4da08ca8">PointsTo::setCurrentBestNodeMapping</a>(nodeMapping, reverseNodeMapping);</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160;}</div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
1355
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00773">773</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1356
+ <div class="fragment"><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160;{</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160; std::vector&lt;std::pair&lt;unsigned, unsigned&gt;&gt; keys;</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFIR::iterator</a> pit = <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); pit != <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++pit)</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160; {</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160; <span class="keywordtype">unsigned</span> occ = 1;</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; <span class="keywordtype">unsigned</span> v = pit-&gt;first;</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#af34d8a738db4f40addc1de930e79654f">Options::PredictPtOcc</a> &amp;&amp; <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1SVFIR.html#a2dd4d5f704906270af13e7a07f900eb1">getObject</a>(v) != <span class="keyword">nullptr</span>) occ = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>[v].size() + 1;</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160; assert(occ != 0);</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; keys.push_back(std::make_pair(v, occ));</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; }</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160;</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> nodeMapping =</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; std::make_shared&lt;std::vector&lt;NodeID&gt;&gt;(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b">NodeIDAllocator::Clusterer::cluster</a>(<a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a>, keys, <a class="code" href="classSVF_1_1FlowSensitive.html#adba7ffe68ae7edce9b3aa896f978da6b">candidateMappings</a>, <span class="stringliteral">&quot;aux-ander&quot;</span>));</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> reverseNodeMapping =</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160; std::make_shared&lt;std::vector&lt;NodeID&gt;&gt;(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f">NodeIDAllocator::Clusterer::getReverseNodeMapping</a>(*nodeMapping));</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160;</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html#a84eca4c7fc833f8ca4d119cd4da08ca8">PointsTo::setCurrentBestNodeMapping</a>(nodeMapping, reverseNodeMapping);</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160;}</div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
1357
1357
  <div class="ttc" id="classSVF_1_1Options_html_af34d8a738db4f40addc1de930e79654f"><div class="ttname"><a href="classSVF_1_1Options.html#af34d8a738db4f40addc1de930e79654f">SVF::Options::PredictPtOcc</a></div><div class="ttdeci">static const llvm::cl::opt&lt; bool &gt; PredictPtOcc</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00065">Options.h:65</a></div></div>
1358
1358
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af0859eb2a5b46c45aa4314e6e54f4438"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">SVF::VersionedFlowSensitive::stmtReliance</a></div><div class="ttdeci">Map&lt; NodeID, Map&lt; Version, NodeBS &gt; &gt; stmtReliance</div><div class="ttdoc">o x version -&gt; statement nodes which rely on that o/version. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00192">VersionedFlowSensitive.h:192</a></div></div>
1359
1359
  <div class="ttc" id="classSVF_1_1GenericGraph_html_a4bef15157423cef48dc7333a803cd27d"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">SVF::GenericGraph::end</a></div><div class="ttdeci">iterator end()</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00369">GenericGraph.h:369</a></div></div>
@@ -1427,8 +1427,8 @@ Additional Inherited Members</h2></td></tr>
1427
1427
  </div><div class="memdoc">
1428
1428
  <p>Returns true if l is a delta node, i.e., may get a new incoming indirect edge due to on-the-fly callgraph construction. </p>
1429
1429
 
1430
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00406">406</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1431
- <div class="fragment"><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160;{</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; assert(l &lt; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a11ddfa1faebf56e74e6dcc53e16142e1">deltaMap</a>.size() &amp;&amp; <span class="stringliteral">&quot;VFS::delta: deltaMap is missing SVFG nodes!&quot;</span>);</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a11ddfa1faebf56e74e6dcc53e16142e1">deltaMap</a>[l];</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a11ddfa1faebf56e74e6dcc53e16142e1"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a11ddfa1faebf56e74e6dcc53e16142e1">SVF::VersionedFlowSensitive::deltaMap</a></div><div class="ttdeci">std::vector&lt; bool &gt; deltaMap</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00214">VersionedFlowSensitive.h:214</a></div></div>
1430
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00432">432</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1431
+ <div class="fragment"><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160;{</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; assert(l &lt; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a11ddfa1faebf56e74e6dcc53e16142e1">deltaMap</a>.size() &amp;&amp; <span class="stringliteral">&quot;VFS::delta: deltaMap is missing SVFG nodes!&quot;</span>);</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a11ddfa1faebf56e74e6dcc53e16142e1">deltaMap</a>[l];</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a11ddfa1faebf56e74e6dcc53e16142e1"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a11ddfa1faebf56e74e6dcc53e16142e1">SVF::VersionedFlowSensitive::deltaMap</a></div><div class="ttdeci">std::vector&lt; bool &gt; deltaMap</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00214">VersionedFlowSensitive.h:214</a></div></div>
1432
1432
  </div><!-- fragment -->
1433
1433
  </div>
1434
1434
  </div>
@@ -1457,8 +1457,8 @@ Additional Inherited Members</h2></td></tr>
1457
1457
  </div><div class="memdoc">
1458
1458
  <p>Returns true if l is a delta-source node, i.e., may get a new outgoing indirect edge to a delta node due to on-the-fly callgraph construction. </p>
1459
1459
 
1460
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00412">412</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1461
- <div class="fragment"><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160;{</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; assert(l &lt; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aee97e196225aaad29c0bd31d3ccbabf6">deltaSourceMap</a>.size() &amp;&amp; <span class="stringliteral">&quot;VFS::delta: deltaSourceMap is missing SVFG nodes!&quot;</span>);</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aee97e196225aaad29c0bd31d3ccbabf6">deltaSourceMap</a>[l];</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aee97e196225aaad29c0bd31d3ccbabf6"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aee97e196225aaad29c0bd31d3ccbabf6">SVF::VersionedFlowSensitive::deltaSourceMap</a></div><div class="ttdeci">std::vector&lt; bool &gt; deltaSourceMap</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00219">VersionedFlowSensitive.h:219</a></div></div>
1460
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00438">438</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1461
+ <div class="fragment"><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160;{</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; assert(l &lt; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aee97e196225aaad29c0bd31d3ccbabf6">deltaSourceMap</a>.size() &amp;&amp; <span class="stringliteral">&quot;VFS::delta: deltaSourceMap is missing SVFG nodes!&quot;</span>);</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aee97e196225aaad29c0bd31d3ccbabf6">deltaSourceMap</a>[l];</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aee97e196225aaad29c0bd31d3ccbabf6"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aee97e196225aaad29c0bd31d3ccbabf6">SVF::VersionedFlowSensitive::deltaSourceMap</a></div><div class="ttdeci">std::vector&lt; bool &gt; deltaSourceMap</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00219">VersionedFlowSensitive.h:219</a></div></div>
1462
1462
  </div><!-- fragment -->
1463
1463
  </div>
1464
1464
  </div>
@@ -1488,8 +1488,8 @@ Additional Inherited Members</h2></td></tr>
1488
1488
 
1489
1489
  <p>Dumps maps consume and yield. </p>
1490
1490
 
1491
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00874">874</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1492
- <div class="fragment"><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160;{</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;# LocVersion Maps\n&quot;</span>;</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFG.html#a241d0489bf0315460e2b07db87e7847c">SVFG::iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; {</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> loc = it-&gt;first;</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <span class="keywordtype">bool</span> locPrinted = <span class="keyword">false</span>;</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aa689d29ead80303b1ef1e1a91f31c296">LocVersionMap</a> *lvm :</div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; {</div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; &amp;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>, &amp;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">yield</a></div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; })</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; {</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; <span class="keywordflow">if</span> (lvm-&gt;at(loc).empty()) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; <span class="keywordflow">if</span> (!locPrinted)</div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; {</div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; <span class="stringliteral">&quot;SVFG node &quot;</span> &lt;&lt; loc &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160; locPrinted = <span class="keyword">true</span>;</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; }</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160;</div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; (lvm == &amp;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a> ? <span class="stringliteral">&quot;Consume &quot;</span> : <span class="stringliteral">&quot;Yield &quot;</span>) &lt;&lt; <span class="stringliteral">&quot;: &quot;</span>;</div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160;</div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ObjToVersionMap::value_type &amp;ov : lvm-&gt;at(loc))</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; {</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ov.first;</div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = ov.second;</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; (first ? <span class="stringliteral">&quot;&quot;</span> : <span class="stringliteral">&quot;, &quot;</span>) &lt;&lt; <span class="stringliteral">&quot;&lt;&quot;</span> &lt;&lt; o &lt;&lt; <span class="stringliteral">&quot;, &quot;</span> &lt;&lt; v &lt;&lt; <span class="stringliteral">&quot;&gt;&quot;</span>;</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160; first = <span class="keyword">false</span>;</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160; }</div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160;</div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; }</div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160; }</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160;</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160;}</div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
1491
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00900">900</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1492
+ <div class="fragment"><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>&#160;{</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;# LocVersion Maps\n&quot;</span>;</div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFG.html#a241d0489bf0315460e2b07db87e7847c">SVFG::iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span>&#160; {</div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> loc = it-&gt;first;</div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160; <span class="keywordtype">bool</span> locPrinted = <span class="keyword">false</span>;</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aa689d29ead80303b1ef1e1a91f31c296">LocVersionMap</a> *lvm :</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; {</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; &amp;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>, &amp;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">yield</a></div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span>&#160; })</div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160; {</div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; <span class="keywordflow">if</span> (lvm-&gt;at(loc).empty()) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; <span class="keywordflow">if</span> (!locPrinted)</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; {</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; <span class="stringliteral">&quot;SVFG node &quot;</span> &lt;&lt; loc &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; locPrinted = <span class="keyword">true</span>;</div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; }</div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160;</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; (lvm == &amp;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a> ? <span class="stringliteral">&quot;Consume &quot;</span> : <span class="stringliteral">&quot;Yield &quot;</span>) &lt;&lt; <span class="stringliteral">&quot;: &quot;</span>;</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160;</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ObjToVersionMap::value_type &amp;ov : lvm-&gt;at(loc))</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; {</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ov.first;</div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = ov.second;</div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; (first ? <span class="stringliteral">&quot;&quot;</span> : <span class="stringliteral">&quot;, &quot;</span>) &lt;&lt; <span class="stringliteral">&quot;&lt;&quot;</span> &lt;&lt; o &lt;&lt; <span class="stringliteral">&quot;, &quot;</span> &lt;&lt; v &lt;&lt; <span class="stringliteral">&quot;&gt;&quot;</span>;</div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; first = <span class="keyword">false</span>;</div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160; }</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160;</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; }</div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; }</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160;</div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160;}</div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
1493
1493
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_aae032e5f5d53b131d0112dc8faa464a9"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">SVF::FlowSensitive::svfg</a></div><div class="ttdeci">SVFG * svfg</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00246">FlowSensitive.h:246</a></div></div>
1494
1494
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aa689d29ead80303b1ef1e1a91f31c296"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aa689d29ead80303b1ef1e1a91f31c296">SVF::VersionedFlowSensitive::LocVersionMap</a></div><div class="ttdeci">std::vector&lt; ObjToVersionMap &gt; LocVersionMap</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00039">VersionedFlowSensitive.h:39</a></div></div>
1495
1495
  <div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00019">MTAResultValidator.h:19</a></div></div>
@@ -1528,8 +1528,8 @@ Additional Inherited Members</h2></td></tr>
1528
1528
 
1529
1529
  <p>Dumps a MeldVersion to stdout. </p>
1530
1530
 
1531
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00910">910</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1532
- <div class="fragment"><div class="line"><a name="l00911"></a><span class="lineno"> 911</span>&#160;{</div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;[ &quot;</span>;</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> e : v)</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; {</div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span>&#160; <span class="keywordflow">if</span> (!first)</div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>&#160; {</div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; }</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160;</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; e;</div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; first = <span class="keyword">false</span>;</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; }</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160;</div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; ]&quot;</span>;</div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160;}</div><div class="ttc" id="namespaceSVF_1_1SVFUtil_html_aed0b0b9f035057552a6a82154fd88e61"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVF::SVFUtil::outs</a></div><div class="ttdeci">std::ostream &amp; outs()</div><div class="ttdoc">Overwrite llvm::outs() </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00049">SVFUtil.h:49</a></div></div>
1531
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00936">936</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1532
+ <div class="fragment"><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160;{</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;[ &quot;</span>;</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> e : v)</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; {</div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160; <span class="keywordflow">if</span> (!first)</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; {</div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; }</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160;</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; e;</div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; first = <span class="keyword">false</span>;</div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; }</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160;</div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; ]&quot;</span>;</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160;}</div><div class="ttc" id="namespaceSVF_1_1SVFUtil_html_aed0b0b9f035057552a6a82154fd88e61"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVF::SVFUtil::outs</a></div><div class="ttdeci">std::ostream &amp; outs()</div><div class="ttdoc">Overwrite llvm::outs() </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00049">SVFUtil.h:49</a></div></div>
1533
1533
  </div><!-- fragment -->
1534
1534
  </div>
1535
1535
  </div>
@@ -1559,8 +1559,8 @@ Additional Inherited Members</h2></td></tr>
1559
1559
 
1560
1560
  <p>Dumps versionReliance and stmtReliance. </p>
1561
1561
 
1562
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00817">817</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1563
- <div class="fragment"><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160;{</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;# Version reliances\n&quot;</span>;</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a>&lt;<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a>&lt;<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a>, std::vector&lt;Version&gt;&gt;&gt;::value_type &amp;ovrv : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>)</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; {</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ovrv.first;</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; Object &quot;</span> &lt;&lt; o &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a>&lt;<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a>, std::vector&lt;Version&gt;&gt;::value_type&amp; vrv : ovrv.second)</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; {</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = vrv.first;</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; Version &quot;</span> &lt;&lt; v &lt;&lt; <span class="stringliteral">&quot; is a reliance for: &quot;</span>;</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160;</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> rv : vrv.second)</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; {</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; <span class="keywordflow">if</span> (!first)</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; {</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; }</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160;</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; rv;</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160; first = <span class="keyword">false</span>;</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; }</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160;</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; }</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; }</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160;</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;# Statement reliances\n&quot;</span>;</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a>&lt;<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;Version, NodeBS&gt;</a>&gt;::value_type &amp;ovss : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>)</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; {</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ovss.first;</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; Object &quot;</span> &lt;&lt; o &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160;</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;Version, NodeBS&gt;::value_type</a> &amp;vss : ovss.second)</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; {</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = vss.first;</div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; Version &quot;</span> &lt;&lt; v &lt;&lt; <span class="stringliteral">&quot; is a reliance for statements: &quot;</span>;</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160;</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &amp;ss = vss.second;</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : ss)</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; {</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; <span class="keywordflow">if</span> (!first)</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; {</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; }</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160;</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; s;</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; first = <span class="keyword">false</span>;</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; }</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160;</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; }</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; }</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160;}</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#l00019">MTAResultValidator.h:19</a></div></div>
1562
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00843">843</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1563
+ <div class="fragment"><div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160;{</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;# Version reliances\n&quot;</span>;</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a>&lt;<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a>&lt;<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a>, std::vector&lt;Version&gt;&gt;&gt;::value_type &amp;ovrv : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>)</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; {</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ovrv.first;</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; Object &quot;</span> &lt;&lt; o &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a>&lt;<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a>, std::vector&lt;Version&gt;&gt;::value_type&amp; vrv : ovrv.second)</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160; {</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = vrv.first;</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; Version &quot;</span> &lt;&lt; v &lt;&lt; <span class="stringliteral">&quot; is a reliance for: &quot;</span>;</div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160;</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> rv : vrv.second)</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; {</div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; <span class="keywordflow">if</span> (!first)</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; {</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160; }</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160;</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; rv;</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; first = <span class="keyword">false</span>;</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; }</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160;</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; }</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160; }</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160;</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;# Statement reliances\n&quot;</span>;</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a>&lt;<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;Version, NodeBS&gt;</a>&gt;::value_type &amp;ovss : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>)</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; {</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ovss.first;</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; Object &quot;</span> &lt;&lt; o &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160;</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;Version, NodeBS&gt;::value_type</a> &amp;vss : ovss.second)</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; {</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = vss.first;</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot; Version &quot;</span> &lt;&lt; v &lt;&lt; <span class="stringliteral">&quot; is a reliance for statements: &quot;</span>;</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160;</div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &amp;ss = vss.second;</div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : ss)</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160; {</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>&#160; <span class="keywordflow">if</span> (!first)</div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>&#160; {</div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>&#160; }</div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>&#160;</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; s;</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>&#160; first = <span class="keyword">false</span>;</div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>&#160; }</div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>&#160;</div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>&#160; }</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>&#160; }</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>&#160;}</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#l00019">MTAResultValidator.h:19</a></div></div>
1564
1564
  <div class="ttc" id="namespaceSVF_html_a8234d4b959abc9123993bcff4eee34c1"><div class="ttname"><a href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">SVF::Map</a></div><div class="ttdeci">std::unordered_map&lt; Key, Value, Hash, KeyEqual, Allocator &gt; Map</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00110">SVFBasicTypes.h:110</a></div></div>
1565
1565
  <div class="ttc" id="namespaceSVF_html_a9ec7a8dc63411ee3724a25a59191be0c"><div class="ttname"><a href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">SVF::Version</a></div><div class="ttdeci">unsigned Version</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00133">SVFBasicTypes.h:133</a></div></div>
1566
1566
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af0859eb2a5b46c45aa4314e6e54f4438"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">SVF::VersionedFlowSensitive::stmtReliance</a></div><div class="ttdeci">Map&lt; NodeID, Map&lt; Version, NodeBS &gt; &gt; stmtReliance</div><div class="ttdoc">o x version -&gt; statement nodes which rely on that o/version. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00192">VersionedFlowSensitive.h:192</a></div></div>
@@ -1638,9 +1638,9 @@ Additional Inherited Members</h2></td></tr>
1638
1638
 
1639
1639
  <p>Returns the consumed version of o at l. If no such version exists, returns invalidVersion. </p>
1640
1640
 
1641
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00777">777</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1642
- <div class="fragment"><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160;{</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6b398d59fc276980dd2d6d48a8675068">getVersion</a>(l, o, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>);</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a2e4e6a84cbfd553ad9cca8fdf9fd4a8d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">SVF::VersionedFlowSensitive::consume</a></div><div class="ttdeci">LocVersionMap consume</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00185">VersionedFlowSensitive.h:185</a></div></div>
1643
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a6b398d59fc276980dd2d6d48a8675068"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a6b398d59fc276980dd2d6d48a8675068">SVF::VersionedFlowSensitive::getVersion</a></div><div class="ttdeci">Version getVersion(const NodeID l, const NodeID o, const LocVersionMap &amp;lvm) const</div><div class="ttdoc">Shared code for getConsume and getYield. They wrap this function. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00767">VersionedFlowSensitive.cpp:767</a></div></div>
1641
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00803">803</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1642
+ <div class="fragment"><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160;{</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6b398d59fc276980dd2d6d48a8675068">getVersion</a>(l, o, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>);</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a2e4e6a84cbfd553ad9cca8fdf9fd4a8d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">SVF::VersionedFlowSensitive::consume</a></div><div class="ttdeci">LocVersionMap consume</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00185">VersionedFlowSensitive.h:185</a></div></div>
1643
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a6b398d59fc276980dd2d6d48a8675068"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a6b398d59fc276980dd2d6d48a8675068">SVF::VersionedFlowSensitive::getVersion</a></div><div class="ttdeci">Version getVersion(const NodeID l, const NodeID o, const LocVersionMap &amp;lvm) const</div><div class="ttdoc">Shared code for getConsume and getYield. They wrap this function. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00793">VersionedFlowSensitive.cpp:793</a></div></div>
1644
1644
  </div><!-- fragment -->
1645
1645
  </div>
1646
1646
  </div>
@@ -1680,8 +1680,8 @@ Additional Inherited Members</h2></td></tr>
1680
1680
 
1681
1681
  <p>Returns the versions of o which rely on o:v. </p>
1682
1682
 
1683
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00807">807</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1684
- <div class="fragment"><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160;{</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>[o][v];</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a1dc6e3d4931b53e7e426c0f76d06aeb3"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">SVF::VersionedFlowSensitive::versionReliance</a></div><div class="ttdeci">VersionRelianceMap versionReliance</div><div class="ttdoc">o -&gt; (version -&gt; versions which rely on it). </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00190">VersionedFlowSensitive.h:190</a></div></div>
1683
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00833">833</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1684
+ <div class="fragment"><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160;{</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>[o][v];</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a1dc6e3d4931b53e7e426c0f76d06aeb3"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">SVF::VersionedFlowSensitive::versionReliance</a></div><div class="ttdeci">VersionRelianceMap versionReliance</div><div class="ttdoc">o -&gt; (version -&gt; versions which rely on it). </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00190">VersionedFlowSensitive.h:190</a></div></div>
1685
1685
  </div><!-- fragment -->
1686
1686
  </div>
1687
1687
  </div>
@@ -1721,8 +1721,8 @@ Additional Inherited Members</h2></td></tr>
1721
1721
 
1722
1722
  <p>Returns the statements which rely on o:v. </p>
1723
1723
 
1724
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00812">812</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1725
- <div class="fragment"><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160;{</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>[o][v];</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af0859eb2a5b46c45aa4314e6e54f4438"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">SVF::VersionedFlowSensitive::stmtReliance</a></div><div class="ttdeci">Map&lt; NodeID, Map&lt; Version, NodeBS &gt; &gt; stmtReliance</div><div class="ttdoc">o x version -&gt; statement nodes which rely on that o/version. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00192">VersionedFlowSensitive.h:192</a></div></div>
1724
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00838">838</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1725
+ <div class="fragment"><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160;{</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>[o][v];</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af0859eb2a5b46c45aa4314e6e54f4438"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">SVF::VersionedFlowSensitive::stmtReliance</a></div><div class="ttdeci">Map&lt; NodeID, Map&lt; Version, NodeBS &gt; &gt; stmtReliance</div><div class="ttdoc">o x version -&gt; statement nodes which rely on that o/version. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00192">VersionedFlowSensitive.h:192</a></div></div>
1726
1726
  </div><!-- fragment -->
1727
1727
  </div>
1728
1728
  </div>
@@ -1768,8 +1768,8 @@ Additional Inherited Members</h2></td></tr>
1768
1768
 
1769
1769
  <p>Shared code for getConsume and getYield. They wrap this function. </p>
1770
1770
 
1771
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00767">767</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1772
- <div class="fragment"><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160;{</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, NodeID&gt;::const_iterator</a> canonObjectIt = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2d451d89f99a4bff828b682723df477f">equivalentObject</a>.find(o);</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> op = canonObjectIt == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2d451d89f99a4bff828b682723df477f">equivalentObject</a>.end() ? o : canonObjectIt-&gt;second;</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160;</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af9a43f48b7d99cc6694f3ae3248fd8e0">ObjToVersionMap</a> &amp;ovm = lvm[l];</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; <span class="keyword">const</span> ObjToVersionMap::const_iterator foundVersion = ovm.find(op);</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160; <span class="keywordflow">return</span> foundVersion == ovm.end() ? <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> : foundVersion-&gt;second;</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160;}</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#l00019">MTAResultValidator.h:19</a></div></div>
1771
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00793">793</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1772
+ <div class="fragment"><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160;{</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, NodeID&gt;::const_iterator</a> canonObjectIt = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2d451d89f99a4bff828b682723df477f">equivalentObject</a>.find(o);</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> op = canonObjectIt == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2d451d89f99a4bff828b682723df477f">equivalentObject</a>.end() ? o : canonObjectIt-&gt;second;</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160;</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af9a43f48b7d99cc6694f3ae3248fd8e0">ObjToVersionMap</a> &amp;ovm = lvm[l];</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; <span class="keyword">const</span> ObjToVersionMap::const_iterator foundVersion = ovm.find(op);</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; <span class="keywordflow">return</span> foundVersion == ovm.end() ? <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> : foundVersion-&gt;second;</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160;}</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#l00019">MTAResultValidator.h:19</a></div></div>
1773
1773
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a2d451d89f99a4bff828b682723df477f"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a2d451d89f99a4bff828b682723df477f">SVF::VersionedFlowSensitive::equivalentObject</a></div><div class="ttdeci">Map&lt; NodeID, NodeID &gt; equivalentObject</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00201">VersionedFlowSensitive.h:201</a></div></div>
1774
1774
  <div class="ttc" id="namespaceSVF_html_a8234d4b959abc9123993bcff4eee34c1"><div class="ttname"><a href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">SVF::Map</a></div><div class="ttdeci">std::unordered_map&lt; Key, Value, Hash, KeyEqual, Allocator &gt; Map</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00110">SVFBasicTypes.h:110</a></div></div>
1775
1775
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af9a43f48b7d99cc6694f3ae3248fd8e0"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af9a43f48b7d99cc6694f3ae3248fd8e0">SVF::VersionedFlowSensitive::ObjToVersionMap</a></div><div class="ttdeci">Map&lt; NodeID, Version &gt; ObjToVersionMap</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00036">VersionedFlowSensitive.h:36</a></div></div>
@@ -1813,10 +1813,10 @@ Additional Inherited Members</h2></td></tr>
1813
1813
 
1814
1814
  <p>Returns the yielded version of o at l. If no such version exists, returns invalidVersion. </p>
1815
1815
 
1816
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00782">782</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1817
- <div class="fragment"><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160;{</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; <span class="comment">// Non-store: consume == yield.</span></div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(l)) <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6b398d59fc276980dd2d6d48a8675068">getVersion</a>(l, o, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">yield</a>);</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6b398d59fc276980dd2d6d48a8675068">getVersion</a>(l, o, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>);</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aac920c9a5f13dd147e3c130425e005eb"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">SVF::VersionedFlowSensitive::isStore</a></div><div class="ttdeci">virtual bool isStore(const NodeID l) const</div><div class="ttdoc">Returns true if l is a store node. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00429">VersionedFlowSensitive.cpp:429</a></div></div>
1816
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00808">808</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1817
+ <div class="fragment"><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160;{</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160; <span class="comment">// Non-store: consume == yield.</span></div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(l)) <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6b398d59fc276980dd2d6d48a8675068">getVersion</a>(l, o, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">yield</a>);</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6b398d59fc276980dd2d6d48a8675068">getVersion</a>(l, o, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>);</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aac920c9a5f13dd147e3c130425e005eb"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">SVF::VersionedFlowSensitive::isStore</a></div><div class="ttdeci">virtual bool isStore(const NodeID l) const</div><div class="ttdoc">Returns true if l is a store node. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00455">VersionedFlowSensitive.cpp:455</a></div></div>
1818
1818
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a2e4e6a84cbfd553ad9cca8fdf9fd4a8d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">SVF::VersionedFlowSensitive::consume</a></div><div class="ttdeci">LocVersionMap consume</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00185">VersionedFlowSensitive.h:185</a></div></div>
1819
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a6b398d59fc276980dd2d6d48a8675068"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a6b398d59fc276980dd2d6d48a8675068">SVF::VersionedFlowSensitive::getVersion</a></div><div class="ttdeci">Version getVersion(const NodeID l, const NodeID o, const LocVersionMap &amp;lvm) const</div><div class="ttdoc">Shared code for getConsume and getYield. They wrap this function. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00767">VersionedFlowSensitive.cpp:767</a></div></div>
1819
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a6b398d59fc276980dd2d6d48a8675068"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a6b398d59fc276980dd2d6d48a8675068">SVF::VersionedFlowSensitive::getVersion</a></div><div class="ttdeci">Version getVersion(const NodeID l, const NodeID o, const LocVersionMap &amp;lvm) const</div><div class="ttdoc">Shared code for getConsume and getYield. They wrap this function. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00793">VersionedFlowSensitive.cpp:793</a></div></div>
1820
1820
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a16224ee60494bb1fdf1c8a1026fbe7ab"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">SVF::VersionedFlowSensitive::yield</a></div><div class="ttdeci">LocVersionMap yield</div><div class="ttdoc">Actual yield map. Yield analogue to consume. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00187">VersionedFlowSensitive.h:187</a></div></div>
1821
1821
  </div><!-- fragment -->
1822
1822
  </div>
@@ -1850,19 +1850,19 @@ Additional Inherited Members</h2></td></tr>
1850
1850
 
1851
1851
  <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00045">45</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1852
1852
  <div class="fragment"><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;{</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <a class="code" href="classSVF_1_1FlowSensitive.html#ad6243c1317503bed39411dab47c83da7">FlowSensitive::initialize</a>();</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; <span class="comment">// Overwrite the stat FlowSensitive::initialize gave us.</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keyword">delete</span> <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>;</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a> = <span class="keyword">new</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aaee58f266762146e9fdc08ecfc326b29">VersionedFlowSensitiveStat</a>(<span class="keyword">this</span>);</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a> = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a4859864a4c72d5e04c10305e4579e8ee">getVersionedPTDataTy</a>();</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a8da4b9bd9d0c640a6857b4dc4991817c">buildIsStoreLoadMaps</a>();</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3407cc82ef9806e26b79edb677979014">buildDeltaMaps</a>();</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>.resize(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">getTotalNodeNum</a>());</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">yield</a>.resize(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">getTotalNodeNum</a>());</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7d86bc18060c0114a783aa1c3a7e9dda">prelabel</a>();</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aaff594c78d93f7ad632d344e5c1c7f6a">meldLabel</a>();</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a275095f60640d862034ad173af3371c3">removeAllIndirectSVFGEdges</a>();</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aaff594c78d93f7ad632d344e5c1c7f6a"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aaff594c78d93f7ad632d344e5c1c7f6a">SVF::VersionedFlowSensitive::meldLabel</a></div><div class="ttdeci">void meldLabel(void)</div><div class="ttdoc">Meld label the prelabeled SVFG. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00120">VersionedFlowSensitive.cpp:120</a></div></div>
1853
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a8da4b9bd9d0c640a6857b4dc4991817c"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a8da4b9bd9d0c640a6857b4dc4991817c">SVF::VersionedFlowSensitive::buildIsStoreLoadMaps</a></div><div class="ttdeci">virtual void buildIsStoreLoadMaps(void)</div><div class="ttdoc">Fills in isStoreMap and isLoadMap. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00418">VersionedFlowSensitive.cpp:418</a></div></div>
1853
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a8da4b9bd9d0c640a6857b4dc4991817c"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a8da4b9bd9d0c640a6857b4dc4991817c">SVF::VersionedFlowSensitive::buildIsStoreLoadMaps</a></div><div class="ttdeci">virtual void buildIsStoreLoadMaps(void)</div><div class="ttdoc">Fills in isStoreMap and isLoadMap. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00444">VersionedFlowSensitive.cpp:444</a></div></div>
1854
1854
  <div class="ttc" id="classSVF_1_1BVDataPTAImpl_html_a4859864a4c72d5e04c10305e4579e8ee"><div class="ttname"><a href="classSVF_1_1BVDataPTAImpl.html#a4859864a4c72d5e04c10305e4579e8ee">SVF::BVDataPTAImpl::getVersionedPTDataTy</a></div><div class="ttdeci">VersionedPTDataTy * getVersionedPTDataTy() const</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysisImpl_8h_source.html#l00199">PointerAnalysisImpl.h:199</a></div></div>
1855
1855
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_aae032e5f5d53b131d0112dc8faa464a9"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">SVF::FlowSensitive::svfg</a></div><div class="ttdeci">SVFG * svfg</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00246">FlowSensitive.h:246</a></div></div>
1856
1856
  <div class="ttc" id="classSVF_1_1GenericGraph_html_a8c8d16036008f87c7811586047599858"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">SVF::GenericGraph::getTotalNodeNum</a></div><div class="ttdeci">u32_t getTotalNodeNum() const</div><div class="ttdoc">Get total number of node/edge. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00418">GenericGraph.h:418</a></div></div>
1857
1857
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a03f5f16377daa0258166a73de3e21f07"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">SVF::VersionedFlowSensitive::vPtD</a></div><div class="ttdeci">BVDataPTAImpl::VersionedPTDataTy * vPtD</div><div class="ttdoc">Points-to DS for working with versions. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00210">VersionedFlowSensitive.h:210</a></div></div>
1858
1858
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_ad6243c1317503bed39411dab47c83da7"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#ad6243c1317503bed39411dab47c83da7">SVF::FlowSensitive::initialize</a></div><div class="ttdeci">virtual void initialize()</div><div class="ttdoc">Initialize analysis. </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8cpp_source.html#l00046">FlowSensitive.cpp:46</a></div></div>
1859
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3407cc82ef9806e26b79edb677979014"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3407cc82ef9806e26b79edb677979014">SVF::VersionedFlowSensitive::buildDeltaMaps</a></div><div class="ttdeci">virtual void buildDeltaMaps(void)</div><div class="ttdoc">Fills in deltaMap and deltaSourceMap for the SVFG. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00441">VersionedFlowSensitive.cpp:441</a></div></div>
1859
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3407cc82ef9806e26b79edb677979014"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3407cc82ef9806e26b79edb677979014">SVF::VersionedFlowSensitive::buildDeltaMaps</a></div><div class="ttdeci">virtual void buildDeltaMaps(void)</div><div class="ttdoc">Fills in deltaMap and deltaSourceMap for the SVFG. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00467">VersionedFlowSensitive.cpp:467</a></div></div>
1860
1860
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a2e4e6a84cbfd553ad9cca8fdf9fd4a8d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">SVF::VersionedFlowSensitive::consume</a></div><div class="ttdeci">LocVersionMap consume</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00185">VersionedFlowSensitive.h:185</a></div></div>
1861
1861
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a7d86bc18060c0114a783aa1c3a7e9dda"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a7d86bc18060c0114a783aa1c3a7e9dda">SVF::VersionedFlowSensitive::prelabel</a></div><div class="ttdeci">void prelabel(void)</div><div class="ttdoc">Prelabel the SVFG: set y(o) for stores and c(o) for delta nodes to a new version. ...</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00073">VersionedFlowSensitive.cpp:73</a></div></div>
1862
1862
  <div class="ttc" id="classSVF_1_1PointerAnalysis_html_a5ec3d9bf1fc81346c9df29638daedc0f"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">SVF::PointerAnalysis::stat</a></div><div class="ttdeci">PTAStat * stat</div><div class="ttdoc">Statistics. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00150">PointerAnalysis.h:150</a></div></div>
1863
1863
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aaee58f266762146e9fdc08ecfc326b29"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aaee58f266762146e9fdc08ecfc326b29">SVF::VersionedFlowSensitive::VersionedFlowSensitiveStat</a></div><div class="ttdeci">friend class VersionedFlowSensitiveStat</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00030">VersionedFlowSensitive.h:30</a></div></div>
1864
1864
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a16224ee60494bb1fdf1c8a1026fbe7ab"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">SVF::VersionedFlowSensitive::yield</a></div><div class="ttdeci">LocVersionMap yield</div><div class="ttdoc">Actual yield map. Yield analogue to consume. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00187">VersionedFlowSensitive.h:187</a></div></div>
1865
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a275095f60640d862034ad173af3371c3"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a275095f60640d862034ad173af3371c3">SVF::VersionedFlowSensitive::removeAllIndirectSVFGEdges</a></div><div class="ttdeci">void removeAllIndirectSVFGEdges(void)</div><div class="ttdoc">Removes all indirect edges in the SVFG. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00498">VersionedFlowSensitive.cpp:498</a></div></div>
1865
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a275095f60640d862034ad173af3371c3"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a275095f60640d862034ad173af3371c3">SVF::VersionedFlowSensitive::removeAllIndirectSVFGEdges</a></div><div class="ttdeci">void removeAllIndirectSVFGEdges(void)</div><div class="ttdoc">Removes all indirect edges in the SVFG. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00524">VersionedFlowSensitive.cpp:524</a></div></div>
1866
1866
  </div><!-- fragment -->
1867
1867
  </div>
1868
1868
  </div>
@@ -1892,8 +1892,8 @@ Additional Inherited Members</h2></td></tr>
1892
1892
 
1893
1893
  <p>Returns true if l is a load node. </p>
1894
1894
 
1895
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00435">435</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1896
- <div class="fragment"><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160;{</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; assert(l &lt; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6bb3db072db0b899f306b37f1146f83d">isLoadMap</a>.size() &amp;&amp; <span class="stringliteral">&quot;VFS::isLoad: isLoadMap is missing SVFG nodes!&quot;</span>);</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6bb3db072db0b899f306b37f1146f83d">isLoadMap</a>[l];</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a6bb3db072db0b899f306b37f1146f83d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a6bb3db072db0b899f306b37f1146f83d">SVF::VersionedFlowSensitive::isLoadMap</a></div><div class="ttdeci">std::vector&lt; bool &gt; isLoadMap</div><div class="ttdoc">isLoadMap[l] means SVFG node l is a load node. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00225">VersionedFlowSensitive.h:225</a></div></div>
1895
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00461">461</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1896
+ <div class="fragment"><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160;{</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; assert(l &lt; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6bb3db072db0b899f306b37f1146f83d">isLoadMap</a>.size() &amp;&amp; <span class="stringliteral">&quot;VFS::isLoad: isLoadMap is missing SVFG nodes!&quot;</span>);</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6bb3db072db0b899f306b37f1146f83d">isLoadMap</a>[l];</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a6bb3db072db0b899f306b37f1146f83d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a6bb3db072db0b899f306b37f1146f83d">SVF::VersionedFlowSensitive::isLoadMap</a></div><div class="ttdeci">std::vector&lt; bool &gt; isLoadMap</div><div class="ttdoc">isLoadMap[l] means SVFG node l is a load node. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00225">VersionedFlowSensitive.h:225</a></div></div>
1897
1897
  </div><!-- fragment -->
1898
1898
  </div>
1899
1899
  </div>
@@ -1923,8 +1923,8 @@ Additional Inherited Members</h2></td></tr>
1923
1923
 
1924
1924
  <p>Returns true if l is a store node. </p>
1925
1925
 
1926
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00429">429</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1927
- <div class="fragment"><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160;{</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; assert(l &lt; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a18e25c3871d7cc1a6bb0592ceca90f88">isStoreMap</a>.size() &amp;&amp; <span class="stringliteral">&quot;VFS::isStore: isStoreMap is missing SVFG nodes!&quot;</span>);</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a18e25c3871d7cc1a6bb0592ceca90f88">isStoreMap</a>[l];</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a18e25c3871d7cc1a6bb0592ceca90f88"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a18e25c3871d7cc1a6bb0592ceca90f88">SVF::VersionedFlowSensitive::isStoreMap</a></div><div class="ttdeci">std::vector&lt; bool &gt; isStoreMap</div><div class="ttdoc">isStoreMap[l] means SVFG node l is a store node. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00222">VersionedFlowSensitive.h:222</a></div></div>
1926
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00455">455</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1927
+ <div class="fragment"><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160;{</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; assert(l &lt; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a18e25c3871d7cc1a6bb0592ceca90f88">isStoreMap</a>.size() &amp;&amp; <span class="stringliteral">&quot;VFS::isStore: isStoreMap is missing SVFG nodes!&quot;</span>);</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a18e25c3871d7cc1a6bb0592ceca90f88">isStoreMap</a>[l];</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a18e25c3871d7cc1a6bb0592ceca90f88"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a18e25c3871d7cc1a6bb0592ceca90f88">SVF::VersionedFlowSensitive::isStoreMap</a></div><div class="ttdeci">std::vector&lt; bool &gt; isStoreMap</div><div class="ttdoc">isStoreMap[l] means SVFG node l is a store node. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00222">VersionedFlowSensitive.h:222</a></div></div>
1928
1928
  </div><!-- fragment -->
1929
1929
  </div>
1930
1930
  </div>
@@ -1964,8 +1964,8 @@ Additional Inherited Members</h2></td></tr>
1964
1964
 
1965
1965
  <p>Melds v2 into v1 (in place), returns whether a change occurred. </p>
1966
1966
 
1967
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00400">400</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1968
- <div class="fragment"><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160;{</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="comment">// Meld operator is union of bit vectors.</span></div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; <span class="keywordflow">return</span> mv1 |= mv2;</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160;}</div></div><!-- fragment -->
1967
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00426">426</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1968
+ <div class="fragment"><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160;{</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="comment">// Meld operator is union of bit vectors.</span></div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <span class="keywordflow">return</span> mv1 |= mv2;</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160;}</div></div><!-- fragment -->
1969
1969
  </div>
1970
1970
  </div>
1971
1971
  <a id="aaff594c78d93f7ad632d344e5c1c7f6a"></a>
@@ -1995,7 +1995,7 @@ Additional Inherited Members</h2></td></tr>
1995
1995
  <p>Meld label the prelabeled <a class="el" href="classSVF_1_1SVFG.html">SVFG</a>. </p>
1996
1996
 
1997
1997
  <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00120">120</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
1998
- <div class="fragment"><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;{</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; assert(<a class="code" href="classSVF_1_1Options.html#adba18ce8f1496fe2e57a934f11c2dfd9">Options::VersioningThreads</a> &gt; 0 &amp;&amp; <span class="stringliteral">&quot;VFS::meldLabel: number of versioning threads must be &gt; 0!&quot;</span>);</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="comment">// Nodes which have at least one object on them given a prelabel.</span></div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; std::vector&lt;const SVFGNode *&gt; prelabeledNodes;</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="comment">// Fast query for the above.</span></div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; std::vector&lt;bool&gt; isPrelabeled(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">getTotalNodeNum</a>(), <span class="keyword">false</span>);</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keywordflow">while</span> (!<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">empty</a>())</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; {</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a> = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">pop</a>();</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; prelabeledNodes.push_back(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(n));</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; isPrelabeled[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>] = <span class="keyword">true</span>;</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; }</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160;</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="comment">// Delta, delta source, store, and load nodes, which require versions during</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; <span class="comment">// solving, unlike other nodes with which we can make do with the reliance map.</span></div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; std::vector&lt;NodeID&gt; nodesWhichNeedVersions;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFG.html#a225a91c04afac6a8fe198e9860890a52">SVFG::const_iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; {</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n = it-&gt;first;</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a9f9b00551c157f42d1d995e8c4efb54b">delta</a>(n) || <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3fa5afa4f54e0828ec090fde07b1bfa2">deltaSource</a>(n) || <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(n) || <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a984a4f929a18f97bfefac0102088a7fd">isLoad</a>(n)) nodesWhichNeedVersions.push_back(n);</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; }</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; std::mutex *versionMutexes = <span class="keyword">new</span> std::mutex[nodesWhichNeedVersions.size()];</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="comment">// Map of footprints to the canonical object &quot;owning&quot; the footprint.</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::vector&lt;const IndirectSVFGEdge *&gt;</a>, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>&gt; footprintOwner;</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; std::queue&lt;NodeID&gt; objectQueue;</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aaae8c6858593ed050dcf2c9220228e3e">prelabeledObjects</a>)</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="comment">// &quot;Touch&quot; maps with o so we don&#39;t need to lock on them.</span></div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>[o];</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>[o];</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; objectQueue.push(o);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; }</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; std::mutex objectQueueMutex;</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; std::mutex footprintOwnerMutex;</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keyword">auto</span> meldVersionWorker = [<span class="keyword">this</span>, &amp;footprintOwner, &amp;objectQueue,</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; &amp;objectQueueMutex, &amp;footprintOwnerMutex, &amp;versionMutexes,</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; &amp;prelabeledNodes, &amp;isPrelabeled, &amp;nodesWhichNeedVersions]</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; (<span class="keyword">const</span> <span class="keywordtype">unsigned</span> thread)</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; {</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keywordflow">while</span> (<span class="keyword">true</span>)</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; {</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o;</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; std::lock_guard&lt;std::mutex&gt; guard(objectQueueMutex);</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="comment">// No more objects? Done.</span></div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keywordflow">if</span> (objectQueue.empty()) <span class="keywordflow">return</span>;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; o = objectQueue.front();</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; objectQueue.pop();</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; }</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="comment">// 1. Compute the SCCs for the nodes on the graph overlay of o.</span></div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="comment">// For starting nodes, we only need those which did prelabeling for o specifically.</span></div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="comment">// TODO: maybe we should move this to prelabel with a map (o -&gt; starting nodes).</span></div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; std::vector&lt;const SVFGNode *&gt; osStartingNodes;</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *sn : prelabeledNodes)</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; {</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StoreVFGNode.html">StoreSVFGNode</a> *store = SVFUtil::dyn_cast&lt;StoreSVFGNode&gt;(sn))</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; {</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <a class="code" href="cJSON_8cpp.html#a009ef1d888ab6dbe77e6b42b0b39f1ae">p</a> = store-&gt;getPAGDstNodeID();</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordflow">if</span> (this-&gt;<a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a>-&gt;<a class="code" href="classSVF_1_1Andersen.html#a187285a5bdf9422d9188b2b11b667639">getPts</a>(p).<a class="code" href="classSVF_1_1PointsTo.html#af61271fefa574c39f405fdfee59a8b3f">test</a>(o)) osStartingNodes.push_back(sn);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; }</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a9f9b00551c157f42d1d995e8c4efb54b">delta</a>(sn-&gt;getId()))</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; {</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1MRSVFGNode.html">MRSVFGNode</a> *mr = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1MRSVFGNode.html">MRSVFGNode</a>&gt;(sn);</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keywordflow">if</span> (mr != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; {</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordflow">if</span> (mr-&gt;<a class="code" href="classSVF_1_1MRSVFGNode.html#a28fe266d0e4618aa4448aa218495a332">getPointsTo</a>().<a class="code" href="classSVF_1_1SparseBitVector.html#a112f2ede1240c95f9fe810f2882fab80">test</a>(o)) osStartingNodes.push_back(sn);</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; }</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; }</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; }</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; std::vector&lt;int&gt; partOf;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; std::vector&lt;const IndirectSVFGEdge *&gt; footprint;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordtype">unsigned</span> numSCCs = <a class="code" href="classSVF_1_1VersionedFlowSensitive_1_1SCC.html#ad52f6f586168ca4ceaf85cca8dfab825">SCC::detectSCCs</a>(<span class="keyword">this</span>, this-&gt;<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>, o, osStartingNodes, partOf, footprint);</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="comment">// 2. Skip any further processing of a footprint we have seen before.</span></div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; {</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; std::lock_guard&lt;std::mutex&gt; guard(footprintOwnerMutex);</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::vector&lt;const IndirectSVFGEdge *&gt;</a>, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>&gt;::const_iterator canonOwner</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; = footprintOwner.find(footprint);</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="keywordflow">if</span> (canonOwner == footprintOwner.end())</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; {</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2d451d89f99a4bff828b682723df477f">equivalentObject</a>[o] = o;</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; footprintOwner[footprint] = o;</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; }</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; {</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2d451d89f99a4bff828b682723df477f">equivalentObject</a>[o] = canonOwner-&gt;second;</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="comment">// Same version and stmt reliance as the canonical. During solving we cannot just reuse</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="comment">// the canonical object&#39;s reliance because it may change due to on-the-fly call graph</span></div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="comment">// construction. Something like copy-on-write could be good... probably negligible.</span></div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>.at(o) = this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>.at(canonOwner-&gt;second);</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>.at(o) = this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>.at(canonOwner-&gt;second);</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; }</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; }</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160;</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="comment">// 3. a. Initialise the MeldVersion of prelabeled nodes (SCCs).</span></div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <span class="comment">// b. Initialise a todo list of all the nodes we need to version,</span></div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="comment">// sorted according to topological order.</span></div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="comment">// We will use a map of sccs to meld versions for what is consumed.</span></div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; std::vector&lt;MeldVersion&gt; sccToMeldVersion(numSCCs);</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="comment">// At stores, what is consumed is different to what is yielded, so we</span></div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="comment">// maintain that separately.</span></div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, MeldVersion&gt;</a> storesYieldedMeldVersion;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="comment">// SVFG nodes of interest -- those part of an SCC from the starting nodes.</span></div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; std::vector&lt;NodeID&gt; todoList;</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="keywordtype">unsigned</span> bit = 0;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n = 0; n &lt; partOf.size(); ++<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>)</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; {</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <span class="keywordflow">if</span> (partOf[n] == -1) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160;</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="keywordflow">if</span> (isPrelabeled[n])</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; {</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordflow">if</span> (this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(n)) storesYieldedMeldVersion[n].<span class="keyword">set</span>(bit);</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="keywordflow">else</span> sccToMeldVersion[partOf[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>]].set(bit);</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; ++bit;</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; }</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160;</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; todoList.push_back(n);</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; }</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160;</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="comment">// Sort topologically so each nodes is only visited once.</span></div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="keyword">auto</span> cmp = [&amp;partOf](<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <a class="code" href="cJSON_8cpp.html#a8a1a0a26c50cc4becfc754bb68d1dc6b">a</a>, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>)</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; {</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="keywordflow">return</span> partOf[<a class="code" href="cJSON_8cpp.html#a8a1a0a26c50cc4becfc754bb68d1dc6b">a</a>] &gt; partOf[<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>];</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; };</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; std::sort(todoList.begin(), todoList.end(), cmp);</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160;</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="comment">// 4. a. Do meld versioning.</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="comment">// b. Determine SCC reliances.</span></div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <span class="comment">// c. Build a footprint for o (all edges which it is found on).</span></div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <span class="comment">// d. Determine which SCCs belong to stores.</span></div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160;</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="comment">// sccReliance[x] = { y_1, y_2, ... } if there exists an edge from a node</span></div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <span class="comment">// in SCC x to SCC y_i.</span></div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; std::vector&lt;Set&lt;int&gt;&gt; sccReliance(numSCCs);</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="comment">// Maps SCC to the store it corresponds to or -1 if it doesn&#39;t. TODO: unsigned vs signed -- nasty.</span></div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; std::vector&lt;int&gt; storeSCC(numSCCs, -1);</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; todoList.size(); ++i)</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; {</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n = todoList[i];</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *sn = this-&gt;<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(n);</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> nIsStore = this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(n);</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160;</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="keywordtype">int</span> nSCC = partOf[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>];</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="keywordflow">if</span> (nIsStore) storeSCC[nSCC] = <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>;</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="comment">// Given n -&gt; m, the yielded version of n will be melded into m.</span></div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="comment">// For stores, that is in storesYieldedMeldVersion, otherwise, consume == yield and</span></div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <span class="comment">// we can just use sccToMeldVersion.</span></div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a630eeca9c3344d24fa196f7de45bce18">MeldVersion</a> &amp;nMV = nIsStore ? storesYieldedMeldVersion[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>] : sccToMeldVersion[nSCC];</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : sn-&gt;<a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>())</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; {</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a> *ie = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>&gt;(e);</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="keywordflow">if</span> (!ie) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160;</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> m = ie-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()-&gt;getId();</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <span class="comment">// Ignoreedges which don&#39;t involve o.</span></div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keywordflow">if</span> (!ie-&gt;<a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>().<a class="code" href="classSVF_1_1SparseBitVector.html#a112f2ede1240c95f9fe810f2882fab80">test</a>(o)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160;</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <span class="keywordtype">int</span> mSCC = partOf[m];</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160;</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="comment">// There is an edge from the SCC n belongs to to that m belongs to.</span></div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; sccReliance[nSCC].insert(mSCC);</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; <span class="comment">// Ignore edges to delta nodes (prelabeled consume).</span></div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="comment">// No point propagating when n&#39;s SCC == m&#39;s SCC (same meld version there)</span></div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; <span class="comment">// except when it is a store, because we are actually propagating n&#39;s yielded</span></div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="comment">// into m&#39;s consumed. Store nodes are in their own SCCs, so it is a self</span></div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; <span class="comment">// loop on a store node.</span></div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <span class="keywordflow">if</span> (!this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a9f9b00551c157f42d1d995e8c4efb54b">delta</a>(m) &amp;&amp; (nSCC != mSCC || nIsStore))</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; {</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; sccToMeldVersion[mSCC] |= nMV;</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; }</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; }</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; }</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <span class="comment">// 5. Transform meld versions belonging to SCCs into versions.</span></div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;MeldVersion, Version&gt;</a> mvv;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; std::vector&lt;Version&gt; sccToVersion(numSCCs, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>);</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> curVersion = 0;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a> = 0; <a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a> &lt; sccToMeldVersion.size(); ++<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>)</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; {</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a630eeca9c3344d24fa196f7de45bce18">MeldVersion</a> &amp;mv = sccToMeldVersion[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>];</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;MeldVersion, Version&gt;::const_iterator</a> foundVersion = mvv.find(mv);</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = foundVersion == mvv.<a class="code" href="classSVF_1_1CoreBitVector.html#a93cdd9890522cc9fee2451567e0b1f0d">end</a>() ? mvv[mv] = ++curVersion : foundVersion-&gt;second;</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; sccToVersion[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>] = v;</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; }</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160;</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; sccToMeldVersion.clear();</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160;</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="comment">// Same for storesYieldedMeldVersion.</span></div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, Version&gt;</a> storesYieldedVersion;</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; nmv : storesYieldedMeldVersion)</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; {</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n = nmv.first;</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a630eeca9c3344d24fa196f7de45bce18">MeldVersion</a> &amp;mv = nmv.second;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160;</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;MeldVersion, Version&gt;::const_iterator</a> foundVersion = mvv.find(mv);</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = foundVersion == mvv.<a class="code" href="classSVF_1_1CoreBitVector.html#a93cdd9890522cc9fee2451567e0b1f0d">end</a>() ? mvv[mv] = ++curVersion : foundVersion-&gt;second;</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; storesYieldedVersion[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>] = v;</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; }</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; storesYieldedMeldVersion.clear();</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160;</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; mvv.clear();</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160;</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <span class="comment">// 6. From SCC reliance, determine version reliances.</span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;Version, std::vector&lt;Version&gt;</a>&gt; &amp;osVersionReliance = this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>.at(o);</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a> = 0; <a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a> &lt; numSCCs; ++<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>)</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; {</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <span class="keywordflow">if</span> (sccReliance[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>].empty()) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160;</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="comment">// Some consume relies on a yield. When it&#39;s a store, we need to pick whether to</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="comment">// use the consume or yield unlike when it is not because they are the same.</span></div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> version</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; = storeSCC[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>] != -1 ? storesYieldedVersion[storeSCC[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>]] : sccToVersion[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>];</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160;</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; std::vector&lt;Version&gt; &amp;reliantVersions = osVersionReliance[version];</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> reliantSCC : sccReliance[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>])</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; {</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> reliantVersion = sccToVersion[reliantSCC];</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">if</span> (version != reliantVersion)</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; {</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <span class="comment">// sccReliance is a set, no need to worry about duplicates.</span></div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; reliantVersions.push_back(reliantVersion);</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; }</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; }</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; }</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160;</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <span class="comment">// 7. a. Save versions for nodes which need them.</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="comment">// b. Fill in stmtReliance.</span></div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="comment">// TODO: maybe randomise iteration order for less contention? Needs profiling.</span></div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;Version, NodeBS&gt;</a> &amp;osStmtReliance = this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>.at(o);</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; nodesWhichNeedVersions.size(); ++i)</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; {</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n = nodesWhichNeedVersions[i];</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; std::mutex &amp;mutex = versionMutexes[i];</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160;</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> scc = partOf[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>];</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="keywordflow">if</span> (scc == -1) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160;</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; std::lock_guard&lt;std::mutex&gt; guard(mutex);</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = sccToVersion[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>];</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="keywordflow">if</span> (c != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>)</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; {</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aabc0a5a7a31b8d880e019773ba960741">setConsume</a>(n, o, c);</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; <span class="keywordflow">if</span> (this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(n) || this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a984a4f929a18f97bfefac0102088a7fd">isLoad</a>(n)) osStmtReliance[c].set(n);</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; }</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160;</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="keywordflow">if</span> (this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(n))</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; {</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, Version&gt;::const_iterator</a> yIt = storesYieldedVersion.find(n);</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; <span class="keywordflow">if</span> (yIt != storesYieldedVersion.end()) this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806">setYield</a>(n, o, yIt-&gt;second);</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; }</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; }</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; }</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; };</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160;</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; std::vector&lt;std::thread&gt; workers;</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; <a class="code" href="classSVF_1_1Options.html#adba18ce8f1496fe2e57a934f11c2dfd9">Options::VersioningThreads</a>; ++i) workers.push_back(std::thread(meldVersionWorker, i));</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; <span class="keywordflow">for</span> (std::thread &amp;worker : workers) worker.join();</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160;</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="keyword">delete</span>[] versionMutexes;</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a4a594c8d6ccaa27b5328c6388fdb258d">meldLabelingTime</a> = (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160;}</div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
1998
+ <div class="fragment"><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;{</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; assert(<a class="code" href="classSVF_1_1Options.html#adba18ce8f1496fe2e57a934f11c2dfd9">Options::VersioningThreads</a> &gt; 0 &amp;&amp; <span class="stringliteral">&quot;VFS::meldLabel: number of versioning threads must be &gt; 0!&quot;</span>);</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160;</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="comment">// Nodes which have at least one object on them given a prelabel + the Andersen&#39;s points-to</span></div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="comment">// set of interest so we don&#39;t keep calling getPts. For Store nodes, we&#39;ll fill that in, for</span></div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="comment">// MR nodes, we won&#39;t as its getPointsTo is cheap.</span></div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="comment">// TODO: preferably we cache both for ease and to avoid the dyn_cast/isa, but Andersen&#39;s points-to</span></div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="comment">// sets are PointsTo and MR&#39;s sets are NodeBS, which are incompatible types. Maybe when we can</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <span class="comment">// use std::option.</span></div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; std::vector&lt;std::pair&lt;const SVFGNode *, const PointsTo *&gt;&gt; prelabeledNodes;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="comment">// Fast query for the above.</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; std::vector&lt;bool&gt; isPrelabeled(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a8c8d16036008f87c7811586047599858">getTotalNodeNum</a>(), <span class="keyword">false</span>);</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordflow">while</span> (!<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">empty</a>())</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; {</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a> = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">pop</a>();</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; isPrelabeled[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>] = <span class="keyword">true</span>;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *sn = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(n);</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> *nPts = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StoreVFGNode.html">StoreSVFGNode</a> *store = SVFUtil::dyn_cast&lt;StoreSVFGNode&gt;(sn))</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; {</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <a class="code" href="cJSON_8cpp.html#a009ef1d888ab6dbe77e6b42b0b39f1ae">p</a> = store-&gt;getPAGDstNodeID();</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; nPts = &amp;(this-&gt;<a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a>-&gt;<a class="code" href="classSVF_1_1Andersen.html#a187285a5bdf9422d9188b2b11b667639">getPts</a>(p));</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; }</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; prelabeledNodes.push_back(std::make_pair(sn, nPts));</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; }</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="comment">// Delta, delta source, store, and load nodes, which require versions during</span></div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="comment">// solving, unlike other nodes with which we can make do with the reliance map.</span></div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; std::vector&lt;NodeID&gt; nodesWhichNeedVersions;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFG.html#a225a91c04afac6a8fe198e9860890a52">SVFG::const_iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; {</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n = it-&gt;first;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a9f9b00551c157f42d1d995e8c4efb54b">delta</a>(n) || <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3fa5afa4f54e0828ec090fde07b1bfa2">deltaSource</a>(n) || <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(n) || <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a984a4f929a18f97bfefac0102088a7fd">isLoad</a>(n)) nodesWhichNeedVersions.push_back(n);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; }</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; std::mutex *versionMutexes = <span class="keyword">new</span> std::mutex[nodesWhichNeedVersions.size()];</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160;</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="comment">// Map of footprints to the canonical object &quot;owning&quot; the footprint.</span></div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::vector&lt;const IndirectSVFGEdge *&gt;</a>, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>&gt; footprintOwner;</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; std::queue&lt;NodeID&gt; objectQueue;</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aaae8c6858593ed050dcf2c9220228e3e">prelabeledObjects</a>)</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; {</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="comment">// &quot;Touch&quot; maps with o so we don&#39;t need to lock on them.</span></div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>[o];</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>[o];</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; objectQueue.push(o);</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; }</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; std::mutex objectQueueMutex;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; std::mutex footprintOwnerMutex;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keyword">auto</span> meldVersionWorker = [<span class="keyword">this</span>, &amp;footprintOwner, &amp;objectQueue,</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; &amp;objectQueueMutex, &amp;footprintOwnerMutex, &amp;versionMutexes,</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; &amp;prelabeledNodes, &amp;isPrelabeled, &amp;nodesWhichNeedVersions]</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; (<span class="keyword">const</span> <span class="keywordtype">unsigned</span> thread)</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; {</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">while</span> (<span class="keyword">true</span>)</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; {</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o;</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; {</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; std::lock_guard&lt;std::mutex&gt; guard(objectQueueMutex);</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="comment">// No more objects? Done.</span></div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordflow">if</span> (objectQueue.empty()) <span class="keywordflow">return</span>;</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; o = objectQueue.front();</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; objectQueue.pop();</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; }</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="comment">// 1. Compute the SCCs for the nodes on the graph overlay of o.</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="comment">// For starting nodes, we only need those which did prelabeling for o specifically.</span></div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="comment">// TODO: maybe we should move this to prelabel with a map (o -&gt; starting nodes).</span></div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; std::vector&lt;const SVFGNode *&gt; osStartingNodes;</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keywordflow">for</span> (std::pair&lt;const SVFGNode *, const PointsTo *&gt; snPts : prelabeledNodes)</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; {</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *sn = snPts.first;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> *pts = snPts.second;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="keywordflow">if</span> (pts != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; {</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordflow">if</span> (pts-&gt;<a class="code" href="classSVF_1_1PointsTo.html#af61271fefa574c39f405fdfee59a8b3f">test</a>(o)) osStartingNodes.push_back(sn);</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; }</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1MRSVFGNode.html">MRSVFGNode</a> *mr = SVFUtil::dyn_cast&lt;MRSVFGNode&gt;(sn))</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; {</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="keywordflow">if</span> (mr-&gt;getPointsTo().test(o)) osStartingNodes.push_back(sn);</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; }</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; {</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;VFS::meldLabel: unexpected prelabeled node!&quot;</span>);</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; }</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; }</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160;</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; std::vector&lt;int&gt; partOf;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; std::vector&lt;const IndirectSVFGEdge *&gt; footprint;</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="keywordtype">unsigned</span> numSCCs = <a class="code" href="classSVF_1_1VersionedFlowSensitive_1_1SCC.html#ad52f6f586168ca4ceaf85cca8dfab825">SCC::detectSCCs</a>(<span class="keyword">this</span>, this-&gt;<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>, o, osStartingNodes, partOf, footprint);</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="comment">// 2. Skip any further processing of a footprint we have seen before.</span></div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; {</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; std::lock_guard&lt;std::mutex&gt; guard(footprintOwnerMutex);</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::vector&lt;const IndirectSVFGEdge *&gt;</a>, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>&gt;::const_iterator canonOwner</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; = footprintOwner.find(footprint);</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">if</span> (canonOwner == footprintOwner.end())</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2d451d89f99a4bff828b682723df477f">equivalentObject</a>[o] = o;</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; footprintOwner[footprint] = o;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; }</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; {</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2d451d89f99a4bff828b682723df477f">equivalentObject</a>[o] = canonOwner-&gt;second;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="comment">// Same version and stmt reliance as the canonical. During solving we cannot just reuse</span></div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="comment">// the canonical object&#39;s reliance because it may change due to on-the-fly call graph</span></div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="comment">// construction. Something like copy-on-write could be good... probably negligible.</span></div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>.at(o) = this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>.at(canonOwner-&gt;second);</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>.at(o) = this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>.at(canonOwner-&gt;second);</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; }</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; }</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160;</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="comment">// 3. a. Initialise the MeldVersion of prelabeled nodes (SCCs).</span></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="comment">// b. Initialise a todo list of all the nodes we need to version,</span></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="comment">// sorted according to topological order.</span></div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="comment">// We will use a map of sccs to meld versions for what is consumed.</span></div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; std::vector&lt;MeldVersion&gt; sccToMeldVersion(numSCCs);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; <span class="comment">// At stores, what is consumed is different to what is yielded, so we</span></div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <span class="comment">// maintain that separately.</span></div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, MeldVersion&gt;</a> storesYieldedMeldVersion;</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; <span class="comment">// SVFG nodes of interest -- those part of an SCC from the starting nodes.</span></div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; std::vector&lt;NodeID&gt; todoList;</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keywordtype">unsigned</span> bit = 0;</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="comment">// To calculate reachable nodes, we can see what nodes n exist where</span></div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="comment">// partOf[n] != -1. Since the SVFG can be large this can be expensive.</span></div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; <span class="comment">// Instead, we can gather this from the edges in the footprint and</span></div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="comment">// the starting nodes (incase such nodes have no edges).</span></div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <span class="comment">// TODO: should be able to do this better: too many redundant inserts.</span></div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;NodeID&gt;</a> reachableNodes;</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *sn : osStartingNodes) reachableNodes.insert(sn-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *se : footprint)</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; {</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; reachableNodes.insert(se-&gt;getSrcNode()-&gt;getId());</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; reachableNodes.insert(se-&gt;getDstNode()-&gt;getId());</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; }</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160;</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n : reachableNodes)</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; {</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keywordflow">if</span> (isPrelabeled[n])</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; {</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keywordflow">if</span> (this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(n)) storesYieldedMeldVersion[n].<span class="keyword">set</span>(bit);</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="keywordflow">else</span> sccToMeldVersion[partOf[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>]].set(bit);</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; ++bit;</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; }</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160;</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; todoList.push_back(n);</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; }</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="comment">// Sort topologically so each nodes is only visited once.</span></div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; <span class="keyword">auto</span> cmp = [&amp;partOf](<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <a class="code" href="cJSON_8cpp.html#a8a1a0a26c50cc4becfc754bb68d1dc6b">a</a>, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>)</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; {</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keywordflow">return</span> partOf[<a class="code" href="cJSON_8cpp.html#a8a1a0a26c50cc4becfc754bb68d1dc6b">a</a>] &gt; partOf[<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>];</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; };</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; std::sort(todoList.begin(), todoList.end(), cmp);</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160;</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <span class="comment">// 4. a. Do meld versioning.</span></div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="comment">// b. Determine SCC reliances.</span></div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <span class="comment">// c. Build a footprint for o (all edges which it is found on).</span></div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <span class="comment">// d. Determine which SCCs belong to stores.</span></div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160;</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="comment">// sccReliance[x] = { y_1, y_2, ... } if there exists an edge from a node</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; <span class="comment">// in SCC x to SCC y_i.</span></div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; std::vector&lt;Set&lt;int&gt;&gt; sccReliance(numSCCs);</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <span class="comment">// Maps SCC to the store it corresponds to or -1 if it doesn&#39;t. TODO: unsigned vs signed -- nasty.</span></div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; std::vector&lt;int&gt; storeSCC(numSCCs, -1);</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; todoList.size(); ++i)</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; {</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n = todoList[i];</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *sn = this-&gt;<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(n);</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keyword">const</span> <span class="keywordtype">bool</span> nIsStore = this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(n);</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160;</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <span class="keywordtype">int</span> nSCC = partOf[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>];</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; <span class="keywordflow">if</span> (nIsStore) storeSCC[nSCC] = <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>;</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160;</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <span class="comment">// Given n -&gt; m, the yielded version of n will be melded into m.</span></div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="comment">// For stores, that is in storesYieldedMeldVersion, otherwise, consume == yield and</span></div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="comment">// we can just use sccToMeldVersion.</span></div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a630eeca9c3344d24fa196f7de45bce18">MeldVersion</a> &amp;nMV = nIsStore ? storesYieldedMeldVersion[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>] : sccToMeldVersion[nSCC];</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : sn-&gt;<a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>())</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; {</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a> *ie = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>&gt;(e);</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160; <span class="keywordflow">if</span> (!ie) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160;</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> m = ie-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()-&gt;getId();</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="comment">// Ignoreedges which don&#39;t involve o.</span></div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keywordflow">if</span> (!ie-&gt;<a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>().<a class="code" href="classSVF_1_1SparseBitVector.html#a112f2ede1240c95f9fe810f2882fab80">test</a>(o)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160;</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keywordtype">int</span> mSCC = partOf[m];</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160;</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <span class="comment">// There is an edge from the SCC n belongs to to that m belongs to.</span></div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; sccReliance[nSCC].insert(mSCC);</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160;</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; <span class="comment">// Ignore edges to delta nodes (prelabeled consume).</span></div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="comment">// No point propagating when n&#39;s SCC == m&#39;s SCC (same meld version there)</span></div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="comment">// except when it is a store, because we are actually propagating n&#39;s yielded</span></div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="comment">// into m&#39;s consumed. Store nodes are in their own SCCs, so it is a self</span></div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="comment">// loop on a store node.</span></div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; <span class="keywordflow">if</span> (!this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a9f9b00551c157f42d1d995e8c4efb54b">delta</a>(m) &amp;&amp; (nSCC != mSCC || nIsStore))</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; {</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; sccToMeldVersion[mSCC] |= nMV;</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; }</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; }</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; }</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <span class="comment">// 5. Transform meld versions belonging to SCCs into versions.</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;MeldVersion, Version&gt;</a> mvv;</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; std::vector&lt;Version&gt; sccToVersion(numSCCs, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>);</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> curVersion = 0;</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a> = 0; <a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a> &lt; sccToMeldVersion.size(); ++<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>)</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; {</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a630eeca9c3344d24fa196f7de45bce18">MeldVersion</a> &amp;mv = sccToMeldVersion[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>];</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;MeldVersion, Version&gt;::const_iterator</a> foundVersion = mvv.find(mv);</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = foundVersion == mvv.<a class="code" href="classSVF_1_1CoreBitVector.html#a93cdd9890522cc9fee2451567e0b1f0d">end</a>() ? mvv[mv] = ++curVersion : foundVersion-&gt;second;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; sccToVersion[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>] = v;</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; }</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160;</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; sccToMeldVersion.clear();</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160;</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <span class="comment">// Same for storesYieldedMeldVersion.</span></div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, Version&gt;</a> storesYieldedVersion;</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; nmv : storesYieldedMeldVersion)</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; {</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n = nmv.first;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a630eeca9c3344d24fa196f7de45bce18">MeldVersion</a> &amp;mv = nmv.second;</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160;</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;MeldVersion, Version&gt;::const_iterator</a> foundVersion = mvv.find(mv);</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = foundVersion == mvv.<a class="code" href="classSVF_1_1CoreBitVector.html#a93cdd9890522cc9fee2451567e0b1f0d">end</a>() ? mvv[mv] = ++curVersion : foundVersion-&gt;second;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; storesYieldedVersion[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>] = v;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; }</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160;</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; storesYieldedMeldVersion.clear();</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160;</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; mvv.clear();</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160;</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="comment">// 6. From SCC reliance, determine version reliances.</span></div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;Version, std::vector&lt;Version&gt;</a>&gt; &amp;osVersionReliance = this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>.at(o);</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a> = 0; <a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a> &lt; numSCCs; ++<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>)</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; {</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="keywordflow">if</span> (sccReliance[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>].empty()) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160;</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="comment">// Some consume relies on a yield. When it&#39;s a store, we need to pick whether to</span></div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="comment">// use the consume or yield unlike when it is not because they are the same.</span></div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> version</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; = storeSCC[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>] != -1 ? storesYieldedVersion[storeSCC[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>]] : sccToVersion[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>];</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; std::vector&lt;Version&gt; &amp;reliantVersions = osVersionReliance[version];</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> reliantSCC : sccReliance[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>])</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; {</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> reliantVersion = sccToVersion[reliantSCC];</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; <span class="keywordflow">if</span> (version != reliantVersion)</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; {</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; <span class="comment">// sccReliance is a set, no need to worry about duplicates.</span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; reliantVersions.push_back(reliantVersion);</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; }</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; }</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; }</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160;</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <span class="comment">// 7. a. Save versions for nodes which need them.</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="comment">// b. Fill in stmtReliance.</span></div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <span class="comment">// TODO: maybe randomise iteration order for less contention? Needs profiling.</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;Version, NodeBS&gt;</a> &amp;osStmtReliance = this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>.at(o);</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; nodesWhichNeedVersions.size(); ++i)</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; {</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n = nodesWhichNeedVersions[i];</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; std::mutex &amp;mutex = versionMutexes[i];</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="keyword">const</span> <span class="keywordtype">int</span> scc = partOf[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>];</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keywordflow">if</span> (scc == -1) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160;</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; std::lock_guard&lt;std::mutex&gt; guard(mutex);</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160;</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = sccToVersion[<a class="code" href="classSVF_1_1WPASolver.html#a21709a0f33b6238afe735cc9fe49ff70">scc</a>];</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <span class="keywordflow">if</span> (c != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>)</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; {</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aabc0a5a7a31b8d880e019773ba960741">setConsume</a>(n, o, c);</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="keywordflow">if</span> (this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(n) || this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a984a4f929a18f97bfefac0102088a7fd">isLoad</a>(n)) osStmtReliance[c].set(n);</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; }</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160;</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keywordflow">if</span> (this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(n))</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; {</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;NodeID, Version&gt;::const_iterator</a> yIt = storesYieldedVersion.find(n);</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <span class="keywordflow">if</span> (yIt != storesYieldedVersion.end()) this-&gt;<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806">setYield</a>(n, o, yIt-&gt;second);</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; }</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; }</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; }</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; };</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160;</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; std::vector&lt;std::thread&gt; workers;</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i &lt; <a class="code" href="classSVF_1_1Options.html#adba18ce8f1496fe2e57a934f11c2dfd9">Options::VersioningThreads</a>; ++i) workers.push_back(std::thread(meldVersionWorker, i));</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <span class="keywordflow">for</span> (std::thread &amp;worker : workers) worker.join();</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160;</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keyword">delete</span>[] versionMutexes;</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160;</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a4a594c8d6ccaa27b5328c6388fdb258d">meldLabelingTime</a> = (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160;}</div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
1999
1999
  <div class="ttc" id="cJSON_8cpp_html_a009ef1d888ab6dbe77e6b42b0b39f1ae"><div class="ttname"><a href="cJSON_8cpp.html#a009ef1d888ab6dbe77e6b42b0b39f1ae">p</a></div><div class="ttdeci">cJSON * p</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02559">cJSON.cpp:2559</a></div></div>
2000
2000
  <div class="ttc" id="classSVF_1_1StoreVFGNode_html"><div class="ttname"><a href="classSVF_1_1StoreVFGNode.html">SVF::StoreVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00240">VFGNode.h:240</a></div></div>
2001
2001
  <div class="ttc" id="classSVF_1_1Andersen_html_a187285a5bdf9422d9188b2b11b667639"><div class="ttname"><a href="classSVF_1_1Andersen.html#a187285a5bdf9422d9188b2b11b667639">SVF::Andersen::getPts</a></div><div class="ttdeci">virtual const PointsTo &amp; getPts(NodeID id)</div><div class="ttdoc">Operation of points-to set. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00208">Andersen.h:208</a></div></div>
@@ -2007,12 +2007,12 @@ Additional Inherited Members</h2></td></tr>
2007
2007
  <div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00019">MTAResultValidator.h:19</a></div></div>
2008
2008
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a2d451d89f99a4bff828b682723df477f"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a2d451d89f99a4bff828b682723df477f">SVF::VersionedFlowSensitive::equivalentObject</a></div><div class="ttdeci">Map&lt; NodeID, NodeID &gt; equivalentObject</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00201">VersionedFlowSensitive.h:201</a></div></div>
2009
2009
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a4a594c8d6ccaa27b5328c6388fdb258d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a4a594c8d6ccaa27b5328c6388fdb258d">SVF::VersionedFlowSensitive::meldLabelingTime</a></div><div class="ttdeci">double meldLabelingTime</div><div class="ttdoc">Time to meld label SVFG. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00233">VersionedFlowSensitive.h:233</a></div></div>
2010
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ac33c7cef2d1d143950820ea48e97e806"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806">SVF::VersionedFlowSensitive::setYield</a></div><div class="ttdeci">void setYield(const NodeID l, const NodeID o, const Version v)</div><div class="ttdoc">Sets the yielded version of o at l to v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00800">VersionedFlowSensitive.cpp:800</a></div></div>
2010
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ac33c7cef2d1d143950820ea48e97e806"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806">SVF::VersionedFlowSensitive::setYield</a></div><div class="ttdeci">void setYield(const NodeID l, const NodeID o, const Version v)</div><div class="ttdoc">Sets the yielded version of o at l to v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00826">VersionedFlowSensitive.cpp:826</a></div></div>
2011
2011
  <div class="ttc" id="classSVF_1_1FIFOWorkList_html_a7056704c224dfb4b57287fe90c004aa8"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">SVF::FIFOWorkList::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00146">WorkList.h:146</a></div></div>
2012
2012
  <div class="ttc" id="classSVF_1_1SparseBitVector_html_a112f2ede1240c95f9fe810f2882fab80"><div class="ttname"><a href="classSVF_1_1SparseBitVector.html#a112f2ede1240c95f9fe810f2882fab80">SVF::SparseBitVector::test</a></div><div class="ttdeci">bool test(unsigned Idx) const</div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l00706">SparseBitVector.h:706</a></div></div>
2013
2013
  <div class="ttc" id="classSVF_1_1SVFG_html_a7ace06b6c893b31f7dec2abe54e33e11"><div class="ttname"><a href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">SVF::SVFG::getSVFGNode</a></div><div class="ttdeci">SVFGNode * getSVFGNode(NodeID id) const</div><div class="ttdoc">Get a SVFG node. </div><div class="ttdef"><b>Definition:</b> <a href="SVFG_8h_source.html#l00150">SVFG.h:150</a></div></div>
2014
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aac920c9a5f13dd147e3c130425e005eb"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">SVF::VersionedFlowSensitive::isStore</a></div><div class="ttdeci">virtual bool isStore(const NodeID l) const</div><div class="ttdoc">Returns true if l is a store node. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00429">VersionedFlowSensitive.cpp:429</a></div></div>
2015
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a9f9b00551c157f42d1d995e8c4efb54b"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a9f9b00551c157f42d1d995e8c4efb54b">SVF::VersionedFlowSensitive::delta</a></div><div class="ttdeci">virtual bool delta(const NodeID l) const</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00406">VersionedFlowSensitive.cpp:406</a></div></div>
2014
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aac920c9a5f13dd147e3c130425e005eb"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">SVF::VersionedFlowSensitive::isStore</a></div><div class="ttdeci">virtual bool isStore(const NodeID l) const</div><div class="ttdoc">Returns true if l is a store node. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00455">VersionedFlowSensitive.cpp:455</a></div></div>
2015
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a9f9b00551c157f42d1d995e8c4efb54b"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a9f9b00551c157f42d1d995e8c4efb54b">SVF::VersionedFlowSensitive::delta</a></div><div class="ttdeci">virtual bool delta(const NodeID l) const</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00432">VersionedFlowSensitive.cpp:432</a></div></div>
2016
2016
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aaae8c6858593ed050dcf2c9220228e3e"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aaae8c6858593ed050dcf2c9220228e3e">SVF::VersionedFlowSensitive::prelabeledObjects</a></div><div class="ttdeci">Set&lt; NodeID &gt; prelabeledObjects</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00207">VersionedFlowSensitive.h:207</a></div></div>
2017
2017
  <div class="ttc" id="namespaceSVF_html_a8234d4b959abc9123993bcff4eee34c1"><div class="ttname"><a href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">SVF::Map</a></div><div class="ttdeci">std::unordered_map&lt; Key, Value, Hash, KeyEqual, Allocator &gt; Map</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00110">SVFBasicTypes.h:110</a></div></div>
2018
2018
  <div class="ttc" id="namespaceSVF_html_a9ec7a8dc63411ee3724a25a59191be0c"><div class="ttname"><a href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">SVF::Version</a></div><div class="ttdeci">unsigned Version</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00133">SVFBasicTypes.h:133</a></div></div>
@@ -2026,23 +2026,25 @@ Additional Inherited Members</h2></td></tr>
2026
2026
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a1dc6e3d4931b53e7e426c0f76d06aeb3"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">SVF::VersionedFlowSensitive::versionReliance</a></div><div class="ttdeci">VersionRelianceMap versionReliance</div><div class="ttdoc">o -&gt; (version -&gt; versions which rely on it). </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00190">VersionedFlowSensitive.h:190</a></div></div>
2027
2027
  <div class="ttc" id="classSVF_1_1GenericGraph_html_a4bef15157423cef48dc7333a803cd27d"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">SVF::GenericGraph::end</a></div><div class="ttdeci">iterator end()</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00369">GenericGraph.h:369</a></div></div>
2028
2028
  <div class="ttc" id="classSVF_1_1GenericEdge_html_aeaa31a2c8479e831b36ce2e2582ceb86"><div class="ttname"><a href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">SVF::GenericEdge::getDstNode</a></div><div class="ttdeci">NodeType * getDstNode() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00093">GenericGraph.h:93</a></div></div>
2029
+ <div class="ttc" id="namespaceSVF_html_af739db846e47ba6b2fd15eaad31ab7fb"><div class="ttname"><a href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">SVF::Set</a></div><div class="ttdeci">std::unordered_set&lt; Key, Hash, KeyEqual, Allocator &gt; Set</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00105">SVFBasicTypes.h:105</a></div></div>
2029
2030
  <div class="ttc" id="classSVF_1_1GenericNode_html_a2d9cd758d6f8c5189d9b90b74f43e009"><div class="ttname"><a href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">SVF::GenericNode::getOutEdges</a></div><div class="ttdeci">const GEdgeSetTy &amp; getOutEdges() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00182">GenericGraph.h:182</a></div></div>
2030
2031
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a630eeca9c3344d24fa196f7de45bce18"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a630eeca9c3344d24fa196f7de45bce18">SVF::VersionedFlowSensitive::MeldVersion</a></div><div class="ttdeci">CoreBitVector MeldVersion</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00033">VersionedFlowSensitive.h:33</a></div></div>
2031
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_1_1SCC_html_ad52f6f586168ca4ceaf85cca8dfab825"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive_1_1SCC.html#ad52f6f586168ca4ceaf85cca8dfab825">SVF::VersionedFlowSensitive::SCC::detectSCCs</a></div><div class="ttdeci">static unsigned detectSCCs(VersionedFlowSensitive *vfs, const SVFG *svfg, const NodeID object, const std::vector&lt; const SVFGNode *&gt; &amp;startingNodes, std::vector&lt; int &gt; &amp;partOf, std::vector&lt; const IndirectSVFGEdge *&gt; &amp;footprint)</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00928">VersionedFlowSensitive.cpp:928</a></div></div>
2032
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_1_1SCC_html_ad52f6f586168ca4ceaf85cca8dfab825"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive_1_1SCC.html#ad52f6f586168ca4ceaf85cca8dfab825">SVF::VersionedFlowSensitive::SCC::detectSCCs</a></div><div class="ttdeci">static unsigned detectSCCs(VersionedFlowSensitive *vfs, const SVFG *svfg, const NodeID object, const std::vector&lt; const SVFGNode *&gt; &amp;startingNodes, std::vector&lt; int &gt; &amp;partOf, std::vector&lt; const IndirectSVFGEdge *&gt; &amp;footprint)</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00954">VersionedFlowSensitive.cpp:954</a></div></div>
2032
2033
  <div class="ttc" id="classSVF_1_1PointerAnalysis_html_a5ec3d9bf1fc81346c9df29638daedc0f"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">SVF::PointerAnalysis::stat</a></div><div class="ttdeci">PTAStat * stat</div><div class="ttdoc">Statistics. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00150">PointerAnalysis.h:150</a></div></div>
2033
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3fa5afa4f54e0828ec090fde07b1bfa2"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3fa5afa4f54e0828ec090fde07b1bfa2">SVF::VersionedFlowSensitive::deltaSource</a></div><div class="ttdeci">virtual bool deltaSource(const NodeID l) const</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00412">VersionedFlowSensitive.cpp:412</a></div></div>
2034
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3fa5afa4f54e0828ec090fde07b1bfa2"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3fa5afa4f54e0828ec090fde07b1bfa2">SVF::VersionedFlowSensitive::deltaSource</a></div><div class="ttdeci">virtual bool deltaSource(const NodeID l) const</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00438">VersionedFlowSensitive.cpp:438</a></div></div>
2034
2035
  <div class="ttc" id="classSVF_1_1CoreBitVector_html_a93cdd9890522cc9fee2451567e0b1f0d"><div class="ttname"><a href="classSVF_1_1CoreBitVector.html#a93cdd9890522cc9fee2451567e0b1f0d">SVF::CoreBitVector::end</a></div><div class="ttdeci">const_iterator end(void) const</div><div class="ttdef"><b>Definition:</b> <a href="CoreBitVector_8cpp_source.html#l00308">CoreBitVector.cpp:308</a></div></div>
2035
2036
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3d44a343a2e3f5d276fd1b069c92e112"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">SVF::VersionedFlowSensitive::invalidVersion</a></div><div class="ttdeci">static const Version invalidVersion</div><div class="ttdoc">If this version appears, there has been an error. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00044">VersionedFlowSensitive.h:44</a></div></div>
2036
- <div class="ttc" id="classSVF_1_1MRSVFGNode_html_a28fe266d0e4618aa4448aa218495a332"><div class="ttname"><a href="classSVF_1_1MRSVFGNode.html#a28fe266d0e4618aa4448aa218495a332">SVF::MRSVFGNode::getPointsTo</a></div><div class="ttdeci">const NodeBS &amp; getPointsTo() const</div><div class="ttdoc">Return points-to of the MR. </div><div class="ttdef"><b>Definition:</b> <a href="SVFGNode_8h_source.html#l00052">SVFGNode.h:52</a></div></div>
2037
2037
  <div class="ttc" id="SVFBasicTypes_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00182">SVFBasicTypes.h:182</a></div></div>
2038
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aabc0a5a7a31b8d880e019773ba960741"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aabc0a5a7a31b8d880e019773ba960741">SVF::VersionedFlowSensitive::setConsume</a></div><div class="ttdeci">void setConsume(const NodeID l, const NodeID o, const Version v)</div><div class="ttdoc">Sets the consumed version of o at l to v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00795">VersionedFlowSensitive.cpp:795</a></div></div>
2038
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aabc0a5a7a31b8d880e019773ba960741"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aabc0a5a7a31b8d880e019773ba960741">SVF::VersionedFlowSensitive::setConsume</a></div><div class="ttdeci">void setConsume(const NodeID l, const NodeID o, const Version v)</div><div class="ttdoc">Sets the consumed version of o at l to v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00821">VersionedFlowSensitive.cpp:821</a></div></div>
2039
2039
  <div class="ttc" id="cJSON_8cpp_html_a8a1a0a26c50cc4becfc754bb68d1dc6b"><div class="ttname"><a href="cJSON_8cpp.html#a8a1a0a26c50cc4becfc754bb68d1dc6b">a</a></div><div class="ttdeci">cJSON * a</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02560">cJSON.cpp:2560</a></div></div>
2040
+ <div class="ttc" id="classSVF_1_1GenericNode_html_ac3e55ef37aefb411ea4c87b1aa3b1895"><div class="ttname"><a href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">SVF::GenericNode::getId</a></div><div class="ttdeci">NodeID getId() const</div><div class="ttdoc">Get ID. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00169">GenericGraph.h:169</a></div></div>
2040
2041
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a8182be247907420db00837cef9bcfa70"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if&lt;!is_simple_type&lt; Y &gt;::value, typename cast_retty&lt; X, const Y &gt;::ret_type &gt;::type dyn_cast(const Y &amp;Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00343">Casting.h:343</a></div></div>
2041
2042
  <div class="ttc" id="classSVF_1_1Options_html_adba18ce8f1496fe2e57a934f11c2dfd9"><div class="ttname"><a href="classSVF_1_1Options.html#adba18ce8f1496fe2e57a934f11c2dfd9">SVF::Options::VersioningThreads</a></div><div class="ttdeci">static const llvm::cl::opt&lt; unsigned &gt; VersioningThreads</div><div class="ttdoc">Number of threads for the versioning phase. </div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00077">Options.h:77</a></div></div>
2042
2043
  <div class="ttc" id="classSVF_1_1IndirectSVFGEdge_html"><div class="ttname"><a href="classSVF_1_1IndirectSVFGEdge.html">SVF::IndirectSVFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFGEdge_8h_source.html#l00042">SVFGEdge.h:42</a></div></div>
2044
+ <div class="ttc" id="classSVF_1_1PointsTo_html"><div class="ttname"><a href="classSVF_1_1PointsTo.html">SVF::PointsTo</a></div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00028">PointsTo.h:28</a></div></div>
2043
2045
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_a5cfee013a1a5821ef0c449842dd8690d"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">SVF::FlowSensitive::ander</a></div><div class="ttdeci">AndersenWaveDiff * ander</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00280">FlowSensitive.h:280</a></div></div>
2044
2046
  <div class="ttc" id="classSVF_1_1FIFOWorkList_html_a8fa72918fce7e9c0b2dc34b683a797c6"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">SVF::FIFOWorkList::pop</a></div><div class="ttdeci">Data pop()</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00174">WorkList.h:174</a></div></div>
2045
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a984a4f929a18f97bfefac0102088a7fd"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a984a4f929a18f97bfefac0102088a7fd">SVF::VersionedFlowSensitive::isLoad</a></div><div class="ttdeci">virtual bool isLoad(const NodeID l) const</div><div class="ttdoc">Returns true if l is a load node. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00435">VersionedFlowSensitive.cpp:435</a></div></div>
2047
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a984a4f929a18f97bfefac0102088a7fd"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a984a4f929a18f97bfefac0102088a7fd">SVF::VersionedFlowSensitive::isLoad</a></div><div class="ttdeci">virtual bool isLoad(const NodeID l) const</div><div class="ttdoc">Returns true if l is a load node. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00461">VersionedFlowSensitive.cpp:461</a></div></div>
2046
2048
  <div class="ttc" id="classSVF_1_1IndirectSVFGEdge_html_a30aca718d25924f1babdf348bb0ace71"><div class="ttname"><a href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">SVF::IndirectSVFGEdge::getPointsTo</a></div><div class="ttdeci">const NodeBS &amp; getPointsTo() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFGEdge_8h_source.html#l00060">SVFGEdge.h:60</a></div></div>
2047
2049
  <div class="ttc" id="classSVF_1_1VFGNode_html"><div class="ttname"><a href="classSVF_1_1VFGNode.html">SVF::VFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00046">VFGNode.h:46</a></div></div>
2048
2050
  <div class="ttc" id="classSVF_1_1PTAStat_html_a3c4eaa1695ea13405911ae1621f98edc"><div class="ttname"><a href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">SVF::PTAStat::getClk</a></div><div class="ttdeci">static double getClk(bool mark=false)</div><div class="ttdef"><b>Definition:</b> <a href="PTAStat_8cpp_source.html#l00114">PTAStat.cpp:114</a></div></div>
@@ -2083,7 +2085,7 @@ Additional Inherited Members</h2></td></tr>
2083
2085
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_aae032e5f5d53b131d0112dc8faa464a9"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">SVF::FlowSensitive::svfg</a></div><div class="ttdeci">SVFG * svfg</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00246">FlowSensitive.h:246</a></div></div>
2084
2086
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_adfefc0dfa4e7fb4d20fafeaf96a5fa67"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">SVF::VersionedFlowSensitive::vWorklist</a></div><div class="ttdeci">FIFOWorkList&lt; NodeID &gt; vWorklist</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00205">VersionedFlowSensitive.h:205</a></div></div>
2085
2087
  <div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00019">MTAResultValidator.h:19</a></div></div>
2086
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a9f9b00551c157f42d1d995e8c4efb54b"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a9f9b00551c157f42d1d995e8c4efb54b">SVF::VersionedFlowSensitive::delta</a></div><div class="ttdeci">virtual bool delta(const NodeID l) const</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00406">VersionedFlowSensitive.cpp:406</a></div></div>
2088
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a9f9b00551c157f42d1d995e8c4efb54b"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a9f9b00551c157f42d1d995e8c4efb54b">SVF::VersionedFlowSensitive::delta</a></div><div class="ttdeci">virtual bool delta(const NodeID l) const</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00432">VersionedFlowSensitive.cpp:432</a></div></div>
2087
2089
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aaae8c6858593ed050dcf2c9220228e3e"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aaae8c6858593ed050dcf2c9220228e3e">SVF::VersionedFlowSensitive::prelabeledObjects</a></div><div class="ttdeci">Set&lt; NodeID &gt; prelabeledObjects</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00207">VersionedFlowSensitive.h:207</a></div></div>
2088
2090
  <div class="ttc" id="classSVF_1_1SparseBitVector_html_a9f96e6a886fa69e07cda5dbfaed8b7c9"><div class="ttname"><a href="classSVF_1_1SparseBitVector.html#a9f96e6a886fa69e07cda5dbfaed8b7c9">SVF::SparseBitVector::count</a></div><div class="ttdeci">unsigned count() const</div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l01102">SparseBitVector.h:1102</a></div></div>
2089
2091
  <div class="ttc" id="classSVF_1_1MRSVFGNode_html"><div class="ttname"><a href="classSVF_1_1MRSVFGNode.html">SVF::MRSVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFGNode_8h_source.html#l00042">SVFGNode.h:42</a></div></div>
@@ -2133,8 +2135,8 @@ Additional Inherited Members</h2></td></tr>
2133
2135
 
2134
2136
  <p>Reimplemented from <a class="el" href="classSVF_1_1FlowSensitive.html#a9968530b3dee876f55e6659530decf27">SVF::FlowSensitive</a>.</p>
2135
2137
 
2136
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00621">621</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2137
- <div class="fragment"><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160;{</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160;</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160;</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; <span class="comment">// l: p = *q</span></div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = load-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <a class="code" href="cJSON_8cpp.html#a009ef1d888ab6dbe77e6b42b0b39f1ae">p</a> = load-&gt;<a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>();</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> q = load-&gt;<a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>();</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160;</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; qpt = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(q);</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : qpt)</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; {</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1SVFIR.html#a5d15e4b09784f438568ebe61f8aa5156">isConstantObj</a>(o) || <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1SVFIR.html#a980e54129ece0757d7f0373f37428507">isNonPointerObj</a>(o)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160;</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af93e65faae99459621ae45cf9d36005d">getConsume</a>(l, o);</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; <span class="keywordflow">if</span> (c != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> &amp;&amp; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-&gt;<a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(p, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, c)))</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; {</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; }</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160;</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#a0f71e4cd0948b294c7d33a690bde7dbe">isFieldInsensitive</a>(o))</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; {</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>&amp; fields = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5dddd53b4ca9d7cc23d88ed9f3de9fde">getAllFieldsObjVars</a>(o);</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> of : fields)</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; {</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af93e65faae99459621ae45cf9d36005d">getConsume</a>(l, of);</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; <span class="keywordflow">if</span> (c != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> &amp;&amp; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-&gt;<a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(p, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(of, c)))</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; {</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; }</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; }</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; }</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; }</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160;</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; <a class="code" href="classSVF_1_1FlowSensitive.html#aab4f70210eb1e6447a24697d3b459067">loadTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160;}</div><div class="ttc" id="cJSON_8cpp_html_a009ef1d888ab6dbe77e6b42b0b39f1ae"><div class="ttname"><a href="cJSON_8cpp.html#a009ef1d888ab6dbe77e6b42b0b39f1ae">p</a></div><div class="ttdeci">cJSON * p</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02559">cJSON.cpp:2559</a></div></div>
2138
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00647">647</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2139
+ <div class="fragment"><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160;{</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160;</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160;</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <span class="comment">// l: p = *q</span></div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = load-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <a class="code" href="cJSON_8cpp.html#a009ef1d888ab6dbe77e6b42b0b39f1ae">p</a> = load-&gt;<a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>();</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> q = load-&gt;<a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>();</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160;</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; qpt = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(q);</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : qpt)</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; {</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1SVFIR.html#a5d15e4b09784f438568ebe61f8aa5156">isConstantObj</a>(o) || <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1SVFIR.html#a980e54129ece0757d7f0373f37428507">isNonPointerObj</a>(o)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160;</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af93e65faae99459621ae45cf9d36005d">getConsume</a>(l, o);</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; <span class="keywordflow">if</span> (c != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> &amp;&amp; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-&gt;<a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(p, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, c)))</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; {</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; }</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160;</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#a0f71e4cd0948b294c7d33a690bde7dbe">isFieldInsensitive</a>(o))</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; {</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>&amp; fields = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5dddd53b4ca9d7cc23d88ed9f3de9fde">getAllFieldsObjVars</a>(o);</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> of : fields)</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; {</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af93e65faae99459621ae45cf9d36005d">getConsume</a>(l, of);</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; <span class="keywordflow">if</span> (c != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> &amp;&amp; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-&gt;<a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(p, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(of, c)))</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; {</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; }</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160; }</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; }</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; }</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160;</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; <a class="code" href="classSVF_1_1FlowSensitive.html#aab4f70210eb1e6447a24697d3b459067">loadTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160;}</div><div class="ttc" id="cJSON_8cpp_html_a009ef1d888ab6dbe77e6b42b0b39f1ae"><div class="ttname"><a href="cJSON_8cpp.html#a009ef1d888ab6dbe77e6b42b0b39f1ae">p</a></div><div class="ttdeci">cJSON * p</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02559">cJSON.cpp:2559</a></div></div>
2138
2140
  <div class="ttc" id="classSVF_1_1StmtVFGNode_html_a04986961ad507be9fcf141ab51787da8"><div class="ttname"><a href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">SVF::StmtVFGNode::getPAGDstNodeID</a></div><div class="ttdeci">NodeID getPAGDstNodeID() const</div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00146">VFGNode.h:146</a></div></div>
2139
2141
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_aab4f70210eb1e6447a24697d3b459067"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#aab4f70210eb1e6447a24697d3b459067">SVF::FlowSensitive::loadTime</a></div><div class="ttdeci">double loadTime</div><div class="ttdoc">time of load edges </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00311">FlowSensitive.h:311</a></div></div>
2140
2142
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a59f3dd74ed8c3e2fc48b9353ba2452aa"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">SVF::VersionedFlowSensitive::atKey</a></div><div class="ttdeci">static VersionedVar atKey(NodeID, Version)</div><div class="ttdoc">Return key into vPtD for address-taken var of a specific version. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00024">VersionedFlowSensitive.cpp:24</a></div></div>
@@ -2151,7 +2153,7 @@ Additional Inherited Members</h2></td></tr>
2151
2153
  <div class="ttc" id="classSVF_1_1VersionedPTData_html_a8b9d50b5ad1c779b2ff231f07f3002ea"><div class="ttname"><a href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">SVF::VersionedPTData::unionPts</a></div><div class="ttdeci">virtual bool unionPts(const VersionedKey &amp;dstVar, const VersionedKey &amp;srcVar)=0</div></div>
2152
2154
  <div class="ttc" id="classSVF_1_1SparseBitVector_html"><div class="ttname"><a href="classSVF_1_1SparseBitVector.html">SVF::SparseBitVector</a></div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l00460">SparseBitVector.h:460</a></div></div>
2153
2155
  <div class="ttc" id="classSVF_1_1GenericNode_html_ac3e55ef37aefb411ea4c87b1aa3b1895"><div class="ttname"><a href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">SVF::GenericNode::getId</a></div><div class="ttdeci">NodeID getId() const</div><div class="ttdoc">Get ID. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00169">GenericGraph.h:169</a></div></div>
2154
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af93e65faae99459621ae45cf9d36005d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af93e65faae99459621ae45cf9d36005d">SVF::VersionedFlowSensitive::getConsume</a></div><div class="ttdeci">Version getConsume(const NodeID l, const NodeID o) const</div><div class="ttdoc">Returns the consumed version of o at l. If no such version exists, returns invalidVersion. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00777">VersionedFlowSensitive.cpp:777</a></div></div>
2156
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af93e65faae99459621ae45cf9d36005d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af93e65faae99459621ae45cf9d36005d">SVF::VersionedFlowSensitive::getConsume</a></div><div class="ttdeci">Version getConsume(const NodeID l, const NodeID o) const</div><div class="ttdoc">Returns the consumed version of o at l. If no such version exists, returns invalidVersion. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00803">VersionedFlowSensitive.cpp:803</a></div></div>
2155
2157
  <div class="ttc" id="classSVF_1_1PointerAnalysis_html_adc7f5c71efb9cd1bec4f5ca9127654c3"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">SVF::PointerAnalysis::pag</a></div><div class="ttdeci">static SVFIR * pag</div><div class="ttdoc">SVFIR. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00142">PointerAnalysis.h:142</a></div></div>
2156
2158
  <div class="ttc" id="classSVF_1_1PointerAnalysis_html_a0f71e4cd0948b294c7d33a690bde7dbe"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a0f71e4cd0948b294c7d33a690bde7dbe">SVF::PointerAnalysis::isFieldInsensitive</a></div><div class="ttdeci">bool isFieldInsensitive(NodeID id) const</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00354">PointerAnalysis.h:354</a></div></div>
2157
2159
  <div class="ttc" id="classSVF_1_1PointsTo_html"><div class="ttname"><a href="classSVF_1_1PointsTo.html">SVF::PointsTo</a></div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00028">PointsTo.h:28</a></div></div>
@@ -2189,10 +2191,10 @@ Additional Inherited Members</h2></td></tr>
2189
2191
 
2190
2192
  <p>Reimplemented from <a class="el" href="classSVF_1_1FlowSensitive.html#a16f594356ea565eb1fed2acea516a16b">SVF::FlowSensitive</a>.</p>
2191
2193
 
2192
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00564">564</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2193
- <div class="fragment"><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160;{</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* sn = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>);</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="comment">// Handle DummyVersPropSVFGNode here so we don&#39;t have to override the long</span></div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <span class="comment">// processSVFGNode. We also don&#39;t call propagate based on its result.</span></div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1DummyVersionPropSVFGNode.html">DummyVersionPropSVFGNode</a> *dvp = SVFUtil::dyn_cast&lt;DummyVersionPropSVFGNode&gt;(sn))</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; {</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(dvp-&gt;getObject(), dvp-&gt;getVersion());</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; }</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#a979f89495966d71f9b470d832384ebd6">processSVFGNode</a>(sn))</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; {</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <a class="code" href="classSVF_1_1WPASolver.html#a541ef7fda44ce79086c30b07a5f6126c">propagate</a>(&amp;sn);</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; }</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160;}</div><div class="ttc" id="classSVF_1_1WPASolver_html_a541ef7fda44ce79086c30b07a5f6126c"><div class="ttname"><a href="classSVF_1_1WPASolver.html#a541ef7fda44ce79086c30b07a5f6126c">SVF::WPASolver::propagate</a></div><div class="ttdeci">virtual void propagate(GNODE *v)</div><div class="ttdef"><b>Definition:</b> <a href="WPASolver_8h_source.html#l00131">WPASolver.h:131</a></div></div>
2194
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00590">590</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2195
+ <div class="fragment"><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160;{</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* sn = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>);</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; <span class="comment">// Handle DummyVersPropSVFGNode here so we don&#39;t have to override the long</span></div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="comment">// processSVFGNode. We also don&#39;t call propagate based on its result.</span></div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1DummyVersionPropSVFGNode.html">DummyVersionPropSVFGNode</a> *dvp = SVFUtil::dyn_cast&lt;DummyVersionPropSVFGNode&gt;(sn))</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; {</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(dvp-&gt;getObject(), dvp-&gt;getVersion());</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; }</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#a979f89495966d71f9b470d832384ebd6">processSVFGNode</a>(sn))</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; {</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; <a class="code" href="classSVF_1_1WPASolver.html#a541ef7fda44ce79086c30b07a5f6126c">propagate</a>(&amp;sn);</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; }</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160;}</div><div class="ttc" id="classSVF_1_1WPASolver_html_a541ef7fda44ce79086c30b07a5f6126c"><div class="ttname"><a href="classSVF_1_1WPASolver.html#a541ef7fda44ce79086c30b07a5f6126c">SVF::WPASolver::propagate</a></div><div class="ttdeci">virtual void propagate(GNODE *v)</div><div class="ttdef"><b>Definition:</b> <a href="WPASolver_8h_source.html#l00131">WPASolver.h:131</a></div></div>
2194
2196
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_aae032e5f5d53b131d0112dc8faa464a9"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">SVF::FlowSensitive::svfg</a></div><div class="ttdeci">SVFG * svfg</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00246">FlowSensitive.h:246</a></div></div>
2195
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a7a98162b69de90f80ce853a6ff43af56"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">SVF::VersionedFlowSensitive::propagateVersion</a></div><div class="ttdeci">void propagateVersion(NodeID o, Version v)</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00520">VersionedFlowSensitive.cpp:520</a></div></div>
2197
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a7a98162b69de90f80ce853a6ff43af56"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">SVF::VersionedFlowSensitive::propagateVersion</a></div><div class="ttdeci">void propagateVersion(NodeID o, Version v)</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00546">VersionedFlowSensitive.cpp:546</a></div></div>
2196
2198
  <div class="ttc" id="classSVF_1_1SVFG_html_a7ace06b6c893b31f7dec2abe54e33e11"><div class="ttname"><a href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">SVF::SVFG::getSVFGNode</a></div><div class="ttdeci">SVFGNode * getSVFGNode(NodeID id) const</div><div class="ttdoc">Get a SVFG node. </div><div class="ttdef"><b>Definition:</b> <a href="SVFG_8h_source.html#l00150">SVFG.h:150</a></div></div>
2197
2199
  <div class="ttc" id="cJSON_8cpp_html_ab6e2ea6dc7bd57d1483413449998230a"><div class="ttname"><a href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a></div><div class="ttdeci">cJSON * n</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02558">cJSON.cpp:2558</a></div></div>
2198
2200
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_a979f89495966d71f9b470d832384ebd6"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a979f89495966d71f9b470d832384ebd6">SVF::FlowSensitive::processSVFGNode</a></div><div class="ttdeci">bool processSVFGNode(SVFGNode *node)</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8cpp_source.html#l00192">FlowSensitive.cpp:192</a></div></div>
@@ -2231,11 +2233,11 @@ Additional Inherited Members</h2></td></tr>
2231
2233
 
2232
2234
  <p>Reimplemented from <a class="el" href="classSVF_1_1FlowSensitive.html#aa37d591d2d4f65957e840bef4d142a6a">SVF::FlowSensitive</a>.</p>
2233
2235
 
2234
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00664">664</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2235
- <div class="fragment"><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160;{</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <a class="code" href="cJSON_8cpp.html#a009ef1d888ab6dbe77e6b42b0b39f1ae">p</a> = store-&gt;<a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>();</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &amp;ppt = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(p);</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160;</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; <span class="keywordflow">if</span> (ppt.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160;</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> q = store-&gt;<a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>();</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &amp;qpt = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(q);</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160;</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = store-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; <span class="comment">// l: *p = q</span></div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160;</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160; <span class="comment">// The version for these objects would be y_l(o).</span></div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> changedObjects;</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160;</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; <span class="keywordflow">if</span> (!qpt.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>())</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; {</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : ppt)</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; {</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1SVFIR.html#a5d15e4b09784f438568ebe61f8aa5156">isConstantObj</a>(o) || <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1SVFIR.html#a980e54129ece0757d7f0373f37428507">isNonPointerObj</a>(o)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a01a199e9fdb5759c7f78ee344dbc413c">getYield</a>(l, o);</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; <span class="keywordflow">if</span> (y != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> &amp;&amp; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-&gt;<a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, y), q))</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; {</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; changedObjects.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(o);</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; }</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; }</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; }</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160;</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; <a class="code" href="classSVF_1_1FlowSensitive.html#a82b76087363b26fbe749653935569de7">storeTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160;</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; <span class="keywordtype">double</span> updateStart = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160;</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> singleton = 0;</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; <span class="keywordtype">bool</span> isSU = <a class="code" href="classSVF_1_1FlowSensitive.html#a42a7e39e0e15576742f8ba7c32579ea2">isStrongUpdate</a>(store, singleton);</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <span class="keywordflow">if</span> (isSU) <a class="code" href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">svfgHasSU</a>.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(l);</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; <span class="keywordflow">else</span> <a class="code" href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">svfgHasSU</a>.<a class="code" href="classSVF_1_1SparseBitVector.html#ad5337b5aeed50f8b7ffd56b14ee25c9f">reset</a>(l);</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160;</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; <span class="comment">// For all objects, perform pts(o:y) = pts(o:y) U pts(o:c) at loc,</span></div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160; <span class="comment">// except when a strong update is taking place.</span></div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ObjToVersionMap::value_type &amp;oc : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>[l])</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; {</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = oc.first;</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = oc.second;</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160;</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; <span class="comment">// Strong-updated; don&#39;t propagate.</span></div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; <span class="keywordflow">if</span> (isSU &amp;&amp; o == singleton) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160;</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a01a199e9fdb5759c7f78ee344dbc413c">getYield</a>(l, o);</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; <span class="keywordflow">if</span> (y != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> &amp;&amp; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-&gt;<a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, y), <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, c)))</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; {</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; changedObjects.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(o);</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; }</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; }</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160;</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; <span class="keywordtype">double</span> updateEnd = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; <a class="code" href="classSVF_1_1FlowSensitive.html#af5a94d14096ae2bbc47b3b3b9f723226">updateTime</a> += (updateEnd - updateStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160;</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; <span class="comment">// Changed objects need to be propagated. Time here should be inconsequential</span></div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; <span class="comment">// *except* for time taken for propagateVersion, which will time itself.</span></div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; <span class="keywordflow">if</span> (!changedObjects.<a class="code" href="classSVF_1_1SparseBitVector.html#aea5389ad7e5fe4c8bef686940a1a6056">empty</a>())</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; {</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : changedObjects)</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; {</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; <span class="comment">// Definitely has a yielded version (came from prelabelling) as these are</span></div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; <span class="comment">// the changed objects which must&#39;ve been pointed to in Andersen&#39;s too.</span></div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a01a199e9fdb5759c7f78ee344dbc413c">getYield</a>(l, o);</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(o, y);</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160;</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; <span class="comment">// Some o/v pairs changed: statements need to know.</span></div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3489def8e16e4d7c83d2c909d3287fc0">getStmtReliance</a>(o, y)) <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(s);</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; }</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; }</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160;</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160;}</div><div class="ttc" id="cJSON_8cpp_html_a009ef1d888ab6dbe77e6b42b0b39f1ae"><div class="ttname"><a href="cJSON_8cpp.html#a009ef1d888ab6dbe77e6b42b0b39f1ae">p</a></div><div class="ttdeci">cJSON * p</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02559">cJSON.cpp:2559</a></div></div>
2236
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00690">690</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2237
+ <div class="fragment"><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160;{</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <a class="code" href="cJSON_8cpp.html#a009ef1d888ab6dbe77e6b42b0b39f1ae">p</a> = store-&gt;<a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>();</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &amp;ppt = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(p);</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160;</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; <span class="keywordflow">if</span> (ppt.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160;</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> q = store-&gt;<a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>();</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &amp;qpt = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(q);</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160;</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = store-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; <span class="comment">// l: *p = q</span></div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160;</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; <span class="comment">// The version for these objects would be y_l(o).</span></div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> changedObjects;</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160;</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160; <span class="keywordflow">if</span> (!qpt.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>())</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; {</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : ppt)</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; {</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1SVFIR.html#a5d15e4b09784f438568ebe61f8aa5156">isConstantObj</a>(o) || <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-&gt;<a class="code" href="classSVF_1_1SVFIR.html#a980e54129ece0757d7f0373f37428507">isNonPointerObj</a>(o)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160;</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a01a199e9fdb5759c7f78ee344dbc413c">getYield</a>(l, o);</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; <span class="keywordflow">if</span> (y != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> &amp;&amp; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-&gt;<a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, y), q))</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; {</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; changedObjects.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(o);</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; }</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; }</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; }</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160;</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; <a class="code" href="classSVF_1_1FlowSensitive.html#a82b76087363b26fbe749653935569de7">storeTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160;</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; <span class="keywordtype">double</span> updateStart = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160;</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> singleton = 0;</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; <span class="keywordtype">bool</span> isSU = <a class="code" href="classSVF_1_1FlowSensitive.html#a42a7e39e0e15576742f8ba7c32579ea2">isStrongUpdate</a>(store, singleton);</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; <span class="keywordflow">if</span> (isSU) <a class="code" href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">svfgHasSU</a>.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(l);</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; <span class="keywordflow">else</span> <a class="code" href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">svfgHasSU</a>.<a class="code" href="classSVF_1_1SparseBitVector.html#ad5337b5aeed50f8b7ffd56b14ee25c9f">reset</a>(l);</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160;</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; <span class="comment">// For all objects, perform pts(o:y) = pts(o:y) U pts(o:c) at loc,</span></div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; <span class="comment">// except when a strong update is taking place.</span></div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> ObjToVersionMap::value_type &amp;oc : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>[l])</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; {</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = oc.first;</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = oc.second;</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160;</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; <span class="comment">// Strong-updated; don&#39;t propagate.</span></div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; <span class="keywordflow">if</span> (isSU &amp;&amp; o == singleton) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160;</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a01a199e9fdb5759c7f78ee344dbc413c">getYield</a>(l, o);</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; <span class="keywordflow">if</span> (y != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> &amp;&amp; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-&gt;<a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, y), <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, c)))</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; {</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160; changedObjects.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(o);</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; }</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; }</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160;</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; <span class="keywordtype">double</span> updateEnd = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; <a class="code" href="classSVF_1_1FlowSensitive.html#af5a94d14096ae2bbc47b3b3b9f723226">updateTime</a> += (updateEnd - updateStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160;</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; <span class="comment">// Changed objects need to be propagated. Time here should be inconsequential</span></div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; <span class="comment">// *except* for time taken for propagateVersion, which will time itself.</span></div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; <span class="keywordflow">if</span> (!changedObjects.<a class="code" href="classSVF_1_1SparseBitVector.html#aea5389ad7e5fe4c8bef686940a1a6056">empty</a>())</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; {</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : changedObjects)</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; {</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; <span class="comment">// Definitely has a yielded version (came from prelabelling) as these are</span></div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; <span class="comment">// the changed objects which must&#39;ve been pointed to in Andersen&#39;s too.</span></div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a01a199e9fdb5759c7f78ee344dbc413c">getYield</a>(l, o);</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(o, y);</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160;</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; <span class="comment">// Some o/v pairs changed: statements need to know.</span></div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3489def8e16e4d7c83d2c909d3287fc0">getStmtReliance</a>(o, y)) <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(s);</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; }</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; }</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160;</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160;}</div><div class="ttc" id="cJSON_8cpp_html_a009ef1d888ab6dbe77e6b42b0b39f1ae"><div class="ttname"><a href="cJSON_8cpp.html#a009ef1d888ab6dbe77e6b42b0b39f1ae">p</a></div><div class="ttdeci">cJSON * p</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02559">cJSON.cpp:2559</a></div></div>
2236
2238
  <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#l00160">WPASolver.h:160</a></div></div>
2237
2239
  <div class="ttc" id="classSVF_1_1StmtVFGNode_html_a04986961ad507be9fcf141ab51787da8"><div class="ttname"><a href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">SVF::StmtVFGNode::getPAGDstNodeID</a></div><div class="ttdeci">NodeID getPAGDstNodeID() const</div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00146">VFGNode.h:146</a></div></div>
2238
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a7a98162b69de90f80ce853a6ff43af56"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">SVF::VersionedFlowSensitive::propagateVersion</a></div><div class="ttdeci">void propagateVersion(NodeID o, Version v)</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00520">VersionedFlowSensitive.cpp:520</a></div></div>
2240
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a7a98162b69de90f80ce853a6ff43af56"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">SVF::VersionedFlowSensitive::propagateVersion</a></div><div class="ttdeci">void propagateVersion(NodeID o, Version v)</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00546">VersionedFlowSensitive.cpp:546</a></div></div>
2239
2241
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a59f3dd74ed8c3e2fc48b9353ba2452aa"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">SVF::VersionedFlowSensitive::atKey</a></div><div class="ttdeci">static VersionedVar atKey(NodeID, Version)</div><div class="ttdoc">Return key into vPtD for address-taken var of a specific version. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00024">VersionedFlowSensitive.cpp:24</a></div></div>
2240
2242
  <div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00019">MTAResultValidator.h:19</a></div></div>
2241
2243
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_a42a7e39e0e15576742f8ba7c32579ea2"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a42a7e39e0e15576742f8ba7c32579ea2">SVF::FlowSensitive::isStrongUpdate</a></div><div class="ttdeci">bool isStrongUpdate(const SVFGNode *node, NodeID &amp;singleton)</div><div class="ttdoc">Return TRUE if this is a strong update STORE statement. </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8cpp_source.html#l00612">FlowSensitive.cpp:612</a></div></div>
@@ -2243,13 +2245,13 @@ Additional Inherited Members</h2></td></tr>
2243
2245
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a03f5f16377daa0258166a73de3e21f07"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">SVF::VersionedFlowSensitive::vPtD</a></div><div class="ttdeci">BVDataPTAImpl::VersionedPTDataTy * vPtD</div><div class="ttdoc">Points-to DS for working with versions. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00210">VersionedFlowSensitive.h:210</a></div></div>
2244
2246
  <div class="ttc" id="classSVF_1_1SVFIR_html_a5d15e4b09784f438568ebe61f8aa5156"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a5d15e4b09784f438568ebe61f8aa5156">SVF::SVFIR::isConstantObj</a></div><div class="ttdeci">bool isConstantObj(NodeID id) const</div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#l00392">SVFIR.h:392</a></div></div>
2245
2247
  <div class="ttc" id="namespaceSVF_html_a9ec7a8dc63411ee3724a25a59191be0c"><div class="ttname"><a href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">SVF::Version</a></div><div class="ttdeci">unsigned Version</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00133">SVFBasicTypes.h:133</a></div></div>
2246
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a01a199e9fdb5759c7f78ee344dbc413c"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a01a199e9fdb5759c7f78ee344dbc413c">SVF::VersionedFlowSensitive::getYield</a></div><div class="ttdeci">Version getYield(const NodeID l, const NodeID o) const</div><div class="ttdoc">Returns the yielded version of o at l. If no such version exists, returns invalidVersion. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00782">VersionedFlowSensitive.cpp:782</a></div></div>
2248
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a01a199e9fdb5759c7f78ee344dbc413c"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a01a199e9fdb5759c7f78ee344dbc413c">SVF::VersionedFlowSensitive::getYield</a></div><div class="ttdeci">Version getYield(const NodeID l, const NodeID o) const</div><div class="ttdoc">Returns the yielded version of o at l. If no such version exists, returns invalidVersion. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00808">VersionedFlowSensitive.cpp:808</a></div></div>
2247
2249
  <div class="ttc" id="classSVF_1_1BVDataPTAImpl_html_aee289e298e421448caaa604b7eb34fcb"><div class="ttname"><a href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">SVF::BVDataPTAImpl::getPts</a></div><div class="ttdeci">virtual const PointsTo &amp; getPts(NodeID id)</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysisImpl_8h_source.html#l00099">PointerAnalysisImpl.h:99</a></div></div>
2248
2250
  <div class="ttc" id="classSVF_1_1PointsTo_html_ac4688413177b49b37dbbfd3ed188d59b"><div class="ttname"><a href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">SVF::PointsTo::empty</a></div><div class="ttdeci">bool empty(void) const</div><div class="ttdoc">Returns true if set is empty. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00094">PointsTo.cpp:94</a></div></div>
2249
2251
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a2e4e6a84cbfd553ad9cca8fdf9fd4a8d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">SVF::VersionedFlowSensitive::consume</a></div><div class="ttdeci">LocVersionMap consume</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00185">VersionedFlowSensitive.h:185</a></div></div>
2250
2252
  <div class="ttc" id="classSVF_1_1StmtVFGNode_html_a791a01f5d3528f8a8bf19369b5c61c37"><div class="ttname"><a href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">SVF::StmtVFGNode::getPAGSrcNodeID</a></div><div class="ttdeci">NodeID getPAGSrcNodeID() const</div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00141">VFGNode.h:141</a></div></div>
2251
2253
  <div class="ttc" id="classSVF_1_1PointerAnalysis_html_a5ec3d9bf1fc81346c9df29638daedc0f"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">SVF::PointerAnalysis::stat</a></div><div class="ttdeci">PTAStat * stat</div><div class="ttdoc">Statistics. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00150">PointerAnalysis.h:150</a></div></div>
2252
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3489def8e16e4d7c83d2c909d3287fc0"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3489def8e16e4d7c83d2c909d3287fc0">SVF::VersionedFlowSensitive::getStmtReliance</a></div><div class="ttdeci">NodeBS &amp; getStmtReliance(const NodeID o, const Version v)</div><div class="ttdoc">Returns the statements which rely on o:v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00812">VersionedFlowSensitive.cpp:812</a></div></div>
2254
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3489def8e16e4d7c83d2c909d3287fc0"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3489def8e16e4d7c83d2c909d3287fc0">SVF::VersionedFlowSensitive::getStmtReliance</a></div><div class="ttdeci">NodeBS &amp; getStmtReliance(const NodeID o, const Version v)</div><div class="ttdoc">Returns the statements which rely on o:v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00838">VersionedFlowSensitive.cpp:838</a></div></div>
2253
2255
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_a43e8ca2e69e6e8643c9abd1fa231d305"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">SVF::FlowSensitive::svfgHasSU</a></div><div class="ttdeci">NodeBS svfgHasSU</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00316">FlowSensitive.h:316</a></div></div>
2254
2256
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3d44a343a2e3f5d276fd1b069c92e112"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">SVF::VersionedFlowSensitive::invalidVersion</a></div><div class="ttdeci">static const Version invalidVersion</div><div class="ttdoc">If this version appears, there has been an error. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00044">VersionedFlowSensitive.h:44</a></div></div>
2255
2257
  <div class="ttc" id="SVFBasicTypes_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00182">SVFBasicTypes.h:182</a></div></div>
@@ -2302,13 +2304,13 @@ Additional Inherited Members</h2></td></tr>
2302
2304
  </div><div class="memdoc">
2303
2305
  <p>Propagates version v of o to any version of o which relies on v when o/v is changed. Recursively applies to reliant versions till no new changes are made. Adds any statements which rely on any changes made to the worklist. </p>
2304
2306
 
2305
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00520">520</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2306
- <div class="fragment"><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160;{</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160;</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; <span class="keyword">const</span> std::vector&lt;Version&gt; &amp;reliantVersions = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ae83c62a01196991d116ef5c36cb51e31">getReliantVersions</a>(o, v);</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> r : reliantVersions)</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; {</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(o, v, r, <span class="keyword">false</span>);</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; }</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160;</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">versionPropTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a7a98162b69de90f80ce853a6ff43af56"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">SVF::VersionedFlowSensitive::propagateVersion</a></div><div class="ttdeci">void propagateVersion(NodeID o, Version v)</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00520">VersionedFlowSensitive.cpp:520</a></div></div>
2307
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00546">546</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2308
+ <div class="fragment"><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160;{</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160;</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; <span class="keyword">const</span> std::vector&lt;Version&gt; &amp;reliantVersions = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ae83c62a01196991d116ef5c36cb51e31">getReliantVersions</a>(o, v);</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> r : reliantVersions)</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; {</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(o, v, r, <span class="keyword">false</span>);</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; }</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160;</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">versionPropTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a7a98162b69de90f80ce853a6ff43af56"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">SVF::VersionedFlowSensitive::propagateVersion</a></div><div class="ttdeci">void propagateVersion(NodeID o, Version v)</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00546">VersionedFlowSensitive.cpp:546</a></div></div>
2307
2309
  <div class="ttc" id="namespaceSVF_html_a9ec7a8dc63411ee3724a25a59191be0c"><div class="ttname"><a href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">SVF::Version</a></div><div class="ttdeci">unsigned Version</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00133">SVFBasicTypes.h:133</a></div></div>
2308
2310
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af15bb6be283fee2fcc4b1fb7d8190451"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">SVF::VersionedFlowSensitive::versionPropTime</a></div><div class="ttdeci">double versionPropTime</div><div class="ttdoc">Time to propagate versions to versions which rely on them. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00234">VersionedFlowSensitive.h:234</a></div></div>
2309
2311
  <div class="ttc" id="classSVF_1_1PointerAnalysis_html_a5ec3d9bf1fc81346c9df29638daedc0f"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">SVF::PointerAnalysis::stat</a></div><div class="ttdeci">PTAStat * stat</div><div class="ttdoc">Statistics. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00150">PointerAnalysis.h:150</a></div></div>
2310
2312
  <div class="ttc" id="SVFBasicTypes_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00182">SVFBasicTypes.h:182</a></div></div>
2311
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ae83c62a01196991d116ef5c36cb51e31"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ae83c62a01196991d116ef5c36cb51e31">SVF::VersionedFlowSensitive::getReliantVersions</a></div><div class="ttdeci">std::vector&lt; Version &gt; &amp; getReliantVersions(const NodeID o, const Version v)</div><div class="ttdoc">Returns the versions of o which rely on o:v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00807">VersionedFlowSensitive.cpp:807</a></div></div>
2313
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ae83c62a01196991d116ef5c36cb51e31"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ae83c62a01196991d116ef5c36cb51e31">SVF::VersionedFlowSensitive::getReliantVersions</a></div><div class="ttdeci">std::vector&lt; Version &gt; &amp; getReliantVersions(const NodeID o, const Version v)</div><div class="ttdoc">Returns the versions of o which rely on o:v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00833">VersionedFlowSensitive.cpp:833</a></div></div>
2312
2314
  <div class="ttc" id="classSVF_1_1PTAStat_html_a3c4eaa1695ea13405911ae1621f98edc"><div class="ttname"><a href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">SVF::PTAStat::getClk</a></div><div class="ttdeci">static double getClk(bool mark=false)</div><div class="ttdef"><b>Definition:</b> <a href="PTAStat_8cpp_source.html#l00114">PTAStat.cpp:114</a></div></div>
2313
2315
  </div><!-- fragment -->
2314
2316
  </div>
@@ -2360,8 +2362,8 @@ Additional Inherited Members</h2></td></tr>
2360
2362
  </div><div class="memdoc">
2361
2363
  <p>Propagates version v of o to version vp of o. time indicates whether it should record time taken itself. </p>
2362
2364
 
2363
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00534">534</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2364
- <div class="fragment"><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160;{</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <span class="keywordtype">double</span> start = time ? <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>() : 0.0;</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160;</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a32489632f53dce062ca2e8bff42c65cf">VersionedVar</a> srcVar = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, v);</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a32489632f53dce062ca2e8bff42c65cf">VersionedVar</a> dstVar = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, vp);</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-&gt;<a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(dstVar, srcVar))</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; {</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <span class="comment">// o:vp has changed.</span></div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="comment">// Add the dummy propagation node to tell the solver to propagate it later.</span></div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1DummyVersionPropSVFGNode.html">DummyVersionPropSVFGNode</a> *dvp = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; VarToPropNodeMap::const_iterator dvpIt = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">versionedVarToPropNode</a>.find(dstVar);</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="keywordflow">if</span> (dvpIt == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">versionedVarToPropNode</a>.end())</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; {</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; dvp = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#a8dd513e8e5343beeb5d117c1ff4e45ea">addDummyVersionPropSVFGNode</a>(o, vp);</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">versionedVarToPropNode</a>[dstVar] = dvp;</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; }</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keywordflow">else</span> dvp = dvpIt-&gt;second;</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160;</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; assert(dvp != <span class="keyword">nullptr</span> &amp;&amp; <span class="stringliteral">&quot;VFS::propagateVersion: propagation dummy node not found?&quot;</span>);</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(dvp-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160;</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="comment">// Notify nodes which rely on o:vp that it changed.</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3489def8e16e4d7c83d2c909d3287fc0">getStmtReliance</a>(o, vp)) <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(s);</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; }</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160;</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="keywordtype">double</span> end = time ? <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>() : 0.0;</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; <span class="keywordflow">if</span> (time) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">versionPropTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160;}</div><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#l00160">WPASolver.h:160</a></div></div>
2365
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00560">560</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2366
+ <div class="fragment"><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160;{</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="keywordtype">double</span> start = time ? <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>() : 0.0;</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160;</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a32489632f53dce062ca2e8bff42c65cf">VersionedVar</a> srcVar = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, v);</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a32489632f53dce062ca2e8bff42c65cf">VersionedVar</a> dstVar = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, vp);</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-&gt;<a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(dstVar, srcVar))</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; {</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <span class="comment">// o:vp has changed.</span></div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="comment">// Add the dummy propagation node to tell the solver to propagate it later.</span></div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1DummyVersionPropSVFGNode.html">DummyVersionPropSVFGNode</a> *dvp = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; VarToPropNodeMap::const_iterator dvpIt = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">versionedVarToPropNode</a>.find(dstVar);</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; <span class="keywordflow">if</span> (dvpIt == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">versionedVarToPropNode</a>.end())</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; {</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; dvp = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#a8dd513e8e5343beeb5d117c1ff4e45ea">addDummyVersionPropSVFGNode</a>(o, vp);</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">versionedVarToPropNode</a>[dstVar] = dvp;</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; }</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; <span class="keywordflow">else</span> dvp = dvpIt-&gt;second;</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160;</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; assert(dvp != <span class="keyword">nullptr</span> &amp;&amp; <span class="stringliteral">&quot;VFS::propagateVersion: propagation dummy node not found?&quot;</span>);</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(dvp-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160;</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; <span class="comment">// Notify nodes which rely on o:vp that it changed.</span></div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3489def8e16e4d7c83d2c909d3287fc0">getStmtReliance</a>(o, vp)) <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(s);</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; }</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160;</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <span class="keywordtype">double</span> end = time ? <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-&gt;<a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>() : 0.0;</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="keywordflow">if</span> (time) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">versionPropTime</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>&#160;}</div><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#l00160">WPASolver.h:160</a></div></div>
2365
2367
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_aae032e5f5d53b131d0112dc8faa464a9"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">SVF::FlowSensitive::svfg</a></div><div class="ttdeci">SVFG * svfg</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00246">FlowSensitive.h:246</a></div></div>
2366
2368
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a59f3dd74ed8c3e2fc48b9353ba2452aa"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">SVF::VersionedFlowSensitive::atKey</a></div><div class="ttdeci">static VersionedVar atKey(NodeID, Version)</div><div class="ttdoc">Return key into vPtD for address-taken var of a specific version. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00024">VersionedFlowSensitive.cpp:24</a></div></div>
2367
2369
  <div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00019">MTAResultValidator.h:19</a></div></div>
@@ -2370,7 +2372,7 @@ Additional Inherited Members</h2></td></tr>
2370
2372
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af15bb6be283fee2fcc4b1fb7d8190451"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">SVF::VersionedFlowSensitive::versionPropTime</a></div><div class="ttdeci">double versionPropTime</div><div class="ttdoc">Time to propagate versions to versions which rely on them. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00234">VersionedFlowSensitive.h:234</a></div></div>
2371
2373
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af14a4cbc0b990389d31b2f88f50ad8eb"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">SVF::VersionedFlowSensitive::versionedVarToPropNode</a></div><div class="ttdeci">VarToPropNodeMap versionedVarToPropNode</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00196">VersionedFlowSensitive.h:196</a></div></div>
2372
2374
  <div class="ttc" id="classSVF_1_1PointerAnalysis_html_a5ec3d9bf1fc81346c9df29638daedc0f"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">SVF::PointerAnalysis::stat</a></div><div class="ttdeci">PTAStat * stat</div><div class="ttdoc">Statistics. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00150">PointerAnalysis.h:150</a></div></div>
2373
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3489def8e16e4d7c83d2c909d3287fc0"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3489def8e16e4d7c83d2c909d3287fc0">SVF::VersionedFlowSensitive::getStmtReliance</a></div><div class="ttdeci">NodeBS &amp; getStmtReliance(const NodeID o, const Version v)</div><div class="ttdoc">Returns the statements which rely on o:v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00812">VersionedFlowSensitive.cpp:812</a></div></div>
2375
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3489def8e16e4d7c83d2c909d3287fc0"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3489def8e16e4d7c83d2c909d3287fc0">SVF::VersionedFlowSensitive::getStmtReliance</a></div><div class="ttdeci">NodeBS &amp; getStmtReliance(const NodeID o, const Version v)</div><div class="ttdoc">Returns the statements which rely on o:v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00838">VersionedFlowSensitive.cpp:838</a></div></div>
2374
2376
  <div class="ttc" id="SVFBasicTypes_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00182">SVFBasicTypes.h:182</a></div></div>
2375
2377
  <div class="ttc" id="classSVF_1_1VersionedPTData_html_a8b9d50b5ad1c779b2ff231f07f3002ea"><div class="ttname"><a href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">SVF::VersionedPTData::unionPts</a></div><div class="ttdeci">virtual bool unionPts(const VersionedKey &amp;dstVar, const VersionedKey &amp;srcVar)=0</div></div>
2376
2378
  <div class="ttc" id="classSVF_1_1GenericNode_html_ac3e55ef37aefb411ea4c87b1aa3b1895"><div class="ttname"><a href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">SVF::GenericNode::getId</a></div><div class="ttdeci">NodeID getId() const</div><div class="ttdoc">Get ID. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00169">GenericGraph.h:169</a></div></div>
@@ -2499,8 +2501,8 @@ Additional Inherited Members</h2></td></tr>
2499
2501
 
2500
2502
  <p>Removes all indirect edges in the <a class="el" href="classSVF_1_1SVFG.html">SVFG</a>. </p>
2501
2503
 
2502
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00498">498</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2503
- <div class="fragment"><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160;{</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFG.html#a241d0489bf0315460e2b07db87e7847c">SVFG::iterator</a> nodeIt = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); nodeIt != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++nodeIt)</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160; {</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *sn = nodeIt-&gt;second;</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160;</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1FlowSensitive.html#a69289c48fa91f850da90de080b9d26e5">SVFGEdgeSetTy</a> &amp;inEdges = sn-&gt;<a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>();</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; std::vector&lt;SVFGEdge *&gt; toDeleteFromIn;</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : inEdges)</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; {</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;IndirectSVFGEdge&gt;(e)) toDeleteFromIn.push_back(e);</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; }</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160;</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : toDeleteFromIn) <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#a931d8b82e10a54d68c68cf6bd80264be">removeSVFGEdge</a>(e);</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160;</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; <span class="comment">// Only need to iterate over incoming edges for each node because edges</span></div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; <span class="comment">// will be deleted from in/out through removeSVFGEdge.</span></div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; }</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160;</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <a class="code" href="classSVF_1_1WPASolver.html#aa04deb39cd024c051f30ac43d1d62b34">setGraph</a>(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>);</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160;}</div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
2504
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00524">524</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2505
+ <div class="fragment"><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160;{</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFG.html#a241d0489bf0315460e2b07db87e7847c">SVFG::iterator</a> nodeIt = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); nodeIt != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++nodeIt)</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; {</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *sn = nodeIt-&gt;second;</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160;</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1FlowSensitive.html#a69289c48fa91f850da90de080b9d26e5">SVFGEdgeSetTy</a> &amp;inEdges = sn-&gt;<a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>();</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; std::vector&lt;SVFGEdge *&gt; toDeleteFromIn;</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : inEdges)</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; {</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;IndirectSVFGEdge&gt;(e)) toDeleteFromIn.push_back(e);</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; }</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160;</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : toDeleteFromIn) <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-&gt;<a class="code" href="classSVF_1_1SVFG.html#a931d8b82e10a54d68c68cf6bd80264be">removeSVFGEdge</a>(e);</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160;</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="comment">// Only need to iterate over incoming edges for each node because edges</span></div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <span class="comment">// will be deleted from in/out through removeSVFGEdge.</span></div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; }</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <a class="code" href="classSVF_1_1WPASolver.html#aa04deb39cd024c051f30ac43d1d62b34">setGraph</a>(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>);</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160;}</div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
2504
2506
  <div class="ttc" id="classSVF_1_1SVFG_html_a931d8b82e10a54d68c68cf6bd80264be"><div class="ttname"><a href="classSVF_1_1SVFG.html#a931d8b82e10a54d68c68cf6bd80264be">SVF::SVFG::removeSVFGEdge</a></div><div class="ttdeci">void removeSVFGEdge(SVFGEdge *edge)</div><div class="ttdoc">Remove a SVFG edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFG_8h_source.html#l00232">SVFG.h:232</a></div></div>
2505
2507
  <div class="ttc" id="classSVF_1_1FlowSensitive_html_aae032e5f5d53b131d0112dc8faa464a9"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">SVF::FlowSensitive::svfg</a></div><div class="ttdeci">SVFG * svfg</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00246">FlowSensitive.h:246</a></div></div>
2506
2508
  <div class="ttc" id="classSVF_1_1GenericNode_html_afc8b5f86d7795b6a0dfc0687d942d79b"><div class="ttname"><a href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">SVF::GenericNode::getInEdges</a></div><div class="ttdeci">const GEdgeSetTy &amp; getInEdges() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00186">GenericGraph.h:186</a></div></div>
@@ -2555,9 +2557,9 @@ Additional Inherited Members</h2></td></tr>
2555
2557
 
2556
2558
  <p>Sets the consumed version of o at l to v. </p>
2557
2559
 
2558
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00795">795</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2559
- <div class="fragment"><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160;{</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adf37ae1f6a07716bca6fbe1603b8a070">setVersion</a>(l, o, v, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>);</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a2e4e6a84cbfd553ad9cca8fdf9fd4a8d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">SVF::VersionedFlowSensitive::consume</a></div><div class="ttdeci">LocVersionMap consume</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00185">VersionedFlowSensitive.h:185</a></div></div>
2560
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_adf37ae1f6a07716bca6fbe1603b8a070"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#adf37ae1f6a07716bca6fbe1603b8a070">SVF::VersionedFlowSensitive::setVersion</a></div><div class="ttdeci">void setVersion(const NodeID l, const NodeID o, const Version v, LocVersionMap &amp;lvm)</div><div class="ttdoc">Shared code for setConsume and setYield. They wrap this function. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00789">VersionedFlowSensitive.cpp:789</a></div></div>
2560
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00821">821</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2561
+ <div class="fragment"><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160;{</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adf37ae1f6a07716bca6fbe1603b8a070">setVersion</a>(l, o, v, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>);</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a2e4e6a84cbfd553ad9cca8fdf9fd4a8d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">SVF::VersionedFlowSensitive::consume</a></div><div class="ttdeci">LocVersionMap consume</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00185">VersionedFlowSensitive.h:185</a></div></div>
2562
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_adf37ae1f6a07716bca6fbe1603b8a070"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#adf37ae1f6a07716bca6fbe1603b8a070">SVF::VersionedFlowSensitive::setVersion</a></div><div class="ttdeci">void setVersion(const NodeID l, const NodeID o, const Version v, LocVersionMap &amp;lvm)</div><div class="ttdoc">Shared code for setConsume and setYield. They wrap this function. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00815">VersionedFlowSensitive.cpp:815</a></div></div>
2561
2563
  </div><!-- fragment -->
2562
2564
  </div>
2563
2565
  </div>
@@ -2609,8 +2611,8 @@ Additional Inherited Members</h2></td></tr>
2609
2611
 
2610
2612
  <p>Shared code for setConsume and setYield. They wrap this function. </p>
2611
2613
 
2612
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00789">789</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2613
- <div class="fragment"><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160;{</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af9a43f48b7d99cc6694f3ae3248fd8e0">ObjToVersionMap</a> &amp;ovm = lvm[l];</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160; ovm[o] = v;</div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af9a43f48b7d99cc6694f3ae3248fd8e0"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af9a43f48b7d99cc6694f3ae3248fd8e0">SVF::VersionedFlowSensitive::ObjToVersionMap</a></div><div class="ttdeci">Map&lt; NodeID, Version &gt; ObjToVersionMap</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00036">VersionedFlowSensitive.h:36</a></div></div>
2614
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00815">815</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2615
+ <div class="fragment"><div class="line"><a name="l00816"></a><span class="lineno"> 816</span>&#160;{</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af9a43f48b7d99cc6694f3ae3248fd8e0">ObjToVersionMap</a> &amp;ovm = lvm[l];</div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; ovm[o] = v;</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af9a43f48b7d99cc6694f3ae3248fd8e0"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af9a43f48b7d99cc6694f3ae3248fd8e0">SVF::VersionedFlowSensitive::ObjToVersionMap</a></div><div class="ttdeci">Map&lt; NodeID, Version &gt; ObjToVersionMap</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00036">VersionedFlowSensitive.h:36</a></div></div>
2614
2616
  </div><!-- fragment -->
2615
2617
  </div>
2616
2618
  </div>
@@ -2656,11 +2658,11 @@ Additional Inherited Members</h2></td></tr>
2656
2658
 
2657
2659
  <p>Sets the yielded version of o at l to v. </p>
2658
2660
 
2659
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00800">800</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2660
- <div class="fragment"><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>&#160;{</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; <span class="comment">// Non-store: consume == yield.</span></div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(l)) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adf37ae1f6a07716bca6fbe1603b8a070">setVersion</a>(l, o, v, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">yield</a>);</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; <span class="keywordflow">else</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adf37ae1f6a07716bca6fbe1603b8a070">setVersion</a>(l, o, v, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>);</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aac920c9a5f13dd147e3c130425e005eb"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">SVF::VersionedFlowSensitive::isStore</a></div><div class="ttdeci">virtual bool isStore(const NodeID l) const</div><div class="ttdoc">Returns true if l is a store node. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00429">VersionedFlowSensitive.cpp:429</a></div></div>
2661
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00826">826</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2662
+ <div class="fragment"><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160;{</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="comment">// Non-store: consume == yield.</span></div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">isStore</a>(l)) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adf37ae1f6a07716bca6fbe1603b8a070">setVersion</a>(l, o, v, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">yield</a>);</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; <span class="keywordflow">else</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adf37ae1f6a07716bca6fbe1603b8a070">setVersion</a>(l, o, v, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>);</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160;}</div><div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aac920c9a5f13dd147e3c130425e005eb"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aac920c9a5f13dd147e3c130425e005eb">SVF::VersionedFlowSensitive::isStore</a></div><div class="ttdeci">virtual bool isStore(const NodeID l) const</div><div class="ttdoc">Returns true if l is a store node. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00455">VersionedFlowSensitive.cpp:455</a></div></div>
2661
2663
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a2e4e6a84cbfd553ad9cca8fdf9fd4a8d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">SVF::VersionedFlowSensitive::consume</a></div><div class="ttdeci">LocVersionMap consume</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00185">VersionedFlowSensitive.h:185</a></div></div>
2662
2664
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a16224ee60494bb1fdf1c8a1026fbe7ab"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">SVF::VersionedFlowSensitive::yield</a></div><div class="ttdeci">LocVersionMap yield</div><div class="ttdoc">Actual yield map. Yield analogue to consume. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00187">VersionedFlowSensitive.h:187</a></div></div>
2663
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_adf37ae1f6a07716bca6fbe1603b8a070"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#adf37ae1f6a07716bca6fbe1603b8a070">SVF::VersionedFlowSensitive::setVersion</a></div><div class="ttdeci">void setVersion(const NodeID l, const NodeID o, const Version v, LocVersionMap &amp;lvm)</div><div class="ttdoc">Shared code for setConsume and setYield. They wrap this function. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00789">VersionedFlowSensitive.cpp:789</a></div></div>
2665
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_adf37ae1f6a07716bca6fbe1603b8a070"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#adf37ae1f6a07716bca6fbe1603b8a070">SVF::VersionedFlowSensitive::setVersion</a></div><div class="ttdeci">void setVersion(const NodeID l, const NodeID o, const Version v, LocVersionMap &amp;lvm)</div><div class="ttdoc">Shared code for setConsume and setYield. They wrap this function. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00815">VersionedFlowSensitive.cpp:815</a></div></div>
2664
2666
  </div><!-- fragment -->
2665
2667
  </div>
2666
2668
  </div>
@@ -2696,22 +2698,22 @@ Additional Inherited Members</h2></td></tr>
2696
2698
 
2697
2699
  <p>Reimplemented from <a class="el" href="classSVF_1_1FlowSensitive.html#a1886b4964efa92cfff761493d12768b8">SVF::FlowSensitive</a>.</p>
2698
2700
 
2699
- <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00579">579</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2700
- <div class="fragment"><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160;{</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : newEdges)</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; {</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *dstNode = e-&gt;getDstNode();</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = e-&gt;getSrcNode()-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = dstNode-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160;</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;PHISVFGNode&gt;(dstNode)</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; || SVFUtil::isa&lt;FormalParmSVFGNode&gt;(dstNode)</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; || SVFUtil::isa&lt;ActualRetSVFGNode&gt;(dstNode))</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; {</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(dst);</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; }</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; {</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a> *ie = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>&gt;(e);</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; assert(ie != <span class="keyword">nullptr</span> &amp;&amp; <span class="stringliteral">&quot;VFS::updateConnectedNodes: given direct edge?&quot;</span>);</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160;</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; assert(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a9f9b00551c157f42d1d995e8c4efb54b">delta</a>(dst) &amp;&amp; <span class="stringliteral">&quot;VFS::updateConnectedNodes: new edges should be to delta nodes!&quot;</span>);</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; assert(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3fa5afa4f54e0828ec090fde07b1bfa2">deltaSource</a>(src) &amp;&amp; <span class="stringliteral">&quot;VFS::updateConnectedNodes: new indirect edges should be from delta source nodes!&quot;</span>);</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160;</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &amp;ept = ie-&gt;<a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>();</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; <span class="comment">// For every o, such that src --o--&gt; dst, we need to set up reliance (and propagate).</span></div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : ept)</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; {</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> srcY = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a01a199e9fdb5759c7f78ee344dbc413c">getYield</a>(src, o);</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <span class="keywordflow">if</span> (srcY == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> dstC = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af93e65faae99459621ae45cf9d36005d">getConsume</a>(dst, o);</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; <span class="keywordflow">if</span> (dstC == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160;</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; std::vector&lt;Version&gt; &amp;versionsRelyingOnSrcY = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ae83c62a01196991d116ef5c36cb51e31">getReliantVersions</a>(o, srcY);</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; <span class="keywordflow">if</span> (std::find(versionsRelyingOnSrcY.begin(), versionsRelyingOnSrcY.end(), dstC) == versionsRelyingOnSrcY.end())</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; {</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; versionsRelyingOnSrcY.push_back(dstC);</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(o, srcY, dstC);</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; }</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; }</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; }</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; }</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160;}</div><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#l00160">WPASolver.h:160</a></div></div>
2701
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a7a98162b69de90f80ce853a6ff43af56"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">SVF::VersionedFlowSensitive::propagateVersion</a></div><div class="ttdeci">void propagateVersion(NodeID o, Version v)</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00520">VersionedFlowSensitive.cpp:520</a></div></div>
2701
+ <p class="definition">Definition at line <a class="el" href="VersionedFlowSensitive_8cpp_source.html#l00605">605</a> of file <a class="el" href="VersionedFlowSensitive_8cpp_source.html">VersionedFlowSensitive.cpp</a>.</p>
2702
+ <div class="fragment"><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160;{</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : newEdges)</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; {</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *dstNode = e-&gt;getDstNode();</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = e-&gt;getSrcNode()-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = dstNode-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160;</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;PHISVFGNode&gt;(dstNode)</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; || SVFUtil::isa&lt;FormalParmSVFGNode&gt;(dstNode)</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; || SVFUtil::isa&lt;ActualRetSVFGNode&gt;(dstNode))</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; {</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(dst);</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; }</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; {</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a> *ie = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>&gt;(e);</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; assert(ie != <span class="keyword">nullptr</span> &amp;&amp; <span class="stringliteral">&quot;VFS::updateConnectedNodes: given direct edge?&quot;</span>);</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160;</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; assert(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a9f9b00551c157f42d1d995e8c4efb54b">delta</a>(dst) &amp;&amp; <span class="stringliteral">&quot;VFS::updateConnectedNodes: new edges should be to delta nodes!&quot;</span>);</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; assert(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3fa5afa4f54e0828ec090fde07b1bfa2">deltaSource</a>(src) &amp;&amp; <span class="stringliteral">&quot;VFS::updateConnectedNodes: new indirect edges should be from delta source nodes!&quot;</span>);</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160;</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &amp;ept = ie-&gt;<a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>();</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; <span class="comment">// For every o, such that src --o--&gt; dst, we need to set up reliance (and propagate).</span></div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : ept)</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; {</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> srcY = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a01a199e9fdb5759c7f78ee344dbc413c">getYield</a>(src, o);</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <span class="keywordflow">if</span> (srcY == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> dstC = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af93e65faae99459621ae45cf9d36005d">getConsume</a>(dst, o);</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <span class="keywordflow">if</span> (dstC == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160;</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; std::vector&lt;Version&gt; &amp;versionsRelyingOnSrcY = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ae83c62a01196991d116ef5c36cb51e31">getReliantVersions</a>(o, srcY);</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; <span class="keywordflow">if</span> (std::find(versionsRelyingOnSrcY.begin(), versionsRelyingOnSrcY.end(), dstC) == versionsRelyingOnSrcY.end())</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; {</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160; versionsRelyingOnSrcY.push_back(dstC);</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160; <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(o, srcY, dstC);</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; }</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; }</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; }</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; }</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160;}</div><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#l00160">WPASolver.h:160</a></div></div>
2703
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a7a98162b69de90f80ce853a6ff43af56"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">SVF::VersionedFlowSensitive::propagateVersion</a></div><div class="ttdeci">void propagateVersion(NodeID o, Version v)</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00546">VersionedFlowSensitive.cpp:546</a></div></div>
2702
2704
  <div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00019">MTAResultValidator.h:19</a></div></div>
2703
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a9f9b00551c157f42d1d995e8c4efb54b"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a9f9b00551c157f42d1d995e8c4efb54b">SVF::VersionedFlowSensitive::delta</a></div><div class="ttdeci">virtual bool delta(const NodeID l) const</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00406">VersionedFlowSensitive.cpp:406</a></div></div>
2705
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a9f9b00551c157f42d1d995e8c4efb54b"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a9f9b00551c157f42d1d995e8c4efb54b">SVF::VersionedFlowSensitive::delta</a></div><div class="ttdeci">virtual bool delta(const NodeID l) const</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00432">VersionedFlowSensitive.cpp:432</a></div></div>
2704
2706
  <div class="ttc" id="namespaceSVF_html_a9ec7a8dc63411ee3724a25a59191be0c"><div class="ttname"><a href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">SVF::Version</a></div><div class="ttdeci">unsigned Version</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00133">SVFBasicTypes.h:133</a></div></div>
2705
2707
  <div class="ttc" id="classSVF_1_1VFGEdge_html"><div class="ttname"><a href="classSVF_1_1VFGEdge.html">SVF::VFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGEdge_8h_source.html#l00044">VFGEdge.h:44</a></div></div>
2706
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a01a199e9fdb5759c7f78ee344dbc413c"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a01a199e9fdb5759c7f78ee344dbc413c">SVF::VersionedFlowSensitive::getYield</a></div><div class="ttdeci">Version getYield(const NodeID l, const NodeID o) const</div><div class="ttdoc">Returns the yielded version of o at l. If no such version exists, returns invalidVersion. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00782">VersionedFlowSensitive.cpp:782</a></div></div>
2707
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3fa5afa4f54e0828ec090fde07b1bfa2"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3fa5afa4f54e0828ec090fde07b1bfa2">SVF::VersionedFlowSensitive::deltaSource</a></div><div class="ttdeci">virtual bool deltaSource(const NodeID l) const</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00412">VersionedFlowSensitive.cpp:412</a></div></div>
2708
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a01a199e9fdb5759c7f78ee344dbc413c"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a01a199e9fdb5759c7f78ee344dbc413c">SVF::VersionedFlowSensitive::getYield</a></div><div class="ttdeci">Version getYield(const NodeID l, const NodeID o) const</div><div class="ttdoc">Returns the yielded version of o at l. If no such version exists, returns invalidVersion. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00808">VersionedFlowSensitive.cpp:808</a></div></div>
2709
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3fa5afa4f54e0828ec090fde07b1bfa2"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3fa5afa4f54e0828ec090fde07b1bfa2">SVF::VersionedFlowSensitive::deltaSource</a></div><div class="ttdeci">virtual bool deltaSource(const NodeID l) const</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00438">VersionedFlowSensitive.cpp:438</a></div></div>
2708
2710
  <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3d44a343a2e3f5d276fd1b069c92e112"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">SVF::VersionedFlowSensitive::invalidVersion</a></div><div class="ttdeci">static const Version invalidVersion</div><div class="ttdoc">If this version appears, there has been an error. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00044">VersionedFlowSensitive.h:44</a></div></div>
2709
2711
  <div class="ttc" id="classSVF_1_1SparseBitVector_html"><div class="ttname"><a href="classSVF_1_1SparseBitVector.html">SVF::SparseBitVector</a></div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l00460">SparseBitVector.h:460</a></div></div>
2710
2712
  <div class="ttc" id="classSVF_1_1GenericNode_html_ac3e55ef37aefb411ea4c87b1aa3b1895"><div class="ttname"><a href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">SVF::GenericNode::getId</a></div><div class="ttdeci">NodeID getId() const</div><div class="ttdoc">Get ID. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00169">GenericGraph.h:169</a></div></div>
2711
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af93e65faae99459621ae45cf9d36005d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af93e65faae99459621ae45cf9d36005d">SVF::VersionedFlowSensitive::getConsume</a></div><div class="ttdeci">Version getConsume(const NodeID l, const NodeID o) const</div><div class="ttdoc">Returns the consumed version of o at l. If no such version exists, returns invalidVersion. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00777">VersionedFlowSensitive.cpp:777</a></div></div>
2713
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af93e65faae99459621ae45cf9d36005d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af93e65faae99459621ae45cf9d36005d">SVF::VersionedFlowSensitive::getConsume</a></div><div class="ttdeci">Version getConsume(const NodeID l, const NodeID o) const</div><div class="ttdoc">Returns the consumed version of o at l. If no such version exists, returns invalidVersion. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00803">VersionedFlowSensitive.cpp:803</a></div></div>
2712
2714
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a8182be247907420db00837cef9bcfa70"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if&lt;!is_simple_type&lt; Y &gt;::value, typename cast_retty&lt; X, const Y &gt;::ret_type &gt;::type dyn_cast(const Y &amp;Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00343">Casting.h:343</a></div></div>
2713
2715
  <div class="ttc" id="classSVF_1_1IndirectSVFGEdge_html"><div class="ttname"><a href="classSVF_1_1IndirectSVFGEdge.html">SVF::IndirectSVFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFGEdge_8h_source.html#l00042">SVFGEdge.h:42</a></div></div>
2714
- <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ae83c62a01196991d116ef5c36cb51e31"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ae83c62a01196991d116ef5c36cb51e31">SVF::VersionedFlowSensitive::getReliantVersions</a></div><div class="ttdeci">std::vector&lt; Version &gt; &amp; getReliantVersions(const NodeID o, const Version v)</div><div class="ttdoc">Returns the versions of o which rely on o:v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00807">VersionedFlowSensitive.cpp:807</a></div></div>
2716
+ <div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ae83c62a01196991d116ef5c36cb51e31"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ae83c62a01196991d116ef5c36cb51e31">SVF::VersionedFlowSensitive::getReliantVersions</a></div><div class="ttdeci">std::vector&lt; Version &gt; &amp; getReliantVersions(const NodeID o, const Version v)</div><div class="ttdoc">Returns the versions of o which rely on o:v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00833">VersionedFlowSensitive.cpp:833</a></div></div>
2715
2717
  <div class="ttc" id="classSVF_1_1IndirectSVFGEdge_html_a30aca718d25924f1babdf348bb0ace71"><div class="ttname"><a href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">SVF::IndirectSVFGEdge::getPointsTo</a></div><div class="ttdeci">const NodeBS &amp; getPointsTo() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFGEdge_8h_source.html#l00060">SVFGEdge.h:60</a></div></div>
2716
2718
  <div class="ttc" id="classSVF_1_1VFGNode_html"><div class="ttname"><a href="classSVF_1_1VFGNode.html">SVF::VFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00046">VFGNode.h:46</a></div></div>
2717
2719
  </div><!-- fragment -->