svf-tools 1.0.295 → 1.0.296

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 (65) hide show
  1. package/CMakeLists.txt +1 -1
  2. package/Dockerfile +1 -1
  3. package/SVF-doxygen/html/html/BasicTypes_8h_source.html +2 -2
  4. package/SVF-doxygen/html/html/CHG_8cpp_source.html +1 -1
  5. package/SVF-doxygen/html/html/ConsG_8cpp_source.html +1 -1
  6. package/SVF-doxygen/html/html/DCHG_8h_source.html +1 -1
  7. package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +1 -1
  8. package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +1 -1
  9. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +1 -1
  10. package/SVF-doxygen/html/html/Graph2Json_8cpp_source.html +1 -1
  11. package/SVF-doxygen/html/html/GraphPrinter_8h.html +1 -0
  12. package/SVF-doxygen/html/html/GraphPrinter_8h_source.html +5 -5
  13. package/SVF-doxygen/html/html/ICFG_8cpp_source.html +1 -1
  14. package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +1 -1
  15. package/SVF-doxygen/html/html/MutablePointsToDS_8h_source.html +1 -1
  16. package/SVF-doxygen/html/html/OfflineConsG_8cpp_source.html +1 -1
  17. package/SVF-doxygen/html/html/PAG_8cpp_source.html +1 -1
  18. package/SVF-doxygen/html/html/PTACallGraph_8cpp_source.html +1 -1
  19. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +1 -1
  20. package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +1 -1
  21. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +1 -1
  22. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +1 -1
  23. package/SVF-doxygen/html/html/TCT_8cpp_source.html +1 -1
  24. package/SVF-doxygen/html/html/TypeBasedHeapCloning_8cpp_source.html +1 -1
  25. package/SVF-doxygen/html/html/VFG_8cpp_source.html +1 -1
  26. package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +1 -1
  27. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +2 -2
  28. package/SVF-doxygen/html/html/classSVF_1_1CHGraph.html +1 -1
  29. package/SVF-doxygen/html/html/classSVF_1_1CallSite.html +1 -1
  30. package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +1 -1
  31. package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +1 -1
  32. package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +1 -1
  33. package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +1 -1
  34. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +1 -1
  35. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +1 -1
  36. package/SVF-doxygen/html/html/classSVF_1_1ICFG.html +1 -1
  37. package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter.html +1 -1
  38. package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +1 -1
  39. package/SVF-doxygen/html/html/classSVF_1_1MutableDFPTData.html +1 -1
  40. package/SVF-doxygen/html/html/classSVF_1_1OfflineConsG.html +1 -1
  41. package/SVF-doxygen/html/html/classSVF_1_1PAG.html +1 -1
  42. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraph.html +1 -1
  43. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +2 -2
  44. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +1 -1
  45. package/SVF-doxygen/html/html/classSVF_1_1TCT.html +1 -1
  46. package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +1 -1
  47. package/SVF-doxygen/html/html/classSVF_1_1VFG.html +1 -1
  48. package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +1 -1
  49. package/SVF-doxygen/html/html/classllvm_1_1GraphPrinter.html +7 -7
  50. package/build.sh +6 -3
  51. package/include/Graphs/GraphPrinter.h +2 -1
  52. package/include/MemoryModel/MutablePointsToDS.h +1 -1
  53. package/include/MemoryModel/PointerAnalysisImpl.h +4 -4
  54. package/include/Util/BasicTypes.h +1 -1
  55. package/lib/DDA/DDAPass.cpp +1 -1
  56. package/lib/MemoryModel/PointerAnalysis.cpp +7 -7
  57. package/lib/MemoryModel/PointerAnalysisImpl.cpp +3 -3
  58. package/lib/SVF-FE/Graph2Json.cpp +1 -1
  59. package/lib/SVF-FE/LLVMModule.cpp +1 -1
  60. package/lib/Util/TypeBasedHeapCloning.cpp +6 -6
  61. package/lib/WPA/FlowSensitive.cpp +2 -2
  62. package/lib/WPA/FlowSensitiveTBHC.cpp +2 -2
  63. package/lib/WPA/WPAPass.cpp +7 -7
  64. package/package.json +1 -1
  65. package/setup.sh +1 -1
@@ -66,7 +66,7 @@ $(function() {
66
66
  <div class="title">Graph2Json.cpp</div> </div>
67
67
  </div><!--header-->
68
68
  <div class="contents">
69
- <a href="Graph2Json_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="preprocessor">#include &quot;llvm/Support/JSON.h&quot;</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Graph2Json_8h.html">SVF-FE/Graph2Json.h</a>&quot;</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#include &lt;fstream&gt;</span> <span class="comment">// for ICFGBuilderFromFile</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span> <span class="comment">// for ICFGBuilderFromFile</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="preprocessor">#include &lt;sstream&gt;</span> <span class="comment">// for ICFGBuilderFromFile</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacestd.html">std</a>;</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno"><a class="line" href="classSVF_1_1ICFGPrinter.html#ab51ba2c92e69d3688b0a185b4b1d69cb"> 13</a></span>&#160;ICFGPrinter::ICFGPrinter() {}</div><div class="line"><a name="l00014"></a><span class="lineno"><a class="line" href="classSVF_1_1ICFGPrinter.html#a5ef3cd8fa4c2dd99289725f1aa781721"> 14</a></span>&#160;<span class="keywordtype">void</span> ICFGPrinter::printICFGToJson(<span class="keyword">const</span> std::string&amp; filename)</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;{</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;write symbols to &#39;&quot;</span> &lt;&lt; filename &lt;&lt; <span class="stringliteral">&quot;&#39;...&quot;</span>;</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; std::error_code err;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; <a class="code" href="namespaceSVF.html#acde6a1d496f1b655088ccbe023820277">ToolOutputFile</a> F(filename.c_str(), err, llvm::sys::fs::F_None);</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; <span class="keywordflow">if</span> (err)</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; {</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot; error opening file for writing!\n&quot;</span>;</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; F.os().clear_error();</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; }</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; llvm::json::Array root_array;</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keywordflow">for</span>(<a class="code" href="classSVF_1_1ICFG.html#a498f84068ef643a94970aeb171607e31">ICFG::iterator</a> it = begin(), eit = end(); it!=eit; ++it)</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; {</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; <a class="code" href="classSVF_1_1ICFGNode.html">ICFGNode</a>* node = it-&gt;second;</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <span class="keywordtype">id</span> = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; llvm::json::Object ICFGNode_Obj;</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;ICFG_ID&quot;</span>] = id;</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Node Type&quot;</span>] = getICFGKind(node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#a391e996d695b114530120723da1d003e">getNodeKind</a>());</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1IntraBlockNode.html">IntraBlockNode</a>* bNode = SVFUtil::dyn_cast&lt;IntraBlockNode&gt;(node))</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; {</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Source Location&quot;</span>] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(bNode-&gt;getInst());</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <a class="code" href="classSVF_1_1PAG.html#a3b70f1f3b785d735243962e83e210652">PAG::PAGEdgeList</a>&amp; edges = PAG::getPAG()-&gt;getInstPTAPAGEdgeList(bNode);</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; llvm::json::Array PAGEdge_array;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="comment">//dump pag edges</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keywordflow">for</span> (PAG::PAGEdgeList::iterator it = edges.begin(),</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; eit = edges.end(); it != eit; ++it)</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; {</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGEdge.html">PAGEdge</a>* edge = *it;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; llvm::json::Object edge_obj;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; edge_obj[<span class="stringliteral">&quot;Source Node&quot;</span>] = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; edge_obj[<span class="stringliteral">&quot;Destination Node&quot;</span>] = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; edge_obj[<span class="stringliteral">&quot;Source Type&quot;</span>] = getPAGNodeKindValue(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()-&gt;getNodeKind());</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; edge_obj[<span class="stringliteral">&quot;Destination Type&quot;</span>] = getPAGNodeKindValue(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()-&gt;getNodeKind());</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; edge_obj[<span class="stringliteral">&quot;Edge Type&quot;</span>] = getPAGEdgeKindValue(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#abe8525c542def8162b094c169a01993b">getEdgeKind</a>());</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; edge_obj[<span class="stringliteral">&quot;srcValueName&quot;</span>] = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()-&gt;getValueName();</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; edge_obj[<span class="stringliteral">&quot;dstValueName&quot;</span>] = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()-&gt;getValueName();</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keywordflow">if</span>(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#abe8525c542def8162b094c169a01993b">getEdgeKind</a>()==PAGEdge::NormalGep)</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; {</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1NormalGepPE.html">NormalGepPE</a>* gepEdge = SVFUtil::cast&lt;NormalGepPE&gt;(edge);</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; edge_obj[<span class="stringliteral">&quot;offset&quot;</span>] = gepEdge-&gt;<a class="code" href="classSVF_1_1NormalGepPE.html#a38ac1dd06ada0a04e13a038f8b69e3e5">getOffset</a>();</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; }</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::json::Value</a> edge_value = llvm::json::Object{edge_obj};</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; PAGEdge_array.push_back(edge_value);</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; }</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::json::Value</a> PagEdge_value = llvm::json::Array{PAGEdge_array};</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;PAG Edges&quot;</span>] = PagEdge_value;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; }</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1FunEntryBlockNode.html">FunEntryBlockNode</a>* <a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a> = SVFUtil::dyn_cast&lt;FunEntryBlockNode&gt;(node))</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; {</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">isExtCall</a>(<a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a>-&gt;getFun()))</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;isExtCall&quot;</span>] = <span class="keyword">true</span>;</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; {</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;isExtCall&quot;</span>] = <span class="keyword">false</span>;</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Source Location&quot;</span>] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(<a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a>-&gt;getFun()-&gt;getLLVMFun());</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; }</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Function Name&quot;</span>] = <a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a>-&gt;getFun()-&gt;getName();</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; }</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FunExitBlockNode.html">FunExitBlockNode</a>* <a class="code" href="util_8h.html#a43b6ea6be735bb828bc062c70cadeff8">exit</a> = SVFUtil::dyn_cast&lt;FunExitBlockNode&gt;(node))</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; {</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">isExtCall</a>(<a class="code" href="util_8h.html#a43b6ea6be735bb828bc062c70cadeff8">exit</a>-&gt;getFun()))</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;isExtCall&quot;</span>] = <span class="keyword">true</span>;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; {</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;isExtCall&quot;</span>] = <span class="keyword">false</span>;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Source Location&quot;</span>] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(&amp;(<a class="code" href="util_8h.html#a43b6ea6be735bb828bc062c70cadeff8">exit</a>-&gt;getFun()-&gt;getLLVMFun()-&gt;back()));</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; }</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Function Name&quot;</span>] = <a class="code" href="util_8h.html#a43b6ea6be735bb828bc062c70cadeff8">exit</a>-&gt;getFun()-&gt;getName();</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; }</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* call = SVFUtil::dyn_cast&lt;CallBlockNode&gt;(node))</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; {</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Source Location&quot;</span>] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(call-&gt;getCallSite());</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; }</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1RetBlockNode.html">RetBlockNode</a>* ret = SVFUtil::dyn_cast&lt;RetBlockNode&gt;(node))</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; {</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Source Location&quot;</span>] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(ret-&gt;getCallSite());</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; }</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;what else kinds of nodes do we have??&quot;</span>);</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; llvm::json::Array ICFGEdges_array;</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keywordflow">for</span>(<a class="code" href="classSVF_1_1ICFGNode.html#a5a148eccec266a67e4ff5364d7268fff">ICFGNode::iterator</a> sit = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(), esit = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); sit!=esit; ++sit)</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; {</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <a class="code" href="classSVF_1_1ICFGEdge.html">ICFGEdge</a>* edge = *sit;</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; llvm::json::Object ICFGEdge_obj;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;CallCFGEdge&gt;(edge))</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; {</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <a class="code" href="classSVF_1_1CallCFGEdge.html">CallCFGEdge</a>* call = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1CallCFGEdge.html">CallCFGEdge</a>&gt;(edge);</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFG Edge Type&quot;</span>] = <span class="stringliteral">&quot;CallCFGEdge&quot;</span>;</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFGEdgeSrcID&quot;</span>] = call-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFGEdgeDstID&quot;</span>] = call-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; }</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;RetCFGEdge&gt;(edge))</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; {</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <a class="code" href="classSVF_1_1RetCFGEdge.html">RetCFGEdge</a>* call = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1RetCFGEdge.html">RetCFGEdge</a>&gt;(edge);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFG Edge Type&quot;</span>] = <span class="stringliteral">&quot;RetCFGEdge&quot;</span>;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFGEdgeSrcID&quot;</span>] = call-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFGEdgeDstID&quot;</span>] = call-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; }</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa&lt;IntraCFGEdge&gt;(edge))</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; {</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <a class="code" href="classSVF_1_1IntraCFGEdge.html">IntraCFGEdge</a>* intraCFGEdge = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1IntraCFGEdge.html">IntraCFGEdge</a>&gt;(edge);</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFG Edge Type&quot;</span>] = <span class="stringliteral">&quot;IntraCFGEdge&quot;</span>;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFGEdgeSrcID&quot;</span>] = intraCFGEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFGEdgeDstID&quot;</span>] = intraCFGEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; }</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::json::Value</a> ICFGEdge_Val = llvm::json::Object{ICFGEdge_obj};</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; ICFGEdges_array.push_back(ICFGEdge_Val);</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; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::json::Value</a> ICFGEdges_val = llvm::json::Array{ICFGEdges_array};</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;ICFGEdges&quot;</span>] = ICFGEdges_val;</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::json::Value</a> ICFGNode_val = llvm::json::Object{ICFGNode_Obj};</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; root_array.push_back(ICFGNode_val);</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; }</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::json::Value</a> root_value = llvm::json::Array{root_array};</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <a class="code" href="namespaceSVF.html#ac5a03512613828c2fab8930f38c2d485">llvm::json::operator&lt;&lt;</a>(F.os(),root_value);</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; F.os().close();</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordflow">if</span> (!F.os().has_error())</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; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; F.keep();</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; }</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;</div><div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="classSVF_1_1ICFGPrinter.html#a2c022308f9c7ae3bf33d9482fcb51e03"> 143</a></span>&#160;std::string ICFGPrinter::getICFGKind(<span class="keyword">const</span> <span class="keywordtype">int</span> kind)</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;{</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">switch</span>(kind)</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; <span class="keywordflow">case</span> ICFGNode::IntraBlock:</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;IntraBlock&quot;</span>;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordflow">case</span> ICFGNode::FunEntryBlock:</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;FunEntryBlock&quot;</span>;</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="keywordflow">case</span> ICFGNode::FunExitBlock:</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;FunExitBlock&quot;</span>;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordflow">case</span> ICFGNode::FunCallBlock:</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;FunCallBlock&quot;</span>;</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keywordflow">case</span> ICFGNode::FunRetBlock:</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;FunRetBlock&quot;</span>;</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="keywordflow">default</span>:</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</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; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160;}</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno"><a class="line" href="classSVF_1_1ICFGPrinter.html#a54f0729c869b5061b5fb9fe056c326ef"> 168</a></span>&#160;std::string ICFGPrinter::getPAGNodeKindValue(<span class="keywordtype">int</span> kind)</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;{</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="keywordflow">switch</span> (kind)</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; <span class="keywordflow">case</span> (PAGNode::ValNode):</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;ValNode&quot;</span>;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">case</span> PAGNode::ObjNode:</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;ObjNode&quot;</span>;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keywordflow">case</span> PAGNode::RetNode:</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;RetNode&quot;</span>;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="keywordflow">case</span> PAGNode::VarargNode:</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;VarargNode&quot;</span>;</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="keywordflow">case</span> PAGNode::GepValNode:</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;GepValNode&quot;</span>;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keywordflow">case</span> PAGNode::GepObjNode:</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;GepObjNode&quot;</span>;</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keywordflow">case</span> PAGNode::FIObjNode:</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;FIObjNode&quot;</span>;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keywordflow">case</span> PAGNode::DummyValNode:</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;DummyValNode&quot;</span>;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <span class="keywordflow">case</span> PAGNode::DummyObjNode:</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;DummyObjNode&quot;</span>;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keywordflow">break</span>;</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; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160;}</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160;</div><div class="line"><a name="l00203"></a><span class="lineno"><a class="line" href="classSVF_1_1ICFGPrinter.html#a38aa67e172459a72d8fc92a6172903be"> 203</a></span>&#160;std::string ICFGPrinter::getPAGEdgeKindValue(<span class="keywordtype">int</span> kind)</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">switch</span>(kind)</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">case</span> (PAGEdge::Addr):</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Addr&quot;</span>;</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keywordflow">case</span> (PAGEdge::Copy):</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Copy&quot;</span>;</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <span class="keywordflow">case</span> (PAGEdge::Store):</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Store&quot;</span>;</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="keywordflow">case</span> (PAGEdge::Load):</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Load&quot;</span>;</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="keywordflow">case</span> (PAGEdge::Call):</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Call&quot;</span>;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordflow">case</span> (PAGEdge::Ret):</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Ret&quot;</span>;</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="keywordflow">case</span> (PAGEdge::NormalGep):</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;NormalGep&quot;</span>;</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keywordflow">case</span> (PAGEdge::VariantGep):</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;VariantGep&quot;</span>;</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keywordflow">case</span> (PAGEdge::ThreadFork):</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;ThreadFork&quot;</span>;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keywordflow">case</span> (PAGEdge::ThreadJoin):</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;ThreadJoin&quot;</span>;</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordflow">case</span> (PAGEdge::Cmp):</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Cmp&quot;</span>;</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <span class="keywordflow">case</span> (PAGEdge::BinaryOp):</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;BinaryOp&quot;</span>;</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordflow">case</span> (PAGEdge::UnaryOp):</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;UnaryOp&quot;</span>;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="keywordflow">break</span>;</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; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160;}</div><div class="ttc" id="classSVF_1_1ICFGEdge_html"><div class="ttname"><a href="classSVF_1_1ICFGEdge.html">SVF::ICFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="ICFGEdge_8h_source.html#l00042">ICFGEdge.h:42</a></div></div>
69
+ <a href="Graph2Json_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="preprocessor">#include &quot;llvm/Support/JSON.h&quot;</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Graph2Json_8h.html">SVF-FE/Graph2Json.h</a>&quot;</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;</div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#include &lt;fstream&gt;</span> <span class="comment">// for ICFGBuilderFromFile</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="preprocessor">#include &lt;string&gt;</span> <span class="comment">// for ICFGBuilderFromFile</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="preprocessor">#include &lt;sstream&gt;</span> <span class="comment">// for ICFGBuilderFromFile</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacestd.html">std</a>;</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno"><a class="line" href="classSVF_1_1ICFGPrinter.html#ab51ba2c92e69d3688b0a185b4b1d69cb"> 13</a></span>&#160;ICFGPrinter::ICFGPrinter() {}</div><div class="line"><a name="l00014"></a><span class="lineno"><a class="line" href="classSVF_1_1ICFGPrinter.html#a5ef3cd8fa4c2dd99289725f1aa781721"> 14</a></span>&#160;<span class="keywordtype">void</span> ICFGPrinter::printICFGToJson(<span class="keyword">const</span> std::string&amp; filename)</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;{</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;write symbols to &#39;&quot;</span> &lt;&lt; filename &lt;&lt; <span class="stringliteral">&quot;&#39;...&quot;</span>;</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; std::error_code err;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; <a class="code" href="namespaceSVF.html#acde6a1d496f1b655088ccbe023820277">ToolOutputFile</a> F(filename.c_str(), err, llvm::sys::fs::OF_None);</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; <span class="keywordflow">if</span> (err)</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; {</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot; error opening file for writing!\n&quot;</span>;</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; F.os().clear_error();</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; }</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; llvm::json::Array root_array;</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keywordflow">for</span>(<a class="code" href="classSVF_1_1ICFG.html#a498f84068ef643a94970aeb171607e31">ICFG::iterator</a> it = begin(), eit = end(); it!=eit; ++it)</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; {</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; <a class="code" href="classSVF_1_1ICFGNode.html">ICFGNode</a>* node = it-&gt;second;</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <span class="keywordtype">id</span> = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; llvm::json::Object ICFGNode_Obj;</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;ICFG_ID&quot;</span>] = id;</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Node Type&quot;</span>] = getICFGKind(node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#a391e996d695b114530120723da1d003e">getNodeKind</a>());</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1IntraBlockNode.html">IntraBlockNode</a>* bNode = SVFUtil::dyn_cast&lt;IntraBlockNode&gt;(node))</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; {</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Source Location&quot;</span>] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(bNode-&gt;getInst());</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <a class="code" href="classSVF_1_1PAG.html#a3b70f1f3b785d735243962e83e210652">PAG::PAGEdgeList</a>&amp; edges = PAG::getPAG()-&gt;getInstPTAPAGEdgeList(bNode);</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; llvm::json::Array PAGEdge_array;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; <span class="comment">//dump pag edges</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keywordflow">for</span> (PAG::PAGEdgeList::iterator it = edges.begin(),</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; eit = edges.end(); it != eit; ++it)</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; {</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGEdge.html">PAGEdge</a>* edge = *it;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; llvm::json::Object edge_obj;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; edge_obj[<span class="stringliteral">&quot;Source Node&quot;</span>] = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; edge_obj[<span class="stringliteral">&quot;Destination Node&quot;</span>] = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; edge_obj[<span class="stringliteral">&quot;Source Type&quot;</span>] = getPAGNodeKindValue(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()-&gt;getNodeKind());</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; edge_obj[<span class="stringliteral">&quot;Destination Type&quot;</span>] = getPAGNodeKindValue(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()-&gt;getNodeKind());</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; edge_obj[<span class="stringliteral">&quot;Edge Type&quot;</span>] = getPAGEdgeKindValue(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#abe8525c542def8162b094c169a01993b">getEdgeKind</a>());</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; edge_obj[<span class="stringliteral">&quot;srcValueName&quot;</span>] = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()-&gt;getValueName();</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; edge_obj[<span class="stringliteral">&quot;dstValueName&quot;</span>] = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()-&gt;getValueName();</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keywordflow">if</span>(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#abe8525c542def8162b094c169a01993b">getEdgeKind</a>()==PAGEdge::NormalGep)</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; {</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1NormalGepPE.html">NormalGepPE</a>* gepEdge = SVFUtil::cast&lt;NormalGepPE&gt;(edge);</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; edge_obj[<span class="stringliteral">&quot;offset&quot;</span>] = gepEdge-&gt;<a class="code" href="classSVF_1_1NormalGepPE.html#a38ac1dd06ada0a04e13a038f8b69e3e5">getOffset</a>();</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; }</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::json::Value</a> edge_value = llvm::json::Object{edge_obj};</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; PAGEdge_array.push_back(edge_value);</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; }</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::json::Value</a> PagEdge_value = llvm::json::Array{PAGEdge_array};</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;PAG Edges&quot;</span>] = PagEdge_value;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; }</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1FunEntryBlockNode.html">FunEntryBlockNode</a>* <a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a> = SVFUtil::dyn_cast&lt;FunEntryBlockNode&gt;(node))</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; {</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">isExtCall</a>(<a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a>-&gt;getFun()))</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;isExtCall&quot;</span>] = <span class="keyword">true</span>;</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; {</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;isExtCall&quot;</span>] = <span class="keyword">false</span>;</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Source Location&quot;</span>] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(<a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a>-&gt;getFun()-&gt;getLLVMFun());</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; }</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Function Name&quot;</span>] = <a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a>-&gt;getFun()-&gt;getName();</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; }</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FunExitBlockNode.html">FunExitBlockNode</a>* <a class="code" href="util_8h.html#a43b6ea6be735bb828bc062c70cadeff8">exit</a> = SVFUtil::dyn_cast&lt;FunExitBlockNode&gt;(node))</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; {</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">isExtCall</a>(<a class="code" href="util_8h.html#a43b6ea6be735bb828bc062c70cadeff8">exit</a>-&gt;getFun()))</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;isExtCall&quot;</span>] = <span class="keyword">true</span>;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; {</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;isExtCall&quot;</span>] = <span class="keyword">false</span>;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Source Location&quot;</span>] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(&amp;(<a class="code" href="util_8h.html#a43b6ea6be735bb828bc062c70cadeff8">exit</a>-&gt;getFun()-&gt;getLLVMFun()-&gt;back()));</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; }</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Function Name&quot;</span>] = <a class="code" href="util_8h.html#a43b6ea6be735bb828bc062c70cadeff8">exit</a>-&gt;getFun()-&gt;getName();</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; }</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* call = SVFUtil::dyn_cast&lt;CallBlockNode&gt;(node))</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; {</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Source Location&quot;</span>] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(call-&gt;getCallSite());</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; }</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1RetBlockNode.html">RetBlockNode</a>* ret = SVFUtil::dyn_cast&lt;RetBlockNode&gt;(node))</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; {</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;Source Location&quot;</span>] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(ret-&gt;getCallSite());</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; }</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;what else kinds of nodes do we have??&quot;</span>);</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; llvm::json::Array ICFGEdges_array;</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keywordflow">for</span>(<a class="code" href="classSVF_1_1ICFGNode.html#a5a148eccec266a67e4ff5364d7268fff">ICFGNode::iterator</a> sit = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(), esit = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); sit!=esit; ++sit)</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; {</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <a class="code" href="classSVF_1_1ICFGEdge.html">ICFGEdge</a>* edge = *sit;</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; llvm::json::Object ICFGEdge_obj;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;CallCFGEdge&gt;(edge))</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; {</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <a class="code" href="classSVF_1_1CallCFGEdge.html">CallCFGEdge</a>* call = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1CallCFGEdge.html">CallCFGEdge</a>&gt;(edge);</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFG Edge Type&quot;</span>] = <span class="stringliteral">&quot;CallCFGEdge&quot;</span>;</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFGEdgeSrcID&quot;</span>] = call-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFGEdgeDstID&quot;</span>] = call-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; }</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;RetCFGEdge&gt;(edge))</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; {</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <a class="code" href="classSVF_1_1RetCFGEdge.html">RetCFGEdge</a>* call = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1RetCFGEdge.html">RetCFGEdge</a>&gt;(edge);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFG Edge Type&quot;</span>] = <span class="stringliteral">&quot;RetCFGEdge&quot;</span>;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFGEdgeSrcID&quot;</span>] = call-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFGEdgeDstID&quot;</span>] = call-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; }</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa&lt;IntraCFGEdge&gt;(edge))</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; {</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <a class="code" href="classSVF_1_1IntraCFGEdge.html">IntraCFGEdge</a>* intraCFGEdge = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1IntraCFGEdge.html">IntraCFGEdge</a>&gt;(edge);</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFG Edge Type&quot;</span>] = <span class="stringliteral">&quot;IntraCFGEdge&quot;</span>;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFGEdgeSrcID&quot;</span>] = intraCFGEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; ICFGEdge_obj[<span class="stringliteral">&quot;ICFGEdgeDstID&quot;</span>] = intraCFGEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; }</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::json::Value</a> ICFGEdge_Val = llvm::json::Object{ICFGEdge_obj};</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; ICFGEdges_array.push_back(ICFGEdge_Val);</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; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::json::Value</a> ICFGEdges_val = llvm::json::Array{ICFGEdges_array};</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; ICFGNode_Obj[<span class="stringliteral">&quot;ICFGEdges&quot;</span>] = ICFGEdges_val;</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::json::Value</a> ICFGNode_val = llvm::json::Object{ICFGNode_Obj};</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; root_array.push_back(ICFGNode_val);</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; }</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::json::Value</a> root_value = llvm::json::Array{root_array};</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; <a class="code" href="namespaceSVF.html#ac5a03512613828c2fab8930f38c2d485">llvm::json::operator&lt;&lt;</a>(F.os(),root_value);</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; F.os().close();</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordflow">if</span> (!F.os().has_error())</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; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; F.keep();</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; }</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;</div><div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="classSVF_1_1ICFGPrinter.html#a2c022308f9c7ae3bf33d9482fcb51e03"> 143</a></span>&#160;std::string ICFGPrinter::getICFGKind(<span class="keyword">const</span> <span class="keywordtype">int</span> kind)</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;{</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">switch</span>(kind)</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; <span class="keywordflow">case</span> ICFGNode::IntraBlock:</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;IntraBlock&quot;</span>;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordflow">case</span> ICFGNode::FunEntryBlock:</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;FunEntryBlock&quot;</span>;</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="keywordflow">case</span> ICFGNode::FunExitBlock:</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;FunExitBlock&quot;</span>;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordflow">case</span> ICFGNode::FunCallBlock:</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;FunCallBlock&quot;</span>;</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keywordflow">case</span> ICFGNode::FunRetBlock:</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;FunRetBlock&quot;</span>;</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="keywordflow">default</span>:</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</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; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160;}</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno"><a class="line" href="classSVF_1_1ICFGPrinter.html#a54f0729c869b5061b5fb9fe056c326ef"> 168</a></span>&#160;std::string ICFGPrinter::getPAGNodeKindValue(<span class="keywordtype">int</span> kind)</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;{</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="keywordflow">switch</span> (kind)</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; <span class="keywordflow">case</span> (PAGNode::ValNode):</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;ValNode&quot;</span>;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">case</span> PAGNode::ObjNode:</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;ObjNode&quot;</span>;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keywordflow">case</span> PAGNode::RetNode:</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;RetNode&quot;</span>;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="keywordflow">case</span> PAGNode::VarargNode:</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;VarargNode&quot;</span>;</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="keywordflow">case</span> PAGNode::GepValNode:</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;GepValNode&quot;</span>;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keywordflow">case</span> PAGNode::GepObjNode:</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;GepObjNode&quot;</span>;</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keywordflow">case</span> PAGNode::FIObjNode:</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;FIObjNode&quot;</span>;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="keywordflow">case</span> PAGNode::DummyValNode:</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;DummyValNode&quot;</span>;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; <span class="keywordflow">case</span> PAGNode::DummyObjNode:</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;DummyObjNode&quot;</span>;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keywordflow">break</span>;</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; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160;}</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160;</div><div class="line"><a name="l00203"></a><span class="lineno"><a class="line" href="classSVF_1_1ICFGPrinter.html#a38aa67e172459a72d8fc92a6172903be"> 203</a></span>&#160;std::string ICFGPrinter::getPAGEdgeKindValue(<span class="keywordtype">int</span> kind)</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">switch</span>(kind)</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">case</span> (PAGEdge::Addr):</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Addr&quot;</span>;</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keywordflow">case</span> (PAGEdge::Copy):</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Copy&quot;</span>;</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <span class="keywordflow">case</span> (PAGEdge::Store):</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Store&quot;</span>;</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <span class="keywordflow">case</span> (PAGEdge::Load):</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Load&quot;</span>;</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="keywordflow">case</span> (PAGEdge::Call):</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Call&quot;</span>;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordflow">case</span> (PAGEdge::Ret):</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Ret&quot;</span>;</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="keywordflow">case</span> (PAGEdge::NormalGep):</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;NormalGep&quot;</span>;</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keywordflow">case</span> (PAGEdge::VariantGep):</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;VariantGep&quot;</span>;</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keywordflow">case</span> (PAGEdge::ThreadFork):</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;ThreadFork&quot;</span>;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keywordflow">case</span> (PAGEdge::ThreadJoin):</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;ThreadJoin&quot;</span>;</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordflow">case</span> (PAGEdge::Cmp):</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;Cmp&quot;</span>;</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <span class="keywordflow">case</span> (PAGEdge::BinaryOp):</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;BinaryOp&quot;</span>;</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordflow">case</span> (PAGEdge::UnaryOp):</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;UnaryOp&quot;</span>;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="keywordflow">break</span>;</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; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160;}</div><div class="ttc" id="classSVF_1_1ICFGEdge_html"><div class="ttname"><a href="classSVF_1_1ICFGEdge.html">SVF::ICFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="ICFGEdge_8h_source.html#l00042">ICFGEdge.h:42</a></div></div>
70
70
  <div class="ttc" id="classSVF_1_1GenericEdge_html_abe8525c542def8162b094c169a01993b"><div class="ttname"><a href="classSVF_1_1GenericEdge.html#abe8525c542def8162b094c169a01993b">SVF::GenericEdge::getEdgeKind</a></div><div class="ttdeci">GEdgeKind getEdgeKind() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00081">GenericGraph.h:81</a></div></div>
71
71
  <div class="ttc" id="util_8h_html_a43b6ea6be735bb828bc062c70cadeff8"><div class="ttname"><a href="util_8h.html#a43b6ea6be735bb828bc062c70cadeff8">exit</a></div><div class="ttdeci">VOID_OR_INT exit()</div></div>
72
72
  <div class="ttc" id="classSVF_1_1PAGEdge_html"><div class="ttname"><a href="classSVF_1_1PAGEdge.html">SVF::PAGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="PAGEdge_8h_source.html#l00047">PAGEdge.h:47</a></div></div>
@@ -72,6 +72,7 @@ $(function() {
72
72
  <div class="textblock"><code>#include &lt;system_error&gt;</code><br />
73
73
  <code>#include &lt;llvm/Support/ToolOutputFile.h&gt;</code><br />
74
74
  <code>#include &lt;llvm/Support/FileSystem.h&gt;</code><br />
75
+ <code>#include &lt;llvm/ADT/GraphTraits.h&gt;</code><br />
75
76
  </div>
76
77
  <p><a href="GraphPrinter_8h_source.html">Go to the source code of this file.</a></p>
77
78
  <table class="memberdecls">
@@ -66,13 +66,13 @@ $(function() {
66
66
  <div class="title">GraphPrinter.h</div> </div>
67
67
  </div><!--header-->
68
68
  <div class="contents">
69
- <a href="GraphPrinter_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">//===- GraphPrinter.h -- Print Generic Graph---------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// Copyright (C) &lt;2013-2017&gt; &lt;Yulei Sui&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">// along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"> * GraphPrinter.h</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment"> * Created on: 19.Sep.,2018</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment"> * Author: Yulei</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#ifndef INCLUDE_UTIL_GRAPHPRINTER_H_</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#define INCLUDE_UTIL_GRAPHPRINTER_H_</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &lt;system_error&gt;</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &lt;llvm/Support/ToolOutputFile.h&gt;</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#include &lt;llvm/Support/FileSystem.h&gt;</span> <span class="comment">// for file open flag</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacellvm.html">llvm</a></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;{</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment"> * Dump and print the graph for debugging</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="classllvm_1_1GraphPrinter.html"> 44</a></span>&#160;<span class="keyword">class </span><a class="code" href="classllvm_1_1GraphPrinter.html">GraphPrinter</a></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;{</div><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;<span class="keyword">public</span>:</div><div class="line"><a name="l00048"></a><span class="lineno"><a class="line" href="classllvm_1_1GraphPrinter.html#a13b2efcc3e5967f60a27e107683cd448"> 48</a></span>&#160; <a class="code" href="classllvm_1_1GraphPrinter.html#a13b2efcc3e5967f60a27e107683cd448">GraphPrinter</a>()</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; {</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; }</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> GraphType&gt;</div><div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="classllvm_1_1GraphPrinter.html#a53b3809728c30389a594076097884b82"> 56</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1GraphPrinter.html#a53b3809728c30389a594076097884b82">WriteGraphToFile</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">llvm::raw_ostream</a> &amp;O,</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keyword">const</span> std::string &amp;GraphName, <span class="keyword">const</span> GraphType &amp;GT, <span class="keywordtype">bool</span> simple = <span class="keyword">false</span>)</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; <span class="comment">// Filename of the output dot file</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; std::string Filename = GraphName + <span class="stringliteral">&quot;.dot&quot;</span>;</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;Writing &#39;&quot;</span> &lt;&lt; Filename &lt;&lt; <span class="stringliteral">&quot;&#39;...&quot;</span>;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; std::error_code ErrInfo;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <a class="code" href="namespaceSVF.html#acde6a1d496f1b655088ccbe023820277">llvm::ToolOutputFile</a> F(Filename.c_str(), ErrInfo, llvm::sys::fs::F_None);</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="keywordflow">if</span> (!ErrInfo)</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; {</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="comment">// dump the ValueFlowGraph here</span></div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; WriteGraph(F.os(), GT, simple);</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; F.os().close();</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; <span class="keywordflow">if</span> (!F.os().has_error())</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; {</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; F.keep();</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; }</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; }</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; O &lt;&lt; <span class="stringliteral">&quot; error opening file for writing!\n&quot;</span>;</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; F.os().clear_error();</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; }</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160;</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> GraphType&gt;</div><div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="classllvm_1_1GraphPrinter.html#a2a459c98ab3725a0e92b0ec6405893bf"> 85</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1GraphPrinter.html#a2a459c98ab3725a0e92b0ec6405893bf">PrintGraph</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">llvm::raw_ostream</a> &amp;O, <span class="keyword">const</span> std::string &amp;GraphName,</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keyword">const</span> GraphType &amp;GT)</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; {</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keyword">typedef</span> llvm::GraphTraits&lt;GraphType&gt; GTraits;</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> GTraits::NodeRef NodeRef;</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> GTraits::nodes_iterator node_iterator;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> GTraits::ChildIteratorType child_iterator;</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;Printing VFG Graph&quot;</span> &lt;&lt; <span class="stringliteral">&quot;&#39;...\n&quot;</span>;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="comment">// Print each node name and its edges</span></div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; node_iterator I = GTraits::nodes_begin(GT);</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; node_iterator E = GTraits::nodes_end(GT);</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keywordflow">for</span> (; I != E; ++I)</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; {</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; NodeRef *Node = *I;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;node :&quot;</span> &lt;&lt; Node &lt;&lt; <span class="stringliteral">&quot;&#39;\n&quot;</span>;</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; child_iterator EI = GTraits::child_begin(Node);</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; child_iterator EE = GTraits::child_end(Node);</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; EI != EE &amp;&amp; i != 64; ++EI, ++i)</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; {</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;child :&quot;</span> &lt;&lt; *EI &lt;&lt; <span class="stringliteral">&quot;&#39;\n&quot;</span>;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; }</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; }</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; }</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160;};</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;} <span class="comment">// End namespace llvm</span></div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* INCLUDE_UTIL_GRAPHPRINTER_H_ */</span><span class="preprocessor"></span></div><div class="ttc" id="namespacellvm_html"><div class="ttname"><a href="namespacellvm.html">llvm</a></div><div class="ttdef"><b>Definition:</b> <a href="ConsG_8h_source.html#l00385">ConsG.h:385</a></div></div>
69
+ <a href="GraphPrinter_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">//===- GraphPrinter.h -- Print Generic Graph---------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// Copyright (C) &lt;2013-2017&gt; &lt;Yulei Sui&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">// along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"> * GraphPrinter.h</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment"> * Created on: 19.Sep.,2018</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment"> * Author: Yulei</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#ifndef INCLUDE_UTIL_GRAPHPRINTER_H_</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#define INCLUDE_UTIL_GRAPHPRINTER_H_</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &lt;system_error&gt;</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &lt;llvm/Support/ToolOutputFile.h&gt;</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#include &lt;llvm/Support/FileSystem.h&gt;</span> <span class="comment">// for file open flag</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="preprocessor">#include &lt;llvm/ADT/GraphTraits.h&gt;</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacellvm.html">llvm</a></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;{</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment"> * Dump and print the graph for debugging</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="classllvm_1_1GraphPrinter.html"> 45</a></span>&#160;<span class="keyword">class </span><a class="code" href="classllvm_1_1GraphPrinter.html">GraphPrinter</a></div><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;</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="classllvm_1_1GraphPrinter.html#a13b2efcc3e5967f60a27e107683cd448"> 49</a></span>&#160; <a class="code" href="classllvm_1_1GraphPrinter.html#a13b2efcc3e5967f60a27e107683cd448">GraphPrinter</a>()</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; {</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;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> GraphType&gt;</div><div class="line"><a name="l00057"></a><span class="lineno"><a class="line" href="classllvm_1_1GraphPrinter.html#a53b3809728c30389a594076097884b82"> 57</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1GraphPrinter.html#a53b3809728c30389a594076097884b82">WriteGraphToFile</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">llvm::raw_ostream</a> &amp;O,</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keyword">const</span> std::string &amp;GraphName, <span class="keyword">const</span> GraphType &amp;GT, <span class="keywordtype">bool</span> simple = <span class="keyword">false</span>)</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; {</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="comment">// Filename of the output dot file</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; std::string Filename = GraphName + <span class="stringliteral">&quot;.dot&quot;</span>;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;Writing &#39;&quot;</span> &lt;&lt; Filename &lt;&lt; <span class="stringliteral">&quot;&#39;...&quot;</span>;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; std::error_code ErrInfo;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <a class="code" href="namespaceSVF.html#acde6a1d496f1b655088ccbe023820277">llvm::ToolOutputFile</a> F(Filename.c_str(), ErrInfo, llvm::sys::fs::OF_None);</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="keywordflow">if</span> (!ErrInfo)</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; {</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="comment">// dump the ValueFlowGraph here</span></div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; WriteGraph(F.os(), GT, simple);</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; F.os().close();</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="keywordflow">if</span> (!F.os().has_error())</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; {</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; F.keep();</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; }</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; }</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; O &lt;&lt; <span class="stringliteral">&quot; error opening file for writing!\n&quot;</span>;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; F.os().clear_error();</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; }</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> GraphType&gt;</div><div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="classllvm_1_1GraphPrinter.html#a2a459c98ab3725a0e92b0ec6405893bf"> 86</a></span>&#160; <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1GraphPrinter.html#a2a459c98ab3725a0e92b0ec6405893bf">PrintGraph</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">llvm::raw_ostream</a> &amp;O, <span class="keyword">const</span> std::string &amp;GraphName,</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="keyword">const</span> GraphType &amp;GT)</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; {</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keyword">typedef</span> llvm::GraphTraits&lt;GraphType&gt; GTraits;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160;</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> GTraits::NodeRef NodeRef;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> GTraits::nodes_iterator node_iterator;</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> GTraits::ChildIteratorType child_iterator;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;Printing VFG Graph&quot;</span> &lt;&lt; <span class="stringliteral">&quot;&#39;...\n&quot;</span>;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="comment">// Print each node name and its edges</span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; node_iterator I = GTraits::nodes_begin(GT);</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; node_iterator E = GTraits::nodes_end(GT);</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keywordflow">for</span> (; I != E; ++I)</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; {</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; NodeRef *Node = *I;</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;node :&quot;</span> &lt;&lt; Node &lt;&lt; <span class="stringliteral">&quot;&#39;\n&quot;</span>;</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; child_iterator EI = GTraits::child_begin(Node);</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; child_iterator EE = GTraits::child_end(Node);</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; EI != EE &amp;&amp; i != 64; ++EI, ++i)</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; {</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; O &lt;&lt; <span class="stringliteral">&quot;child :&quot;</span> &lt;&lt; *EI &lt;&lt; <span class="stringliteral">&quot;&#39;\n&quot;</span>;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; }</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; }</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; }</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;};</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160;</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160;} <span class="comment">// End namespace llvm</span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* INCLUDE_UTIL_GRAPHPRINTER_H_ */</span><span class="preprocessor"></span></div><div class="ttc" id="namespacellvm_html"><div class="ttname"><a href="namespacellvm.html">llvm</a></div><div class="ttdef"><b>Definition:</b> <a href="ConsG_8h_source.html#l00385">ConsG.h:385</a></div></div>
70
70
  <div class="ttc" id="namespaceSVF_html_a424cc053c29ad7303699c529d1a2cc71"><div class="ttname"><a href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">SVF::raw_ostream</a></div><div class="ttdeci">llvm::raw_ostream raw_ostream</div><div class="ttdoc">LLVM outputs. </div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00099">BasicTypes.h:99</a></div></div>
71
- <div class="ttc" id="classllvm_1_1GraphPrinter_html"><div class="ttname"><a href="classllvm_1_1GraphPrinter.html">llvm::GraphPrinter</a></div><div class="ttdef"><b>Definition:</b> <a href="GraphPrinter_8h_source.html#l00044">GraphPrinter.h:44</a></div></div>
71
+ <div class="ttc" id="classllvm_1_1GraphPrinter_html"><div class="ttname"><a href="classllvm_1_1GraphPrinter.html">llvm::GraphPrinter</a></div><div class="ttdef"><b>Definition:</b> <a href="GraphPrinter_8h_source.html#l00045">GraphPrinter.h:45</a></div></div>
72
72
  <div class="ttc" id="namespaceSVF_html_acde6a1d496f1b655088ccbe023820277"><div class="ttname"><a href="namespaceSVF.html#acde6a1d496f1b655088ccbe023820277">SVF::ToolOutputFile</a></div><div class="ttdeci">llvm::ToolOutputFile ToolOutputFile</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00103">BasicTypes.h:103</a></div></div>
73
- <div class="ttc" id="classllvm_1_1GraphPrinter_html_a2a459c98ab3725a0e92b0ec6405893bf"><div class="ttname"><a href="classllvm_1_1GraphPrinter.html#a2a459c98ab3725a0e92b0ec6405893bf">llvm::GraphPrinter::PrintGraph</a></div><div class="ttdeci">static void PrintGraph(llvm::raw_ostream &amp;O, const std::string &amp;GraphName, const GraphType &amp;GT)</div><div class="ttdef"><b>Definition:</b> <a href="GraphPrinter_8h_source.html#l00085">GraphPrinter.h:85</a></div></div>
74
- <div class="ttc" id="classllvm_1_1GraphPrinter_html_a53b3809728c30389a594076097884b82"><div class="ttname"><a href="classllvm_1_1GraphPrinter.html#a53b3809728c30389a594076097884b82">llvm::GraphPrinter::WriteGraphToFile</a></div><div class="ttdeci">static void WriteGraphToFile(llvm::raw_ostream &amp;O, const std::string &amp;GraphName, const GraphType &amp;GT, bool simple=false)</div><div class="ttdef"><b>Definition:</b> <a href="GraphPrinter_8h_source.html#l00056">GraphPrinter.h:56</a></div></div>
75
- <div class="ttc" id="classllvm_1_1GraphPrinter_html_a13b2efcc3e5967f60a27e107683cd448"><div class="ttname"><a href="classllvm_1_1GraphPrinter.html#a13b2efcc3e5967f60a27e107683cd448">llvm::GraphPrinter::GraphPrinter</a></div><div class="ttdeci">GraphPrinter()</div><div class="ttdef"><b>Definition:</b> <a href="GraphPrinter_8h_source.html#l00048">GraphPrinter.h:48</a></div></div>
73
+ <div class="ttc" id="classllvm_1_1GraphPrinter_html_a2a459c98ab3725a0e92b0ec6405893bf"><div class="ttname"><a href="classllvm_1_1GraphPrinter.html#a2a459c98ab3725a0e92b0ec6405893bf">llvm::GraphPrinter::PrintGraph</a></div><div class="ttdeci">static void PrintGraph(llvm::raw_ostream &amp;O, const std::string &amp;GraphName, const GraphType &amp;GT)</div><div class="ttdef"><b>Definition:</b> <a href="GraphPrinter_8h_source.html#l00086">GraphPrinter.h:86</a></div></div>
74
+ <div class="ttc" id="classllvm_1_1GraphPrinter_html_a53b3809728c30389a594076097884b82"><div class="ttname"><a href="classllvm_1_1GraphPrinter.html#a53b3809728c30389a594076097884b82">llvm::GraphPrinter::WriteGraphToFile</a></div><div class="ttdeci">static void WriteGraphToFile(llvm::raw_ostream &amp;O, const std::string &amp;GraphName, const GraphType &amp;GT, bool simple=false)</div><div class="ttdef"><b>Definition:</b> <a href="GraphPrinter_8h_source.html#l00057">GraphPrinter.h:57</a></div></div>
75
+ <div class="ttc" id="classllvm_1_1GraphPrinter_html_a13b2efcc3e5967f60a27e107683cd448"><div class="ttname"><a href="classllvm_1_1GraphPrinter.html#a13b2efcc3e5967f60a27e107683cd448">llvm::GraphPrinter::GraphPrinter</a></div><div class="ttdeci">GraphPrinter()</div><div class="ttdef"><b>Definition:</b> <a href="GraphPrinter_8h_source.html#l00049">GraphPrinter.h:49</a></div></div>
76
76
  </div><!-- fragment --></div><!-- contents -->
77
77
  <!-- start footer part -->
78
78
  <hr class="footer"/><address class="footer"><small>
@@ -190,7 +190,7 @@ $(function() {
190
190
  <div class="ttc" id="LLVMUtil_8h_html"><div class="ttname"><a href="LLVMUtil_8h.html">LLVMUtil.h</a></div></div>
191
191
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a22ef185e767ff76c098e75126c885400"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">SVF::SVFUtil::isExtCall</a></div><div class="ttdeci">bool isExtCall(const SVFFunction *fun)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8h_source.html#l00063">LLVMUtil.h:63</a></div></div>
192
192
  <div class="ttc" id="classSVF_1_1ICFGNode_html_a3c193da05d6dee7313a141ae3ab43e97"><div class="ttname"><a href="classSVF_1_1ICFGNode.html#a3c193da05d6dee7313a141ae3ab43e97">SVF::ICFGNode::dump</a></div><div class="ttdeci">void dump() const</div><div class="ttdef"><b>Definition:</b> <a href="ICFG_8cpp_source.html#l00068">ICFG.cpp:68</a></div></div>
193
- <div class="ttc" id="classllvm_1_1GraphPrinter_html_a53b3809728c30389a594076097884b82"><div class="ttname"><a href="classllvm_1_1GraphPrinter.html#a53b3809728c30389a594076097884b82">llvm::GraphPrinter::WriteGraphToFile</a></div><div class="ttdeci">static void WriteGraphToFile(llvm::raw_ostream &amp;O, const std::string &amp;GraphName, const GraphType &amp;GT, bool simple=false)</div><div class="ttdef"><b>Definition:</b> <a href="GraphPrinter_8h_source.html#l00056">GraphPrinter.h:56</a></div></div>
193
+ <div class="ttc" id="classllvm_1_1GraphPrinter_html_a53b3809728c30389a594076097884b82"><div class="ttname"><a href="classllvm_1_1GraphPrinter.html#a53b3809728c30389a594076097884b82">llvm::GraphPrinter::WriteGraphToFile</a></div><div class="ttdeci">static void WriteGraphToFile(llvm::raw_ostream &amp;O, const std::string &amp;GraphName, const GraphType &amp;GT, bool simple=false)</div><div class="ttdef"><b>Definition:</b> <a href="GraphPrinter_8h_source.html#l00057">GraphPrinter.h:57</a></div></div>
194
194
  <div class="ttc" id="classSVF_1_1ICFG_html_ab7b0b3088b46ad65451905cc4f567a7b"><div class="ttname"><a href="classSVF_1_1ICFG.html#ab7b0b3088b46ad65451905cc4f567a7b">SVF::ICFG::getBlockICFGNode</a></div><div class="ttdeci">ICFGNode * getBlockICFGNode(const Instruction *inst)</div><div class="ttdoc">Get a basic block ICFGNode. </div><div class="ttdef"><b>Definition:</b> <a href="ICFG_8cpp_source.html#l00181">ICFG.cpp:181</a></div></div>
195
195
  </div><!-- fragment --></div><!-- contents -->
196
196
  <!-- start footer part -->