svf-tools 1.0.623 → 1.0.625
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.
- package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +11 -11
- package/SVF-doxygen/html/html/LLVMModule_8h_source.html +10 -10
- package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/PointsTo_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFIR2ItvExeState_8cpp_source.html +13 -15
- package/SVF-doxygen/html/html/SVFIR2ItvExeState_8h_source.html +12 -12
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +41 -40
- package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1RaceResultValidator.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR2ItvExeState.html +27 -30
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1SVFType.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +3 -3
- package/SVF-doxygen/html/html/include_2MTA_2MTAResultValidator_8h_source.html +1 -1
- package/SVF-doxygen/html/html/tools_2MTA_2MTAResultValidator_8h_source.html +1 -1
- package/lib/AbstractExecution/SVFIR2ItvExeState.cpp +2 -13
- package/lib/MemoryModel/PointsTo.cpp +1 -1
- package/lib/SVF-LLVM/LLVMModule.cpp +5 -1
- package/package.json +1 -1
|
@@ -66,7 +66,7 @@ $(function() {
|
|
|
66
66
|
<div class="title">LLVMModule.cpp</div> </div>
|
|
67
67
|
</div><!--header-->
|
|
68
68
|
<div class="contents">
|
|
69
|
-
<a href="LLVMModule_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===----- SVFModule.cpp Base class of pointer analyses ---------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// Copyright (C) <2013-2017> <Yulei Sui></span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> </div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment">// along with this program. If not, see <http://www.gnu.org/licenses/>.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"> * SVFModule.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> * Created on: Aug 4, 2017</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * Author: Xiaokang Fan</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include <queue></span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include "<a class="code" href="SVFModule_8h.html">SVFIR/SVFModule.h</a>"</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include "<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>"</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include "<a class="code" href="BasicTypes_8h.html">SVF-LLVM/BasicTypes.h</a>"</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="preprocessor">#include "<a class="code" href="LLVMUtil_8h.html">SVF-LLVM/LLVMUtil.h</a>"</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="preprocessor">#include "<a class="code" href="BreakConstantExpr_8h.html">SVF-LLVM/BreakConstantExpr.h</a>"</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="preprocessor">#include "<a class="code" href="SymbolTableBuilder_8h.html">SVF-LLVM/SymbolTableBuilder.h</a>"</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="preprocessor">#include "<a class="code" href="SVFGBuilder_8h.html">MSSA/SVFGBuilder.h</a>"</span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="preprocessor">#include "llvm/Support/FileSystem.h"</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="keyword">using namespace </span><a class="code" href="namespacestd.html">std</a>;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> </div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="comment">/*</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="comment"> svf.main() is used to model the real entry point of a C++ program, which</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="comment"> initializes all global C++ objects and then call main().</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="comment"> LLVM may generate two global arrays @llvm.global_ctors and @llvm.global_dtors</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="comment"> that contain constructor and destructor functions for global variables. They</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="comment"> are not called explicitly, so we have to add them in the svf.main function.</span></div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="comment"> The order to call these constructor and desctructor functions are also</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="comment"> specified in the global arrays.</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="comment"> Related part in LLVM language reference:</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="comment"> https://llvm.org/docs/LangRef.html#the-llvm-global-ctors-global-variable</span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="comment"> For example, given a "int main(int argc, char * argv[])", the corresponding</span></div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="comment"> svf.main will be generated as follows:</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="comment"> define void @svf.main(i32, i8**, i8**) {</span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="comment"> entry:</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="comment"> call void @ctor1()</span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="comment"> call void @ctor2()</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="comment"> %3 = call i32 @main(i32 %0, i8** %1)</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="comment"> call void @dtor1()</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> <span class="comment"> call void @dtor2()</span></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="comment"> ret void</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> <span class="comment"> }</span></div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="comment">*/</span></div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> </div><div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b"> 67</a></span> <span class="preprocessor">#define SVF_MAIN_FUNC_NAME "svf.main"</span></div><div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="LLVMModule_8cpp.html#aa18802f2f60ef8030c66a42f20f285af"> 68</a></span> <span class="preprocessor">#define SVF_GLOBAL_CTORS "llvm.global_ctors"</span></div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="LLVMModule_8cpp.html#a9fd6e28e6ed93f65a20a348ab0646320"> 69</a></span> <span class="preprocessor">#define SVF_GLOBAL_DTORS "llvm.global_dtors"</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> </div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html">LLVMModuleSet</a> *LLVMModuleSet::llvmModuleSet = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> SVFModule::pagReadFromTxt = <span class="stringliteral">""</span>;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> </div><div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#aaa23ad390e9148ba6302fea8d4595080"> 74</a></span> LLVMModuleSet::LLVMModuleSet(): svfModule(nullptr), cxts(nullptr), preProcessed(<a class="code" href="cJSON_8cpp.html#a65e9886d74aaee76545e83dd09011727">false</a>)</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> {</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5552135a27684cbe4d2a5ed346f64644">symInfo</a> = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>();</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span> }</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span> </div><div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a57b4faba42847323d31cd5216146a7ec"> 79</a></span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a57b4faba42847323d31cd5216146a7ec">LLVMModuleSet::~LLVMModuleSet</a>()</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span> {</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> </div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span> }</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> </div><div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ae919327019b5014f64b754dbdeb07f75"> 84</a></span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae919327019b5014f64b754dbdeb07f75">LLVMModuleSet::buildSVFModule</a>(<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &mod)</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> {</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="keywordtype">double</span> startSVFModuleTime = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVFStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a> = std::make_unique<SVFModule>(mod.getModuleIdentifier());</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>.emplace_back(mod);</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> </div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#af8edfe08027020f14b81b44362c6018e">build</a>();</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordtype">double</span> endSVFModuleTime = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVFStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <a class="code" href="classSVF_1_1SVFStat.html#aa4950ec26b66a085ad38ac154b789db5">SVFStat::timeOfBuildingLLVMModule</a> = (endSVFModuleTime - startSVFModuleTime)/<a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span> </div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#afb6ac5d4e334d6e3acb66c8e33ae8d18">build_symbol_table</a>();</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> </div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>.get();</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> }</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> </div><div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a1f8e769251c89433311eeb6f98d115e9"> 99</a></span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae919327019b5014f64b754dbdeb07f75">LLVMModuleSet::buildSVFModule</a>(<span class="keyword">const</span> std::vector<std::string> &moduleNameVec)</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span> {</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <span class="keywordtype">double</span> startSVFModuleTime = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVFStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> </div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  assert(<a class="code" href="classSVF_1_1LLVMModuleSet.html#ac59b07cafcbacc950eefea4082425b63">llvmModuleSet</a> && <span class="stringliteral">"LLVM Module set needs to be created!"</span>);</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> </div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a298966366b02d0a34f409c2c77da3789">loadModules</a>(moduleNameVec);</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> </div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="keywordflow">if</span>(!moduleNameVec.empty())</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a> = std::make_unique<SVFModule>(*moduleNameVec.begin());</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a> = std::make_unique<SVFModule>();</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> </div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#af8edfe08027020f14b81b44362c6018e">build</a>();</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> </div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keywordtype">double</span> endSVFModuleTime = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVFStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <a class="code" href="classSVF_1_1SVFStat.html#aa4950ec26b66a085ad38ac154b789db5">SVFStat::timeOfBuildingLLVMModule</a> = (endSVFModuleTime - startSVFModuleTime)/<a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> </div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#afb6ac5d4e334d6e3acb66c8e33ae8d18">build_symbol_table</a>();</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span> </div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>.get();</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span> }</div><div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#afb6ac5d4e334d6e3acb66c8e33ae8d18"> 121</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#afb6ac5d4e334d6e3acb66c8e33ae8d18">LLVMModuleSet::build_symbol_table</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span> <span class="keyword"></span>{</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keywordtype">double</span> startSymInfoTime = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVFStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keywordflow">if</span> (!<a class="code" href="classSVF_1_1SVFModule.html#a1357c876eccedd58b3abe68875b3a570">SVFModule::pagReadFromTXT</a>())</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  {</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"Building Symbol table ...\n"</span>));</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <a class="code" href="classSVF_1_1SymbolTableBuilder.html">SymbolTableBuilder</a> builder(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5552135a27684cbe4d2a5ed346f64644">symInfo</a>);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  builder.<a class="code" href="classSVF_1_1SymbolTableBuilder.html#aef0bb1e88d0b69313c673318f7b7cb5f">buildMemModel</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>.get());</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  }</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <span class="keywordtype">double</span> endSymInfoTime = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVFStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <a class="code" href="classSVF_1_1SVFStat.html#ae89293bc063bdc74a988e9c37c70321e">SVFStat::timeOfBuildingSymbolTable</a> = (endSymInfoTime - startSymInfoTime)/<a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span> }</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span> </div><div class="line"><a name="l00135"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#af8edfe08027020f14b81b44362c6018e"> 135</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#af8edfe08027020f14b81b44362c6018e">LLVMModuleSet::build</a>()</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> {</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a14b0b55d397d6f8a5dfe3b574021f801">preProcessed</a>==<span class="keyword">false</span>)</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8b5f24c873db1f6a0614d1dac48bb4bb">prePassSchedule</a>();</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> </div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ac7c646a78c989807c52263fc35fb3628">buildFunToFunMap</a>();</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#aaab03cb6ff665bc008c67b866ba81e47">buildGlobalDefToRepMap</a>();</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> </div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a3a718b0a27c2d13878c0718af97ad73d">Options::SVFMain</a>())</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8af6b911b728713f66f7c809d5c0fbf1">addSVFMain</a>();</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> </div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a4ca8c4678a7fefe26372fc1f4b2880fd">createSVFDataStructure</a>();</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ac6a5540354696f4c9170e0a5832ba70e">initSVFFunction</a>();</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span> }</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> </div><div class="line"><a name="l00150"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a4ca8c4678a7fefe26372fc1f4b2880fd"> 150</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a4ca8c4678a7fefe26372fc1f4b2880fd">LLVMModuleSet::createSVFDataStructure</a>()</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> {</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> </div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>& mod : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>)</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  {</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <span class="keywordflow">for</span> (Module::const_iterator it = mod.begin(), eit = mod.end(); it != eit; ++it)</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  {</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* func = &*it;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html">SVFLoopAndDomInfo</a>* ld = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html">SVFLoopAndDomInfo</a>();</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfFunc = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>(func->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(func->getType()), SVFUtil::cast<SVFFunctionType>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(func->getFunctionType())), func->isDeclaration(), <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a4638a12f5481dff947b59cf8353e619b">LLVMUtil::isIntrinsicFun</a>(func), func->hasAddressTaken(), func->isVarArg(), ld);</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>->addFunctionSet(svfFunc);</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab671d5bb9ca5761e2b438a4d4da229cf">addFunctionMap</a>(func,svfFunc);</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="keywordflow">for</span> (Function::const_arg_iterator I = func->arg_begin(), E = func->arg_end(); I != E; ++I)</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  {</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a58cdfbc4160cae08745b67844ac29801">Argument</a>* arg = &*I;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <a class="code" href="classSVF_1_1SVFArgument.html">SVFArgument</a>* svfarg = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFArgument.html">SVFArgument</a>(arg->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(arg->getType()), svfFunc, arg->getArgNo(), <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a428bd75b33fab60988d8758090712f29">LLVMUtil::isArgOfUncalledFunction</a>(arg));</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  svfFunc-><a class="code" href="classSVF_1_1SVFFunction.html#ad865b8440a6e0d5d212798d2213e1e9c">addArgument</a>(svfarg);</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5595ec3f7582934dc499770825bf5373">addArgumentMap</a>(arg,svfarg);</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  }</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> </div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keywordflow">for</span> (Function::const_iterator bit = func->begin(), ebit = func->end(); bit != ebit; ++bit)</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  {</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* bb = &*bit;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* svfBB = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>(bb->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(bb->getType()), svfFunc);</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  svfFunc-><a class="code" href="classSVF_1_1SVFFunction.html#a0d5031bd11b6372803082111ec2cb4f6">addBasicBlock</a>(svfBB);</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3eaadb33cd21d0bd868526b5ddb051d9">addBasicBlockMap</a>(bb,svfBB);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keywordflow">for</span> (BasicBlock::const_iterator iit = bb->begin(), eiit = bb->end(); iit != eiit; ++iit)</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  {</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = &*iit;</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* svfInst = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* call = SVFUtil::dyn_cast<CallBase>(inst))</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  {</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF_1_1cppUtil.html#aab1dce633f9a03796c208b6fba2bd2b4">cppUtil::isVirtualCallSite</a>(call))</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  svfInst = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFVirtualCallInst.html">SVFVirtualCallInst</a>(call->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(call->getType()), svfBB,call->getFunctionType()->isVarArg(),inst->isTerminator());</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  svfInst = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFCallInst.html">SVFCallInst</a>(call->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(call->getType()), svfBB,call->getFunctionType()->isVarArg(),inst->isTerminator());</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  }</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  {</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  svfInst = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>(inst->getName().str(),<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(inst->getType()), svfBB, inst->isTerminator(), SVFUtil::isa<ReturnInst>(inst));</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  }</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  svfBB-><a class="code" href="classSVF_1_1SVFBasicBlock.html#ac1b15d8f9c2499add8dbc889ae5cab65">addInstruction</a>(svfInst);</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a172084437a8450314a17f7085a32b5d2">addInstructionMap</a>(inst,svfInst);</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  }</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  }</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  }</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> </div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <span class="keywordflow">for</span> (Module::const_global_iterator it = mod.global_begin(),</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  eit = mod.global_end(); it != eit; ++it)</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  {</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a>* global = &*it;</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a>* svfglobal = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a>(global->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(global->getType()));</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>->addGlobalSet(svfglobal);</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a7de84e7817406867b173e1591e0681ac">addGlobalValueMap</a>(global,svfglobal);</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  }</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> </div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  <span class="keywordflow">for</span> (Module::const_alias_iterator it = mod.alias_begin(),</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  eit = mod.alias_end(); it != eit; ++it)</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  {</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a0fd33072b099f61eaa642e94ed0c03fc">GlobalAlias</a> *alias = &*it;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a>* svfalias = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a>(alias->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(alias->getType()));</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>->addAliasSet(svfalias);</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a7de84e7817406867b173e1591e0681ac">addGlobalValueMap</a>(alias,svfalias);</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  }</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  }</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span> }</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span> </div><div class="line"><a name="l00221"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ac6a5540354696f4c9170e0a5832ba70e"> 221</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#ac6a5540354696f4c9170e0a5832ba70e">LLVMModuleSet::initSVFFunction</a>()</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span> {</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>& mod : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>)</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keywordflow">for</span> (Module::iterator it = mod.begin(), eit = mod.end(); it != eit; ++it)</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  {</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* f = &*it;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svffun = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a50fc24901350df9db890ba16a9b87e33">getSVFFunction</a>(f);</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a20162d2894d6a12ba29410311fba4002">initSVFBasicBlock</a>(f);</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> </div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">SVFUtil::isExtCall</a>(svffun) == <span class="keyword">false</span>)</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  {</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8ba9092747108e0289014d52465a692d">initDomTree</a>(svffun, f);</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  }</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  }</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  }</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span> }</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> </div><div class="line"><a name="l00240"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a20162d2894d6a12ba29410311fba4002"> 240</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a20162d2894d6a12ba29410311fba4002">LLVMModuleSet::initSVFBasicBlock</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* func)</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span> {</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordflow">for</span> (Function::const_iterator bit = func->begin(), ebit = func->end(); bit != ebit; ++bit)</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  {</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* bb = &*bit;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* svfbb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(bb);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a3436a988bf80c021cd8022fb445b66d5">succ_const_iterator</a> succ_it = succ_begin(bb); succ_it != succ_end(bb); succ_it++)</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  {</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* svf_scc_bb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(*succ_it);</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  svfbb-><a class="code" href="classSVF_1_1SVFBasicBlock.html#abfe3a1ce5fa364d9db7cd2d0e6a144ff">addSuccBasicBlock</a>(svf_scc_bb);</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a5c943191dc4e242704943e5f594ae99e">const_pred_iterator</a> pred_it = pred_begin(bb); pred_it != pred_end(bb); pred_it++)</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  {</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* svf_pred_bb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(*pred_it);</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  svfbb-><a class="code" href="classSVF_1_1SVFBasicBlock.html#a38f8fdd93ef7222f408cbbb2a98a1cd5">addPredBasicBlock</a>(svf_pred_bb);</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  }</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordflow">for</span> (BasicBlock::const_iterator iit = bb->begin(), eiit = bb->end(); iit != eiit; ++iit)</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  {</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = &*iit;</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* call = SVFUtil::dyn_cast<CallBase>(inst))</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  {</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* svfinst = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae74f307b6f96950ceedb2c375ef1c3a3">getSVFInstruction</a>(call);</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <a class="code" href="classSVF_1_1SVFCallInst.html">SVFCallInst</a>* svfcall = SVFUtil::cast<SVFCallInst>(svfinst);</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* callee = <a class="code" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">getSVFValue</a>(call->getCalledOperand()->stripPointerCasts());</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  svfcall-><a class="code" href="classSVF_1_1SVFCallInst.html#a6dd304f555d2d2388c4430e57b0d2b91">setCalledOperand</a>(callee);</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1SVFVirtualCallInst.html">SVFVirtualCallInst</a>* virtualCall = SVFUtil::dyn_cast<SVFVirtualCallInst>(svfcall))</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  {</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  virtualCall->setVtablePtr(<a class="code" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">getSVFValue</a>(<a class="code" href="namespaceSVF_1_1cppUtil.html#a374e7c0b161a77f4d693e13b99ed6283">cppUtil::getVCallVtblPtr</a>(call)));</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  virtualCall->setFunIdxInVtable(<a class="code" href="namespaceSVF_1_1cppUtil.html#a279fa78f7a2e45b458a0358de9c061b8">cppUtil::getVCallIdx</a>(call));</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  virtualCall->setFunNameOfVirtualCall(<a class="code" href="namespaceSVF_1_1cppUtil.html#a8f5b8d8f99995821c81ccc8f7781c67e">cppUtil::getFunNameOfVCallSite</a>(call));</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  }</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i < call->arg_size(); i++)</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  {</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* svfval = <a class="code" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">getSVFValue</a>(call->getArgOperand(i));</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  svfcall-><a class="code" href="classSVF_1_1SVFCallInst.html#ac979b49b449b97b2a23f195cb107ec77">addArgument</a>(svfval);</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  }</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  }</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a3b2ca48c72fba877c6cb3d52e23704e3">LLVMUtil::getNextInsts</a>(inst, <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae74f307b6f96950ceedb2c375ef1c3a3">getSVFInstruction</a>(inst)->getSuccInstructions());</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <a class="code" href="namespaceSVF_1_1LLVMUtil.html#ae9ddfd95ec4a36537f582acad0262e70">LLVMUtil::getPrevInsts</a>(inst, <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae74f307b6f96950ceedb2c375ef1c3a3">getSVFInstruction</a>(inst)->getPredInstructions());</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  }</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  }</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span> }</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span> </div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> </div><div class="line"><a name="l00284"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a8ba9092747108e0289014d52465a692d"> 284</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8ba9092747108e0289014d52465a692d">LLVMModuleSet::initDomTree</a>(<a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svffun, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun)</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> {</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="comment">//process and stored dt & df</span></div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <a class="code" href="namespaceSVF.html#aecbb42b8e9d17fa0189c50dda9fd5fdd">DominatorTree</a> dt;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <a class="code" href="namespaceSVF.html#ab44d20f806be99699895260b14a942d7">DominanceFrontier</a> df;</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  dt.recalculate(const_cast<Function&>(*fun));</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  df.analyze(dt);</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <a class="code" href="namespaceSVF.html#a77e088bfe47c0b0ddcbbe0693dec6fe5">LoopInfo</a> loopInfo = <a class="code" href="namespaceSVF.html#a77e088bfe47c0b0ddcbbe0693dec6fe5">LoopInfo</a>(dt);</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <a class="code" href="namespaceSVF.html#ab34383ee87cd45eb485fa29db482ffef">PostDominatorTree</a> pdt = <a class="code" href="namespaceSVF.html#ab34383ee87cd45eb485fa29db482ffef">PostDominatorTree</a>(const_cast<Function&>(*fun));</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html">SVFLoopAndDomInfo</a>* ld = svffun-><a class="code" href="classSVF_1_1SVFFunction.html#a5798ecc742ee74e357d13eea751258c4">getLoopAndDomInfo</a>();</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span> </div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<const SVFBasicBlock*,Set<const SVFBasicBlock*></a>> & dfBBsMap = ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#ae37546be7304c66b4eca2654d995eaa7">getDomFrontierMap</a>();</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="keywordflow">for</span> (DominanceFrontierBase::const_iterator dfIter = df.begin(), eDfIter = df.end(); dfIter != eDfIter; dfIter++)</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  {</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* keyBB = dfIter->first;</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keyword">const</span> std::set<BasicBlock* >& domSet = dfIter->second;</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const SVFBasicBlock*></a>& valueBasicBlocks = dfBBsMap[<a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(keyBB)];</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* bbValue:domSet)</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  {</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  valueBasicBlocks.insert(<a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(bbValue));</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  }</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  }</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  std::vector<const SVFBasicBlock*> reachableBBs;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a7653217714dfac2d92f1307ce8b74ec7">LLVMUtil::getFunReachableBBs</a>(fun, reachableBBs);</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#acc409e328f641a2c9512beeb727f58c7">setReachableBBs</a>(reachableBBs);</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span> </div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  <span class="keywordflow">for</span> (Function::const_iterator bit = fun->begin(), ebit = fun->end(); bit != ebit; ++bit)</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  {</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* bb = &*bit;</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* svf_bb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(bb);</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF.html#a827d09974dc7bf0849f96823cc2fee89">DomTreeNode</a> *dtNode = dt.getNode(const_cast<BasicBlock*>(bb)))</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  {</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  DomTreeNode::iterator DI = dtNode->begin();</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keywordflow">if</span> (DI != dtNode->end())</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  {</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keywordflow">for</span> (DomTreeNode::iterator DI = dtNode->begin(), DE = dtNode->end(); DI != DE; ++DI)</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  {</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* dombb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>((*DI)->getBlock());</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#a2fc6b806a436d8fa65863f6cef99e716">getDomTreeMap</a>()[svf_bb].insert(dombb);</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  }</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  }</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  {</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#a2fc6b806a436d8fa65863f6cef99e716">getDomTreeMap</a>()[svf_bb] = <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const SVFBasicBlock* ></a>();</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  }</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  }</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> </div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF.html#a827d09974dc7bf0849f96823cc2fee89">DomTreeNode</a> * pdtNode = pdt.getNode(const_cast<BasicBlock*>(bb)))</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  {</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  DomTreeNode::iterator DI = pdtNode->begin();</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <span class="keywordflow">if</span> (DI != pdtNode->end())</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  {</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <span class="keywordflow">for</span> (DomTreeNode::iterator DI = pdtNode->begin(), DE = pdtNode->end(); DI != DE; ++DI)</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  {</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* dombb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>((*DI)->getBlock());</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#ad07f95e790b5c3a50c864155aa20a083">getPostDomTreeMap</a>()[svf_bb].insert(dombb);</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  }</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  }</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  {</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#ad07f95e790b5c3a50c864155aa20a083">getPostDomTreeMap</a>()[svf_bb] = <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const SVFBasicBlock* ></a>();</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  }</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  }</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#abf85e29310b2e4df8925d00a5c081314">Loop</a> *loop = loopInfo.getLoopFor(bb))</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  {</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* loopBlock:loop->getBlocks())</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  {</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* loopbb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(loopBlock);</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#aed2f125f7b8c21092b23d9727568ba50">addToBB2LoopMap</a>(svf_bb,loopbb);</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  }</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  }</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  }</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span> }</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span> </div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> </div><div class="line"><a name="l00362"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a8b5f24c873db1f6a0614d1dac48bb4bb"> 362</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8b5f24c873db1f6a0614d1dac48bb4bb">LLVMModuleSet::prePassSchedule</a>()</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> {</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  std::unique_ptr<BreakConstantGEPs> p1 = std::make_unique<BreakConstantGEPs>();</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M : <a class="code" href="classSVF_1_1LLVMModuleSet.html#a4091b12bdfe4423d8114612a199bc480">getLLVMModules</a>())</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  {</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  p1->runOnModule(M);</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  }</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span> </div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  std::unique_ptr<UnifyFunctionExitNodes> p2 =</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  std::make_unique<UnifyFunctionExitNodes>();</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-><a class="code" href="classSVF_1_1LLVMModuleSet.html#a4091b12bdfe4423d8114612a199bc480">getLLVMModules</a>())</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  {</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> F = M.begin(), E = M.end(); F != E; ++F)</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  {</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> &fun = *F;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="keywordflow">if</span> (fun.isDeclaration())</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  p2->runOnFunction(fun);</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  }</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  }</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> }</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span> </div><div class="line"><a name="l00386"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a2fdc1bd61b8f6cdf6c07a5059b641b04"> 386</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a2fdc1bd61b8f6cdf6c07a5059b641b04">LLVMModuleSet::preProcessBCs</a>(std::vector<std::string> &moduleNameVec)</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span> {</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a298966366b02d0a34f409c2c77da3789">loadModules</a>(moduleNameVec);</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8b5f24c873db1f6a0614d1dac48bb4bb">prePassSchedule</a>();</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span> </div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> preProcessSuffix = <span class="stringliteral">".pre.bc"</span>;</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="comment">// Get the existing module names, remove old extention, add preProcessSuffix</span></div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i < moduleNameVec.size(); i++)</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  {</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> lastIndex = moduleNameVec[i].find_last_of(<span class="stringliteral">"."</span>);</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> rawName = moduleNameVec[i].substr(0, lastIndex);</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  moduleNameVec[i] = (rawName + preProcessSuffix);</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  }</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span> </div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ad5ef9421d501b2747d4fb31d4189b53f">dumpModulesToFile</a>(preProcessSuffix);</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a14b0b55d397d6f8a5dfe3b574021f801">preProcessed</a> = <span class="keyword">true</span>;</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span> </div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a2f8e91c075d90be66412a079fe73e936">releaseLLVMModuleSet</a>();</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> }</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span> </div><div class="line"><a name="l00406"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a298966366b02d0a34f409c2c77da3789"> 406</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a298966366b02d0a34f409c2c77da3789">LLVMModuleSet::loadModules</a>(<span class="keyword">const</span> std::vector<std::string> &moduleNameVec)</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span> {</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span> </div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <span class="comment">// We read SVFIR from LLVM IR</span></div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#a53f783c80f368bcdca6c7620229d6f8e">Options::Graphtxt</a>().<a class="code" href="classSVF_1_1LLVMModuleSet.html#ae19e38054c55d5822dfc83a12f12aa60">empty</a>())</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  {</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="keywordflow">if</span>(moduleNameVec.empty())</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  {</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"no LLVM bc file is found!\n"</span>;</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  exit(0);</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  }</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="comment">//assert(!moduleNameVec.empty() && "no LLVM bc file is found!");</span></div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  }</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <span class="comment">// We read SVFIR from a user-defined txt instead of parsing SVFIR from LLVM IR</span></div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <a class="code" href="classSVF_1_1SVFModule.html#ac630e9f18a239ac6b3b88d05e64140c5">SVFModule::setPagFromTXT</a>(<a class="code" href="classSVF_1_1Options.html#a53f783c80f368bcdca6c7620229d6f8e">Options::Graphtxt</a>());</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> </div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <span class="comment">//</span></div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <span class="comment">// To avoid the following type bugs (t1 != t3) when parsing multiple modules,</span></div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="comment">// We should use only one LLVMContext object for multiple modules in the same thread.</span></div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <span class="comment">// No such problem if only one module is processed by SVF.</span></div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="comment">// LLVMContext ctxa,ctxb;</span></div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <span class="comment">// IntegerType * t1 = IntegerType::get(ctxa,32);</span></div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="comment">// IntegerType * t2 = IntegerType::get(ctxa,32);</span></div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="comment">// assert(t1 == t2);</span></div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="comment">// IntegerType * t3 = IntegerType::get(ctxb,32);</span></div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="comment">// IntegerType * t4 = IntegerType::get(ctxb,32);</span></div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="comment">// assert(t3 == t4);</span></div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="comment">// assert(t1 != t3);</span></div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <span class="comment">//</span></div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ad06a92bf8bc556de742e0ffdf79ffafe">cxts</a> = std::make_unique<LLVMContext>();</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span> </div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>& moduleName : moduleNameVec)</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  {</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keywordflow">if</span> (!<a class="code" href="namespaceSVF_1_1LLVMUtil.html#ad8a8c32a09340f491fffffcb07dd7a41">LLVMUtil::isIRFile</a>(moduleName))</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  {</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() << <span class="stringliteral">"not an IR file: "</span> << moduleName << std::endl;</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  abort();</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  }</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span> </div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <a class="code" href="namespaceSVF.html#a86863d104a3930b3a806935d92ddbf30">SMDiagnostic</a> Err;</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  std::unique_ptr<Module> mod = parseIRFile(moduleName, Err, *<a class="code" href="classSVF_1_1LLVMModuleSet.html#ad06a92bf8bc556de742e0ffdf79ffafe">cxts</a>);</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="keywordflow">if</span> (mod == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  {</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() << <span class="stringliteral">"load module: "</span> << moduleName << <span class="stringliteral">"failed!!\n\n"</span>;</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  Err.print(<span class="stringliteral">"SVFModuleLoader"</span>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">llvm::errs</a>());</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  abort();</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  }</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>.emplace_back(*mod);</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae365189769640adb919a23c36978e5e2">owned_modules</a>.emplace_back(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a72502f7f536418621485e90ab98c2016">std::move</a>(mod));</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  }</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> }</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span> </div><div class="line"><a name="l00461"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#aa1250575db489dc57583b3641fd78b88"> 461</a></span> std::vector<const Function* > <a class="code" href="classSVF_1_1LLVMModuleSet.html#aa1250575db489dc57583b3641fd78b88">LLVMModuleSet::getLLVMGlobalFunctions</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global)</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span> {</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="comment">// This function is used to extract constructor and destructor functions</span></div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="comment">// sorted by their priority from @llvm.global_ctors or @llvm.global_dtors.</span></div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="comment">// For example, given following @llvm.global_ctors, the returning sorted</span></div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <span class="comment">// function list should be [ctor3, ctor1, ctor2].</span></div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="comment">// ; Each struct in the array is {priority, function, associated data}</span></div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <span class="comment">//</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <span class="comment">// @llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }]</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="comment">// [{ i32, void ()*, i8* } { i32 1234, void ()* @ctor1.cpp, i8* null },</span></div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <span class="comment">// { i32, void ()*, i8* } { i32 2345, void ()* @ctor2.cpp, i8* null },</span></div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="comment">// { i32, void ()*, i8* } { i32 345, void ()* @ctor3.cpp, i8* null }]</span></div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <span class="comment">// TODO: According to LLVM language reference, if the third field is</span></div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="comment">// non-null, and points to a global variable or function, the initializer</span></div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <span class="comment">// function will only run if the associated data from the current module is</span></div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <span class="comment">// not discarded. However the associated data is currently ignored.</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span> </div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span> </div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="comment">// This class is used for the priority queue that sorts the functions by</span></div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <span class="comment">// their priority. Each object of this class stands for an item in the</span></div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="comment">// function array.</span></div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <span class="keyword">class </span>LLVMGlobalFunction</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  {</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> priority;</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* func;</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  LLVMGlobalFunction() {};</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  LLVMGlobalFunction(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> _priority, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* _func)</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  : priority(_priority), func(_func) {};</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF.html#aedd9d023a68dddd66314be63bb8e48d2">operator></a>(<span class="keyword">const</span> LLVMGlobalFunction &other)<span class="keyword"> const</span></div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span> <span class="keyword"> </span>{</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="keywordflow">if</span> (priority != other.priority)</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  {</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <span class="keywordflow">return</span> priority > other.priority;</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  }</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  {</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keywordflow">return</span> func > other.func;</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  }</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  }</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  };</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span> </div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  std::priority_queue<LLVMGlobalFunction, std::vector<LLVMGlobalFunction>,</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  greater<LLVMGlobalFunction>></div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  queue;</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  std::vector<const Function* > result;</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span> </div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="comment">// The @llvm.global_ctors/dtors global variable is an array of struct. Each</span></div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <span class="comment">// struct has three fields: {i32 priority, void ()* @ctor/dtor, i8* @data}.</span></div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <span class="comment">// First get the array here.</span></div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a> *globalFuncArray =</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  SVFUtil::dyn_cast<ConstantArray>(global->getInitializer()))</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  {</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <span class="comment">// Get each struct in the array.</span></div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < globalFuncArray->getNumOperands(); ++i)</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  {</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <span class="keywordflow">if</span> (</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a> *globalFuncItem =</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  SVFUtil::dyn_cast<ConstantStruct>(</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  globalFuncArray->getOperand(i)))</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  {</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span> </div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <span class="comment">// Extract priority and function from the struct</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* priority = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>>(</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  globalFuncItem->getOperand(0));</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* func = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>>(</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  globalFuncItem->getOperand(1));</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span> </div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  <span class="keywordflow">if</span> (priority && func)</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  {</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  queue.push(LLVMGlobalFunction(priority</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  ->getZExtValue(),</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  func));</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  }</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  }</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  }</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  }</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span> </div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <span class="comment">// Generate a sorted vector of functions from the priority queue.</span></div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">while</span> (!queue.empty())</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  {</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  result.push_back(queue.top().func);</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  queue.pop();</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  }</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span> }</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span> </div><div class="line"><a name="l00550"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a8af6b911b728713f66f7c809d5c0fbf1"> 550</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8af6b911b728713f66f7c809d5c0fbf1">LLVMModuleSet::addSVFMain</a>()</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span> {</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  std::vector<const Function* > ctor_funcs;</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  std::vector<const Function* > dtor_funcs;</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* orgMain = 0;</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>* mainMod = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span> </div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &mod : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>)</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  {</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <span class="comment">// Collect ctor and dtor functions</span></div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <span class="keywordflow">for</span> (Module::global_iterator it = mod.global_begin(), eit = mod.global_end(); it != eit; ++it)</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  {</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global = &*it;</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span> </div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="keywordflow">if</span> (global->getName().equals(<a class="code" href="LLVMModule_8cpp.html#aa18802f2f60ef8030c66a42f20f285af">SVF_GLOBAL_CTORS</a>) &&</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  global->hasInitializer())</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  {</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  ctor_funcs = <a class="code" href="classSVF_1_1LLVMModuleSet.html#aa1250575db489dc57583b3641fd78b88">getLLVMGlobalFunctions</a>(global);</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  }</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (global->getName().equals(<a class="code" href="LLVMModule_8cpp.html#a9fd6e28e6ed93f65a20a348ab0646320">SVF_GLOBAL_DTORS</a>) &&</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  global->hasInitializer())</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  {</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  dtor_funcs = <a class="code" href="classSVF_1_1LLVMModuleSet.html#aa1250575db489dc57583b3641fd78b88">getLLVMGlobalFunctions</a>(global);</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  }</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  }</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span> </div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <span class="comment">// Find main function</span></div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> &func : mod)</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  {</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="keywordflow">if</span> (func.getName().equals(<a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a>))</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  assert(<span class="keyword">false</span> && <a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a> <span class="stringliteral">" already defined"</span>);</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  <span class="keywordflow">if</span>(func.getName().equals(<span class="stringliteral">"main"</span>))</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  {</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  orgMain = &func;</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  mainMod = &mod;</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  }</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  }</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  }</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span> </div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="comment">// Only create svf.main when the original main function is found, and also</span></div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="comment">// there are global contructor or destructor functions.</span></div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  <span class="keywordflow">if</span> (orgMain && <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae265a7f3cc7367d62013e0f15cf3d233">getModuleNum</a>() > 0 &&</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  (ctor_funcs.size() > 0 || dtor_funcs.size() > 0))</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  {</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  assert(mainMod && <span class="stringliteral">"Module with main function not found."</span>);</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> & M = *mainMod;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <span class="comment">// char **</span></div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* i8ptr2 = PointerType::getInt8PtrTy(M.getContext())->getPointerTo();</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* i32 = IntegerType::getInt32Ty(M.getContext());</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="comment">// define void @svf.main(i32, i8**, i8**)</span></div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span> <span class="preprocessor">#if (LLVM_VERSION_MAJOR >= 9)</span></div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  FunctionCallee svfmainFn = M.getOrInsertFunction(</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a>,</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  Type::getVoidTy(M.getContext()),</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  i32,i8ptr2,i8ptr2</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  );</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* svfmain = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>>(svfmainFn.getCallee());</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* svfmain = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>>(M.getOrInsertFunction(</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a>,</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  Type::getVoidTy(M.getContext()),</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  i32,i8ptr2,i8ptr2</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  ));</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  svfmain->setCallingConv(llvm::CallingConv::C);</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* block = BasicBlock::Create(M.getContext(), <span class="stringliteral">"entry"</span>, svfmain);</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <a class="code" href="namespaceSVF.html#a94824519e439aeef1568d415b6f7331c">IRBuilder</a> Builder(block);</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  <span class="comment">// emit "call void @ctor()". ctor_funcs is sorted so the functions are</span></div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  <span class="comment">// emitted in the order of priority</span></div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keywordflow">for</span>(<span class="keyword">auto</span> & ctor: ctor_funcs)</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  {</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <span class="keyword">auto</span> target = M.getOrInsertFunction(</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  ctor->getName(),</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  Type::getVoidTy(M.getContext())</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  );</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  Builder.CreateCall(target);</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  }</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  <span class="comment">// main() should be called after all ctor functions and before dtor</span></div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  <span class="comment">// functions.</span></div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  Function::arg_iterator arg_it = svfmain->arg_begin();</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* args[] = {arg_it, arg_it + 1, arg_it + 2 };</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  <span class="keywordtype">size_t</span> cnt = orgMain->arg_size();</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  assert(cnt <= 3 && <span class="stringliteral">"Too many arguments for main()"</span>);</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  Builder.CreateCall(orgMain, llvm::ArrayRef<Value*>(args,args + cnt));</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  <span class="comment">// emit "call void @dtor()". dtor_funcs is sorted so the functions are</span></div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="comment">// emitted in the order of priority</span></div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> &dtor : dtor_funcs)</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  {</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  <span class="keyword">auto</span> target = M.getOrInsertFunction(</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  dtor->getName(),</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  Type::getVoidTy(M.getContext())</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  );</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  Builder.CreateCall(target);</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  }</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="comment">// return;</span></div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  Builder.CreateRetVoid();</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  }</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span> }</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span> </div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span> </div><div class="line"><a name="l00650"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ac7c646a78c989807c52263fc35fb3628"> 650</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#ac7c646a78c989807c52263fc35fb3628">LLVMModuleSet::buildFunToFunMap</a>()</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span> {</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*></a> funDecls, funDefs;</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  <a class="code" href="namespaceSVF.html#a4f21e91ff8eaea5207afe5c60dbd78d7">OrderedSet<string></a> declNames, defNames, intersectNames;</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<string, const Function*></a> NameToFunDefMapTy;</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<string, Set<const Function*></a>> NameToFunDeclsMapTy;</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span> </div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>& mod : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>)</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  {</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  <span class="keywordflow">for</span> (Module::iterator it = mod.begin(), eit = mod.end(); it != eit; ++it)</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  {</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = &*it;</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="keywordflow">if</span> (fun->isDeclaration())</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  {</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  funDecls.insert(fun);</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  declNames.insert(fun->getName().str());</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  }</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  {</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  funDefs.insert(fun);</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  defNames.insert(fun->getName().str());</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  }</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  }</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  }</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="comment">// Find the intersectNames</span></div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  <a class="code" href="namespaceSVF.html#a4f21e91ff8eaea5207afe5c60dbd78d7">OrderedSet<string>::iterator</a> declIter, defIter;</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  declIter = declNames.begin();</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  defIter = defNames.begin();</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  <span class="keywordflow">while</span> (declIter != declNames.end() && defIter != defNames.end())</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  {</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  <span class="keywordflow">if</span> (*declIter < *defIter)</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  {</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  declIter++;</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  }</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  {</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="keywordflow">if</span> (!(*defIter < *declIter))</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  {</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  intersectNames.insert(*declIter);</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  declIter++;</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  }</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  defIter++;</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  }</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  }</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span> </div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  NameToFunDefMapTy nameToFunDefMap;</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*>::iterator</a> it = funDefs.begin(),</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  eit = funDefs.end(); it != eit; ++it)</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  {</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fdef = *it;</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  <span class="keywordtype">string</span> funName = fdef->getName().str();</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  nameToFunDefMap[funName] = fdef;</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  }</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span> </div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  NameToFunDeclsMapTy nameToFunDeclsMap;</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*>::iterator</a> it = funDecls.begin(),</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  eit = funDecls.end(); it != eit; ++it)</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  {</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fdecl = *it;</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  <span class="keywordtype">string</span> funName = fdecl->getName().str();</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  NameToFunDeclsMapTy::iterator mit = nameToFunDeclsMap.find(funName);</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  <span class="keywordflow">if</span> (mit == nameToFunDeclsMap.end())</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  {</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*></a> decls;</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  decls.insert(fdecl);</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  nameToFunDeclsMap[funName] = decls;</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  }</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  {</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*></a> &decls = mit->second;</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  decls.insert(fdecl);</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  }</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  }</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span> </div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*>::iterator</a> it = funDecls.begin(),</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  eit = funDecls.end(); it != eit; ++it)</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  {</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fdecl = *it;</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  <span class="keywordtype">string</span> funName = fdecl->getName().str();</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  NameToFunDefMapTy::iterator mit = nameToFunDefMap.find(funName);</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  <span class="keywordflow">if</span> (mit == nameToFunDefMap.end())</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#aee80b29e5246e3eaa0e30e165346101f">FunDeclToDefMap</a>[fdecl] = mit->second;</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  }</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span> </div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*>::iterator</a> it = funDefs.begin(),</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  eit = funDefs.end(); it != eit; ++it)</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  {</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fdef = *it;</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  <span class="keywordtype">string</span> funName = fdef->getName().str();</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  NameToFunDeclsMapTy::iterator mit = nameToFunDeclsMap.find(funName);</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  <span class="keywordflow">if</span> (mit == nameToFunDeclsMap.end())</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  std::vector<const Function*>& decls = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a377cefaad4b688ab6edf94ba4abe00ee">FunDefToDeclsMap</a>[fdef];</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*>::iterator</a> sit = mit->second.begin(),</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  seit = mit->second.end(); sit != seit; ++sit)</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  {</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  decls.push_back(*sit);</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  }</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  }</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span> }</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span> </div><div class="line"><a name="l00765"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#aaab03cb6ff665bc008c67b866ba81e47"> 765</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#aaab03cb6ff665bc008c67b866ba81e47">LLVMModuleSet::buildGlobalDefToRepMap</a>()</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span> {</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<string, Set<GlobalVariable*></a>> NameToGlobalsMapTy;</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  NameToGlobalsMapTy nameToGlobalsMap;</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &mod : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>)</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  {</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  <span class="comment">// Collect ctor and dtor functions</span></div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  <span class="keywordflow">for</span> (Module::global_iterator it = mod.global_begin(), eit = mod.global_end(); it != eit; ++it)</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  {</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global = &*it;</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <span class="keywordflow">if</span> (global->hasPrivateLinkage())</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  <span class="keywordtype">string</span> <a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a> = global->getName().str();</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  NameToGlobalsMapTy::iterator mit = nameToGlobalsMap.find(name);</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  <span class="keywordflow">if</span> (mit == nameToGlobalsMap.end())</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  {</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<GlobalVariable*></a> globals;</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  globals.insert(global);</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  nameToGlobalsMap[<a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a>] = globals;</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  }</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  {</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<GlobalVariable*></a> &globals = mit->second;</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  globals.insert(global);</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  }</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  }</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  }</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span> </div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  <span class="keywordflow">for</span> (NameToGlobalsMapTy::iterator it = nameToGlobalsMap.begin(),</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  eit = nameToGlobalsMap.end(); it != eit; ++it)</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  {</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<GlobalVariable*></a> &globals = it->second;</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *rep = *(globals.begin());</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<GlobalVariable*>::iterator</a> repit = globals.begin();</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  <span class="keywordflow">while</span> (repit != globals.end())</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  {</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *cur = *repit;</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  <span class="keywordflow">if</span> (cur->hasInitializer())</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  {</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  rep = cur;</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>  }</div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  repit++;</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  }</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<GlobalVariable*>::iterator</a> sit = globals.begin(),</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  seit = globals.end(); sit != seit; ++sit)</div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  {</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *cur = *sit;</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae2a1fa0b908cf372c50af90e62c4bf2b">GlobalDefToRepMap</a>[cur] = rep;</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  }</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  }</div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span> }</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span> </div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span> <span class="comment">// Dump modules to files</span></div><div class="line"><a name="l00819"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ad5ef9421d501b2747d4fb31d4189b53f"> 819</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#ad5ef9421d501b2747d4fb31d4189b53f">LLVMModuleSet::dumpModulesToFile</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> suffix)</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span> {</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>& mod : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>)</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  {</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> moduleName = mod.getName().str();</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> OutputFilename;</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  std::size_t pos = moduleName.rfind(<span class="charliteral">'.'</span>);</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  <span class="keywordflow">if</span> (pos != std::string::npos)</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  OutputFilename = moduleName.substr(0, pos) + suffix;</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  OutputFilename = moduleName + suffix;</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span> </div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  std::error_code EC;</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  <a class="code" href="namespaceSVF.html#a1c7c7ac12791c0ae386283c0a4f127ba">raw_fd_ostream</a> OS(OutputFilename.c_str(), EC, llvm::sys::fs::OF_None);</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span> </div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span> <span class="preprocessor">#if (LLVM_VERSION_MAJOR >= 7)</span></div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  WriteBitcodeToFile(mod, OS);</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  WriteBitcodeToFile(&mod, OS);</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span> </div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  OS.flush();</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  }</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span> }</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span> </div><div class="line"><a name="l00844"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a7d61f479f52e1dc71a4ae7a4d62f3b6a"> 844</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a7d61f479f52e1dc71a4ae7a4d62f3b6a">LLVMModuleSet::setValueAttr</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* val, <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* svfvalue)</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span> {</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a7f8e61cf5d838d7a2e862bc6955f16be">SVFValue2LLVMValue</a>[svfvalue] = val;</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span> </div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a07c785d931cef3c61e3dab4c615770be">LLVMUtil::isPtrInUncalledFunction</a>(val))</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  svfvalue-><a class="code" href="classSVF_1_1SVFValue.html#ac2e5c42d0ac92375c88ef5b3f1b65dc4">setPtrInUncalledFunction</a>();</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a8a77403306e97ab4cb31a56d38bba5be">LLVMUtil::isConstDataOrAggData</a>(val))</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  svfvalue-><a class="code" href="classSVF_1_1SVFValue.html#afe1de41ca3215b325d0ca61814c6bd6b">setConstDataOrAggData</a>();</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span> </div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a>* glob = SVFUtil::dyn_cast<SVFGlobalValue>(svfvalue))</div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  {</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* llvmVal = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a9e0c786488dfdc4605d4cbcf9943c85a">LLVMUtil::getGlobalRep</a>(val);</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  assert(SVFUtil::isa<GlobalValue>(llvmVal) && <span class="stringliteral">"not a GlobalValue?"</span>);</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  glob->setDefGlobalForMultipleModule(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a3cbba2eb702a3481478b2590dfffa352">getSVFGlobalValue</a>(SVFUtil::cast<GlobalValue>(llvmVal)));</div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  }</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svffun = SVFUtil::dyn_cast<SVFFunction>(svfvalue))</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  {</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* func = SVFUtil::cast<Function>(val);</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  svffun->setIsNotRet(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a651b6a1cf3665277d2241220bb145aed">LLVMUtil::functionDoesNotRet</a>(func));</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  svffun->setIsUncalledFunction(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a2c61d741afbcfa853b505cd391f29f9b">LLVMUtil::isUncalledFunction</a>(func));</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  svffun->setDefFunForMultipleModule(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a50fc24901350df9db890ba16a9b87e33">getSVFFunction</a>(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a3d34fcdfc98add848a34fd5259c11eb2">LLVMUtil::getDefFunForMultipleModule</a>(func)));</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  }</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span> </div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  svfvalue-><a class="code" href="classSVF_1_1SVFValue.html#a588acec1904d440797ca4500f63f7d28">setSourceLoc</a>(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a8e4add30bd0ce00d3f2aa2e31c64fef8">LLVMUtil::getSourceLoc</a>(val));</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span> }</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span> </div><div class="line"><a name="l00870"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a25821b0feeb3b08e00ec9d444520b727"> 870</a></span> <a class="code" href="classSVF_1_1SVFConstantData.html">SVFConstantData</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a25821b0feeb3b08e00ec9d444520b727">LLVMModuleSet::getSVFConstantData</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7332f8059ea95472dcc231de884a5768">ConstantData</a>* cd)</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span> {</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  LLVMConst2SVFConstMap::const_iterator it = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a4b94c96898dbbc71bc1cee04786cf3dc">LLVMConst2SVFConst</a>.find(cd);</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="keywordflow">if</span>(it!=<a class="code" href="classSVF_1_1LLVMModuleSet.html#a4b94c96898dbbc71bc1cee04786cf3dc">LLVMConst2SVFConst</a>.end())</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  {</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  assert(SVFUtil::isa<SVFConstantData>(it->second) && <span class="stringliteral">"not a SVFConstantData type!"</span>);</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="keywordflow">return</span> SVFUtil::cast<SVFConstantData>(it->second);</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  }</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  {</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  <a class="code" href="classSVF_1_1SVFConstantData.html">SVFConstantData</a>* svfcd = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* cint = SVFUtil::dyn_cast<ConstantInt>(cd))</div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  svfcd = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFConstantInt.html">SVFConstantInt</a>(cd->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(cint->getType()), cint->getZExtValue(),cint->getSExtValue());</div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad49e4222ba46d9490b87a80df8b46800">ConstantFP</a>* cfp = SVFUtil::dyn_cast<ConstantFP>(cd))</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  {</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  <span class="keywordtype">double</span> dval = 0;</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  <span class="keywordflow">if</span>(cfp->isNormalFP() && (&cfp->getValueAPF().getSemantics()== &llvm::APFloatBase::IEEEdouble()))</div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  dval = cfp->getValueAPF().convertToDouble();</div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  svfcd = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFConstantFP.html">SVFConstantFP</a>(cd->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(cd->getType()), dval);</div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  }</div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa<ConstantPointerNull>(cd))</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  svfcd = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFConstantNullPtr.html">SVFConstantNullPtr</a>(cd->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(cd->getType()));</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<UndefValue>(cd))</div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  svfcd = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFBlackHoleValue.html">SVFBlackHoleValue</a>(cd->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(cd->getType()));</div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  svfcd = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFConstantData.html">SVFConstantData</a>(cd->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(cd->getType()));</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>->addConstant(svfcd);</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#af4bd487b3b6efe55bf869b869f5e8a80">addConstantDataMap</a>(cd,svfcd);</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  <span class="keywordflow">return</span> svfcd;</div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  }</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span> }</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span> </div><div class="line"><a name="l00902"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a74256f36f0fdc242df9729906c34efbc"> 902</a></span> <a class="code" href="classSVF_1_1SVFConstant.html">SVFConstant</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a74256f36f0fdc242df9729906c34efbc">LLVMModuleSet::getOtherSVFConstant</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7e230c0cba2e3a7c2e5a5f2ee7d88af9">Constant</a>* oc)</div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span> {</div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span>  LLVMConst2SVFConstMap::const_iterator it = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a4b94c96898dbbc71bc1cee04786cf3dc">LLVMConst2SVFConst</a>.find(oc);</div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  <span class="keywordflow">if</span>(it!=<a class="code" href="classSVF_1_1LLVMModuleSet.html#a4b94c96898dbbc71bc1cee04786cf3dc">LLVMConst2SVFConst</a>.end())</div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  {</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  <span class="keywordflow">return</span> it->second;</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  }</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  {</div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  <a class="code" href="classSVF_1_1SVFConstant.html">SVFConstant</a>* svfoc = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFConstant.html">SVFConstant</a>(oc->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(oc->getType()));</div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>->addConstant(svfoc);</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5badf03aeb1ebda02bc186bbb58a892a">addOtherConstantMap</a>(oc,svfoc);</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  <span class="keywordflow">return</span> svfoc;</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  }</div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span> }</div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span> </div><div class="line"><a name="l00918"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a0ef17c1d5e6a95c597d2334ea577a965"> 918</a></span> <a class="code" href="classSVF_1_1SVFOtherValue.html">SVFOtherValue</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a0ef17c1d5e6a95c597d2334ea577a965">LLVMModuleSet::getSVFOtherValue</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* ov)</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span> {</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  LLVMValue2SVFOtherValueMap::const_iterator it = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ac3e70bd338be3a54330be5dc10321eb3">LLVMValue2SVFOtherValue</a>.find(ov);</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  <span class="keywordflow">if</span>(it!=<a class="code" href="classSVF_1_1LLVMModuleSet.html#ac3e70bd338be3a54330be5dc10321eb3">LLVMValue2SVFOtherValue</a>.end())</div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  {</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  <span class="keywordflow">return</span> it->second;</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  }</div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  {</div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  <a class="code" href="classSVF_1_1SVFOtherValue.html">SVFOtherValue</a>* svfov = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  <span class="keywordflow">if</span>(SVFUtil::isa<MetadataAsValue>(ov))</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  svfov = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFMetadataAsValue.html">SVFMetadataAsValue</a>(ov->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ov->getType()));</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  svfov = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFOtherValue.html">SVFOtherValue</a>(ov->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ov->getType()));</div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>->addOtherValue(svfov);</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a023ea6f179433fa4d007c98ddc38e3c5">addOtherValueMap</a>(ov,svfov);</div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  <span class="keywordflow">return</span> svfov;</div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  }</div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span> }</div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span> </div><div class="line"><a name="l00938"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392"> 938</a></span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">LLVMModuleSet::getSVFValue</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* value)</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span> {</div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = SVFUtil::dyn_cast<Function>(value))</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a50fc24901350df9db890ba16a9b87e33">getSVFFunction</a>(fun);</div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* bb = SVFUtil::dyn_cast<BasicBlock>(value))</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(bb);</div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = SVFUtil::dyn_cast<Instruction>(value))</div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae74f307b6f96950ceedb2c375ef1c3a3">getSVFInstruction</a>(inst);</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a58cdfbc4160cae08745b67844ac29801">Argument</a>* arg = SVFUtil::dyn_cast<Argument>(value))</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#ad3f66b40ad360003845253f452d6a711">getSVFArgument</a>(arg);</div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7e230c0cba2e3a7c2e5a5f2ee7d88af9">Constant</a>* cons = SVFUtil::dyn_cast<Constant>(value))</div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  {</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7332f8059ea95472dcc231de884a5768">ConstantData</a>* cd = SVFUtil::dyn_cast<ConstantData>(cons))</div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a25821b0feeb3b08e00ec9d444520b727">getSVFConstantData</a>(cd);</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a>* glob = SVFUtil::dyn_cast<GlobalValue>(cons))</div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3cbba2eb702a3481478b2590dfffa352">getSVFGlobalValue</a>(glob);</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a74256f36f0fdc242df9729906c34efbc">getOtherSVFConstant</a>(cons);</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  }</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a0ef17c1d5e6a95c597d2334ea577a965">getSVFOtherValue</a>(value);</div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span> }</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span> </div><div class="line"><a name="l00961"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a610a7777a48132caadec167c8109f044"> 961</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a610a7777a48132caadec167c8109f044">LLVMModuleSet::getLLVMType</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* T)<span class="keyword"> const</span></div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span> <span class="keyword"></span>{</div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  <span class="keywordflow">for</span>(LLVMType2SVFTypeMap::const_iterator it = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>.begin(), eit = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>.end(); it!=eit; ++it)</div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  {</div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  <span class="keywordflow">if</span> (it->second == T)</div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>  <span class="keywordflow">return</span> it->first;</div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  }</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"can't find the corresponding LLVM Type"</span>);</div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  abort();</div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span> }</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span> </div><div class="line"><a name="l00975"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99"> 975</a></span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">LLVMModuleSet::getSVFType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* T)</div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span> {</div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span>  assert(T);</div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  LLVMType2SVFTypeMap::const_iterator it = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>.find(T);</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  <span class="keywordflow">if</span> (it!=<a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>.end())</div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  <span class="keywordflow">return</span> it->second;</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  {</div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* svfType = <a class="code" href="classSVF_1_1LLVMModuleSet.html#aab7b08db9252ef7e21e54d019f44b073">addSVFTypeInfo</a>(T);</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* stinfo = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a1f6cc76c996a0577b20b8cedd83fff92">collectTypeInfo</a>(T);</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  svfType->setTypeInfo(stinfo);</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  <a class="code" href="namespaceSVF.html#aa962cc1d782cc46553251e96b64a754b">PointerType</a>* ptrTy = PointerType::getInt8PtrTy(<a class="code" href="classSVF_1_1LLVMModuleSet.html#ac1a9d20d62066ec4e181fad223669e32">getContext</a>())->getPointerTo();</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  svfType->setPointerTo(SVFUtil::cast<SVFPointerType>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ptrTy)));</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  <span class="keywordflow">return</span> svfType;</div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  }</div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span> }</div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span> </div><div class="line"><a name="l00994"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a1f6cc76c996a0577b20b8cedd83fff92"> 994</a></span> <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a1f6cc76c996a0577b20b8cedd83fff92">LLVMModuleSet::collectTypeInfo</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* T)</div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span> {</div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* stinfo = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span> </div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span>  Type2TypeInfoMap::iterator tit = <a class="code" href="classSVF_1_1LLVMModuleSet.html#af2c555af91679d9e6d3009547ee11486">Type2TypeInfo</a>.find(T);</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  <span class="keywordflow">if</span>(tit!=<a class="code" href="classSVF_1_1LLVMModuleSet.html#af2c555af91679d9e6d3009547ee11486">Type2TypeInfo</a>.end())</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  {</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  stinfo = tit->second.get();</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  }</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  {</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a146d286041987860388da3d8bc85cee3">ArrayType</a>* aty = SVFUtil::dyn_cast<ArrayType>(T))</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  {</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  stinfo = <a class="code" href="classSVF_1_1LLVMModuleSet.html#aa8de934358332505d4805db137d8ec29">collectArrayInfo</a>(aty);</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#af2c555af91679d9e6d3009547ee11486">Type2TypeInfo</a>[T] = std::unique_ptr<StInfo>(stinfo);</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  }</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2bf58575ac7d068e0f1a4cf953b9e6cb">StructType</a>* sty = SVFUtil::dyn_cast<StructType>(T))</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  {</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> nf;</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  stinfo = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a93315673be515ce5c2fabd36fa927128">collectStructInfo</a>(sty, nf);</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#af2c555af91679d9e6d3009547ee11486">Type2TypeInfo</a>[T] = std::unique_ptr<StInfo>(stinfo);</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  <span class="comment">//Record the size of the complete struct and update max_struct.</span></div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  <span class="keywordflow">if</span> (nf > <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5552135a27684cbe4d2a5ed346f64644">symInfo</a>-><a class="code" href="classSVF_1_1SymbolTableInfo.html#abb8550c9ef856e45cb7675c3796f9a35">maxStSize</a>)</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  {</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5552135a27684cbe4d2a5ed346f64644">symInfo</a>-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a0c1143eff451edf8ea47d4487a8d3a55">maxStruct</a> = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(sty);</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5552135a27684cbe4d2a5ed346f64644">symInfo</a>-><a class="code" href="classSVF_1_1SymbolTableInfo.html#abb8550c9ef856e45cb7675c3796f9a35">maxStSize</a> = nf;</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  }</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  }</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  {</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  <span class="keyword">auto</span> stinfo_own = std::make_unique<StInfo>(1);</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  stinfo = stinfo_own.get();</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#af2c555af91679d9e6d3009547ee11486">Type2TypeInfo</a>[T] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a72502f7f536418621485e90ab98c2016">std::move</a>(stinfo_own);</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#abcd6d9513511e6a306189a87fe3dfa06">collectSimpleTypeInfo</a>(stinfo, T);</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  }</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span> </div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span> </div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  }</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  <span class="keywordflow">return</span> stinfo;</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span> }</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span> </div><div class="line"><a name="l01036"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#aab7b08db9252ef7e21e54d019f44b073"> 1036</a></span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#aab7b08db9252ef7e21e54d019f44b073">LLVMModuleSet::addSVFTypeInfo</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* T)</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span> {</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  assert(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>.find(T)==<a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>.end() && <span class="stringliteral">"SVFType has been added before"</span>);</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span> </div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>  <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* svftype = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aa962cc1d782cc46553251e96b64a754b">PointerType</a>* pt = SVFUtil::dyn_cast<PointerType>(T))</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  svftype = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFPointerType.html">SVFPointerType</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#abba4111230f6009bbf50518ee36a9870">LLVMUtil::getPtrElementType</a>(pt)));</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<IntegerType>(T))</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  svftype = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFIntergerType.html">SVFIntergerType</a>();</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a6ec0236303089a01fd9da36a8bb84e0a">FunctionType</a>* ft = SVFUtil::dyn_cast<FunctionType>(T))</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  svftype = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFFunctionType.html">SVFFunctionType</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ft->getReturnType()));</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<StructType>(T))</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>  svftype = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFStructType.html">SVFStructType</a>();</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<ArrayType>(T))</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  svftype = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFArrayType.html">SVFArrayType</a>();</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  svftype = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFOtherType.html">SVFOtherType</a>(T->isSingleValueType());</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5552135a27684cbe4d2a5ed346f64644">symInfo</a>-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a91083d9504ae5d220b28e0b3e461d4aa">addTypeInfo</a>(svftype);</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>[T] = svftype;</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <span class="keywordflow">return</span> svftype;</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span> }</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span> </div><div class="line"><a name="l01061"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#aa8de934358332505d4805db137d8ec29"> 1061</a></span> <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#aa8de934358332505d4805db137d8ec29">LLVMModuleSet::collectArrayInfo</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a146d286041987860388da3d8bc85cee3">ArrayType</a>* ty)</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span> {</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> totalElemNum = ty->getNumElements();</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* elemTy = ty->getElementType();</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>  <span class="keywordflow">while</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a146d286041987860388da3d8bc85cee3">ArrayType</a>* aty = SVFUtil::dyn_cast<ArrayType>(elemTy))</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>  {</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  totalElemNum *= aty->getNumElements();</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  elemTy = aty->getElementType();</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  }</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span> </div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* stinfo = <span class="keyword">new</span> <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>(totalElemNum);</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span> </div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  <span class="keywordflow">if</span>(totalElemNum==0)</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  {</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#aae0736a5e99b11571af52e28500a6f9c">addFldWithType</a>(0, <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(elemTy), 0);</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a1a07c2b1415c29d7d70791c6dfe602a3">setNumOfFieldsAndElems</a>(1, 1);</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>().push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(elemTy));</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(elemTy));</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  <span class="keywordflow">return</span> stinfo;</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>  }</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span> </div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>  <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* elemStInfo = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a1f6cc76c996a0577b20b8cedd83fff92">collectTypeInfo</a>(elemTy);</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> nfE = elemStInfo-><a class="code" href="classSVF_1_1StInfo.html#ae5fad367673315da57a604e64b5889f0">getNumOfFlattenFields</a>();</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> j = 0; j < nfE; j++)</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  {</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* fieldTy = elemStInfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>()[j];</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>().push_back(fieldTy);</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  }</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span> </div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> outArrayElemNum = ty->getNumElements();</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i < outArrayElemNum; i++)</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#aae0736a5e99b11571af52e28500a6f9c">addFldWithType</a>(0, <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(elemTy), (i * nfE * totalElemNum)/outArrayElemNum);</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span> </div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i < totalElemNum; i++)</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  {</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> j = 0; j < nfE; j++)</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  {</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().push_back(elemStInfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>()[j]);</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  }</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  }</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span> </div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  assert(stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().size() == nfE * totalElemNum && <span class="stringliteral">"typeForArray size incorrect!!!"</span>);</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a1a07c2b1415c29d7d70791c6dfe602a3">setNumOfFieldsAndElems</a>(nfE, nfE * totalElemNum);</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span> </div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  <span class="keywordflow">return</span> stinfo;</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span> }</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span> </div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span> </div><div class="line"><a name="l01118"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a93315673be515ce5c2fabd36fa927128"> 1118</a></span> <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a93315673be515ce5c2fabd36fa927128">LLVMModuleSet::collectStructInfo</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2bf58575ac7d068e0f1a4cf953b9e6cb">StructType</a> *sty, <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> &nf)</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span> {</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* stinfo = <span class="keyword">new</span> <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>(1);</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span> </div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>  <span class="comment">// Number of fields after flattening the struct</span></div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>  nf = 0;</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  <span class="comment">// The offset when considering array stride info</span></div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> strideOffset = 0;</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>  <span class="keywordflow">for</span> (StructType::element_iterator it = sty->element_begin(), ie =</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  sty->element_end(); it != ie; ++it)</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>  {</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* et = *it;</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#aae0736a5e99b11571af52e28500a6f9c">addFldWithType</a>(nf, <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(et), strideOffset);</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span> </div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  <span class="keywordflow">if</span> (SVFUtil::isa<StructType, ArrayType>(et))</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>  {</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>  <a class="code" href="classSVF_1_1StInfo.html">StInfo</a> * subStinfo = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a1f6cc76c996a0577b20b8cedd83fff92">collectTypeInfo</a>(et);</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> nfE = subStinfo-><a class="code" href="classSVF_1_1StInfo.html#ae5fad367673315da57a604e64b5889f0">getNumOfFlattenFields</a>();</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  <span class="comment">//Copy ST's info, whose element 0 is the size of ST itself.</span></div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> j = 0; j < nfE; j++)</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>  {</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* elemTy = subStinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>()[j];</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>().push_back(elemTy);</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  }</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  nf += nfE;</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  strideOffset += nfE * subStinfo-><a class="code" href="classSVF_1_1StInfo.html#af5094ec542f345d214a682d4138cf690">getStride</a>();</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> tpi = 0; tpi < subStinfo-><a class="code" href="classSVF_1_1StInfo.html#af5094ec542f345d214a682d4138cf690">getStride</a>(); tpi++)</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  {</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> tpj = 0; tpj < nfE; tpj++)</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  {</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().push_back(subStinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>()[tpj]);</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>  }</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>  }</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>  }</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  <span class="keywordflow">else</span> <span class="comment">//simple type</span></div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>  {</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>  nf += 1;</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>  strideOffset += 1;</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>().push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(et));</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(et));</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  }</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  }</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span> </div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  assert(stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().size() == strideOffset && <span class="stringliteral">"typeForStruct size incorrect!"</span>);</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a1a07c2b1415c29d7d70791c6dfe602a3">setNumOfFieldsAndElems</a>(nf,strideOffset);</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span> </div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  <span class="keywordflow">return</span> stinfo;</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span> }</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span> </div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span> </div><div class="line"><a name="l01173"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#abcd6d9513511e6a306189a87fe3dfa06"> 1173</a></span> <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#abcd6d9513511e6a306189a87fe3dfa06">LLVMModuleSet::collectSimpleTypeInfo</a>(<a class="code" href="classSVF_1_1StInfo.html">StInfo</a> * stinfo, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* ty)</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span> {</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#aae0736a5e99b11571af52e28500a6f9c">addFldWithType</a>(0, <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ty), 0);</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span> </div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>().push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ty));</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ty));</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a1a07c2b1415c29d7d70791c6dfe602a3">setNumOfFieldsAndElems</a>(1,1);</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span> </div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  <span class="keywordflow">return</span> stinfo;</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> }</div><div class="ttc" id="classSVF_1_1SymbolTableBuilder_html"><div class="ttname"><a href="classSVF_1_1SymbolTableBuilder.html">SVF::SymbolTableBuilder</a></div><div class="ttdef"><b>Definition:</b> <a href="SymbolTableBuilder_8h_source.html#l00042">SymbolTableBuilder.h:42</a></div></div>
|
|
69
|
+
<a href="LLVMModule_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===----- SVFModule.cpp Base class of pointer analyses ---------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// Copyright (C) <2013-2017> <Yulei Sui></span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> </div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment">// along with this program. If not, see <http://www.gnu.org/licenses/>.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"> * SVFModule.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> * Created on: Aug 4, 2017</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * Author: Xiaokang Fan</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include <queue></span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include "<a class="code" href="SVFModule_8h.html">SVFIR/SVFModule.h</a>"</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include "<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>"</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include "<a class="code" href="BasicTypes_8h.html">SVF-LLVM/BasicTypes.h</a>"</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="preprocessor">#include "<a class="code" href="LLVMUtil_8h.html">SVF-LLVM/LLVMUtil.h</a>"</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="preprocessor">#include "<a class="code" href="BreakConstantExpr_8h.html">SVF-LLVM/BreakConstantExpr.h</a>"</span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="preprocessor">#include "<a class="code" href="SymbolTableBuilder_8h.html">SVF-LLVM/SymbolTableBuilder.h</a>"</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="preprocessor">#include "<a class="code" href="SVFGBuilder_8h.html">MSSA/SVFGBuilder.h</a>"</span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="preprocessor">#include "llvm/Support/FileSystem.h"</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="keyword">using namespace </span><a class="code" href="namespacestd.html">std</a>;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> </div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="comment">/*</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="comment"> svf.main() is used to model the real entry point of a C++ program, which</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="comment"> initializes all global C++ objects and then call main().</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> <span class="comment"> LLVM may generate two global arrays @llvm.global_ctors and @llvm.global_dtors</span></div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="comment"> that contain constructor and destructor functions for global variables. They</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="comment"> are not called explicitly, so we have to add them in the svf.main function.</span></div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="comment"> The order to call these constructor and desctructor functions are also</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="comment"> specified in the global arrays.</span></div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="comment"> Related part in LLVM language reference:</span></div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> <span class="comment"> https://llvm.org/docs/LangRef.html#the-llvm-global-ctors-global-variable</span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> <span class="comment"> For example, given a "int main(int argc, char * argv[])", the corresponding</span></div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> <span class="comment"> svf.main will be generated as follows:</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> <span class="comment"> define void @svf.main(i32, i8**, i8**) {</span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> <span class="comment"> entry:</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> <span class="comment"> call void @ctor1()</span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> <span class="comment"> call void @ctor2()</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> <span class="comment"> %3 = call i32 @main(i32 %0, i8** %1)</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> <span class="comment"> call void @dtor1()</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> <span class="comment"> call void @dtor2()</span></div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> <span class="comment"> ret void</span></div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> <span class="comment"> }</span></div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> <span class="comment">*/</span></div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> </div><div class="line"><a name="l00067"></a><span class="lineno"><a class="line" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b"> 67</a></span> <span class="preprocessor">#define SVF_MAIN_FUNC_NAME "svf.main"</span></div><div class="line"><a name="l00068"></a><span class="lineno"><a class="line" href="LLVMModule_8cpp.html#aa18802f2f60ef8030c66a42f20f285af"> 68</a></span> <span class="preprocessor">#define SVF_GLOBAL_CTORS "llvm.global_ctors"</span></div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="LLVMModule_8cpp.html#a9fd6e28e6ed93f65a20a348ab0646320"> 69</a></span> <span class="preprocessor">#define SVF_GLOBAL_DTORS "llvm.global_dtors"</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> </div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html">LLVMModuleSet</a> *LLVMModuleSet::llvmModuleSet = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> SVFModule::pagReadFromTxt = <span class="stringliteral">""</span>;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> </div><div class="line"><a name="l00074"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#aaa23ad390e9148ba6302fea8d4595080"> 74</a></span> LLVMModuleSet::LLVMModuleSet(): svfModule(nullptr), cxts(nullptr), preProcessed(<a class="code" href="cJSON_8cpp.html#a65e9886d74aaee76545e83dd09011727">false</a>)</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> {</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5552135a27684cbe4d2a5ed346f64644">symInfo</a> = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>();</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span> }</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span> </div><div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a57b4faba42847323d31cd5216146a7ec"> 79</a></span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a57b4faba42847323d31cd5216146a7ec">LLVMModuleSet::~LLVMModuleSet</a>()</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span> {</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> </div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span> }</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> </div><div class="line"><a name="l00084"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ae919327019b5014f64b754dbdeb07f75"> 84</a></span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae919327019b5014f64b754dbdeb07f75">LLVMModuleSet::buildSVFModule</a>(<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &mod)</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> {</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="keywordtype">double</span> startSVFModuleTime = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVFStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a> = std::make_unique<SVFModule>(mod.getModuleIdentifier());</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>.emplace_back(mod);</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> </div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#af8edfe08027020f14b81b44362c6018e">build</a>();</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordtype">double</span> endSVFModuleTime = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVFStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <a class="code" href="classSVF_1_1SVFStat.html#aa4950ec26b66a085ad38ac154b789db5">SVFStat::timeOfBuildingLLVMModule</a> = (endSVFModuleTime - startSVFModuleTime)/<a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span> </div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#afb6ac5d4e334d6e3acb66c8e33ae8d18">build_symbol_table</a>();</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> </div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>.get();</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> }</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> </div><div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a1f8e769251c89433311eeb6f98d115e9"> 99</a></span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae919327019b5014f64b754dbdeb07f75">LLVMModuleSet::buildSVFModule</a>(<span class="keyword">const</span> std::vector<std::string> &moduleNameVec)</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span> {</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <span class="keywordtype">double</span> startSVFModuleTime = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVFStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> </div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  assert(<a class="code" href="classSVF_1_1LLVMModuleSet.html#ac59b07cafcbacc950eefea4082425b63">llvmModuleSet</a> && <span class="stringliteral">"LLVM Module set needs to be created!"</span>);</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> </div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a298966366b02d0a34f409c2c77da3789">loadModules</a>(moduleNameVec);</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> </div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="keywordflow">if</span>(!moduleNameVec.empty())</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a> = std::make_unique<SVFModule>(*moduleNameVec.begin());</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a> = std::make_unique<SVFModule>();</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> </div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#af8edfe08027020f14b81b44362c6018e">build</a>();</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> </div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keywordtype">double</span> endSVFModuleTime = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVFStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <a class="code" href="classSVF_1_1SVFStat.html#aa4950ec26b66a085ad38ac154b789db5">SVFStat::timeOfBuildingLLVMModule</a> = (endSVFModuleTime - startSVFModuleTime)/<a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> </div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#afb6ac5d4e334d6e3acb66c8e33ae8d18">build_symbol_table</a>();</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span> </div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>.get();</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span> }</div><div class="line"><a name="l00121"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#afb6ac5d4e334d6e3acb66c8e33ae8d18"> 121</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#afb6ac5d4e334d6e3acb66c8e33ae8d18">LLVMModuleSet::build_symbol_table</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span> <span class="keyword"></span>{</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keywordtype">double</span> startSymInfoTime = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVFStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keywordflow">if</span> (!<a class="code" href="classSVF_1_1SVFModule.html#a1357c876eccedd58b3abe68875b3a570">SVFModule::pagReadFromTXT</a>())</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  {</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"Building Symbol table ...\n"</span>));</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <a class="code" href="classSVF_1_1SymbolTableBuilder.html">SymbolTableBuilder</a> builder(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5552135a27684cbe4d2a5ed346f64644">symInfo</a>);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  builder.<a class="code" href="classSVF_1_1SymbolTableBuilder.html#aef0bb1e88d0b69313c673318f7b7cb5f">buildMemModel</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>.get());</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  }</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <span class="keywordtype">double</span> endSymInfoTime = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">SVFStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <a class="code" href="classSVF_1_1SVFStat.html#ae89293bc063bdc74a988e9c37c70321e">SVFStat::timeOfBuildingSymbolTable</a> = (endSymInfoTime - startSymInfoTime)/<a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span> }</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span> </div><div class="line"><a name="l00135"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#af8edfe08027020f14b81b44362c6018e"> 135</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#af8edfe08027020f14b81b44362c6018e">LLVMModuleSet::build</a>()</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> {</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a14b0b55d397d6f8a5dfe3b574021f801">preProcessed</a>==<span class="keyword">false</span>)</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8b5f24c873db1f6a0614d1dac48bb4bb">prePassSchedule</a>();</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> </div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ac7c646a78c989807c52263fc35fb3628">buildFunToFunMap</a>();</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#aaab03cb6ff665bc008c67b866ba81e47">buildGlobalDefToRepMap</a>();</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> </div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a3a718b0a27c2d13878c0718af97ad73d">Options::SVFMain</a>())</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8af6b911b728713f66f7c809d5c0fbf1">addSVFMain</a>();</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> </div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a4ca8c4678a7fefe26372fc1f4b2880fd">createSVFDataStructure</a>();</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ac6a5540354696f4c9170e0a5832ba70e">initSVFFunction</a>();</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span> }</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> </div><div class="line"><a name="l00150"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a4ca8c4678a7fefe26372fc1f4b2880fd"> 150</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a4ca8c4678a7fefe26372fc1f4b2880fd">LLVMModuleSet::createSVFDataStructure</a>()</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> {</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> </div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>& mod : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>)</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  {</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <span class="keywordflow">for</span> (Module::const_iterator it = mod.begin(), eit = mod.end(); it != eit; ++it)</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  {</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* func = &*it;</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html">SVFLoopAndDomInfo</a>* ld = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html">SVFLoopAndDomInfo</a>();</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfFunc = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>(func->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(func->getType()), SVFUtil::cast<SVFFunctionType>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(func->getFunctionType())), func->isDeclaration(), <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a4638a12f5481dff947b59cf8353e619b">LLVMUtil::isIntrinsicFun</a>(func), func->hasAddressTaken(), func->isVarArg(), ld);</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>->addFunctionSet(svfFunc);</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab671d5bb9ca5761e2b438a4d4da229cf">addFunctionMap</a>(func,svfFunc);</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="keywordflow">for</span> (Function::const_arg_iterator I = func->arg_begin(), E = func->arg_end(); I != E; ++I)</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  {</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a58cdfbc4160cae08745b67844ac29801">Argument</a>* arg = &*I;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <a class="code" href="classSVF_1_1SVFArgument.html">SVFArgument</a>* svfarg = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFArgument.html">SVFArgument</a>(arg->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(arg->getType()), svfFunc, arg->getArgNo(), <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a428bd75b33fab60988d8758090712f29">LLVMUtil::isArgOfUncalledFunction</a>(arg));</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  svfFunc-><a class="code" href="classSVF_1_1SVFFunction.html#ad865b8440a6e0d5d212798d2213e1e9c">addArgument</a>(svfarg);</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5595ec3f7582934dc499770825bf5373">addArgumentMap</a>(arg,svfarg);</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  }</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> </div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keywordflow">for</span> (Function::const_iterator bit = func->begin(), ebit = func->end(); bit != ebit; ++bit)</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  {</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* bb = &*bit;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* svfBB = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>(bb->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(bb->getType()), svfFunc);</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  svfFunc-><a class="code" href="classSVF_1_1SVFFunction.html#a0d5031bd11b6372803082111ec2cb4f6">addBasicBlock</a>(svfBB);</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3eaadb33cd21d0bd868526b5ddb051d9">addBasicBlockMap</a>(bb,svfBB);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keywordflow">for</span> (BasicBlock::const_iterator iit = bb->begin(), eiit = bb->end(); iit != eiit; ++iit)</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  {</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = &*iit;</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* svfInst = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* call = SVFUtil::dyn_cast<CallBase>(inst))</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  {</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF_1_1cppUtil.html#aab1dce633f9a03796c208b6fba2bd2b4">cppUtil::isVirtualCallSite</a>(call))</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  svfInst = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFVirtualCallInst.html">SVFVirtualCallInst</a>(call->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(call->getType()), svfBB,call->getFunctionType()->isVarArg(),inst->isTerminator());</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  svfInst = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFCallInst.html">SVFCallInst</a>(call->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(call->getType()), svfBB,call->getFunctionType()->isVarArg(),inst->isTerminator());</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  }</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  {</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  svfInst = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>(inst->getName().str(),<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(inst->getType()), svfBB, inst->isTerminator(), SVFUtil::isa<ReturnInst>(inst));</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  }</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  svfBB-><a class="code" href="classSVF_1_1SVFBasicBlock.html#ac1b15d8f9c2499add8dbc889ae5cab65">addInstruction</a>(svfInst);</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a172084437a8450314a17f7085a32b5d2">addInstructionMap</a>(inst,svfInst);</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  }</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  }</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  }</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> </div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <span class="keywordflow">for</span> (Module::const_global_iterator it = mod.global_begin(),</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  eit = mod.global_end(); it != eit; ++it)</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  {</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a>* global = &*it;</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a>* svfglobal = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a>(global->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(global->getType()));</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>->addGlobalSet(svfglobal);</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a7de84e7817406867b173e1591e0681ac">addGlobalValueMap</a>(global,svfglobal);</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  }</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> </div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  <span class="keywordflow">for</span> (Module::const_alias_iterator it = mod.alias_begin(),</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  eit = mod.alias_end(); it != eit; ++it)</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  {</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a0fd33072b099f61eaa642e94ed0c03fc">GlobalAlias</a> *alias = &*it;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a>* svfalias = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a>(alias->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(alias->getType()));</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>->addAliasSet(svfalias);</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a7de84e7817406867b173e1591e0681ac">addGlobalValueMap</a>(alias,svfalias);</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  }</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  }</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span> }</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span> </div><div class="line"><a name="l00221"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ac6a5540354696f4c9170e0a5832ba70e"> 221</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#ac6a5540354696f4c9170e0a5832ba70e">LLVMModuleSet::initSVFFunction</a>()</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span> {</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>& mod : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>)</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keywordflow">for</span> (Module::iterator it = mod.begin(), eit = mod.end(); it != eit; ++it)</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  {</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* f = &*it;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svffun = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a50fc24901350df9db890ba16a9b87e33">getSVFFunction</a>(f);</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a20162d2894d6a12ba29410311fba4002">initSVFBasicBlock</a>(f);</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> </div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">SVFUtil::isExtCall</a>(svffun) == <span class="keyword">false</span>)</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  {</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8ba9092747108e0289014d52465a692d">initDomTree</a>(svffun, f);</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  }</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  }</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  }</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span> }</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> </div><div class="line"><a name="l00240"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a20162d2894d6a12ba29410311fba4002"> 240</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a20162d2894d6a12ba29410311fba4002">LLVMModuleSet::initSVFBasicBlock</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* func)</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span> {</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordflow">for</span> (Function::const_iterator bit = func->begin(), ebit = func->end(); bit != ebit; ++bit)</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  {</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* bb = &*bit;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* svfbb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(bb);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a3436a988bf80c021cd8022fb445b66d5">succ_const_iterator</a> succ_it = succ_begin(bb); succ_it != succ_end(bb); succ_it++)</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  {</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* svf_scc_bb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(*succ_it);</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  svfbb-><a class="code" href="classSVF_1_1SVFBasicBlock.html#abfe3a1ce5fa364d9db7cd2d0e6a144ff">addSuccBasicBlock</a>(svf_scc_bb);</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a5c943191dc4e242704943e5f594ae99e">const_pred_iterator</a> pred_it = pred_begin(bb); pred_it != pred_end(bb); pred_it++)</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  {</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* svf_pred_bb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(*pred_it);</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  svfbb-><a class="code" href="classSVF_1_1SVFBasicBlock.html#a38f8fdd93ef7222f408cbbb2a98a1cd5">addPredBasicBlock</a>(svf_pred_bb);</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  }</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordflow">for</span> (BasicBlock::const_iterator iit = bb->begin(), eiit = bb->end(); iit != eiit; ++iit)</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  {</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = &*iit;</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* call = SVFUtil::dyn_cast<CallBase>(inst))</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  {</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* svfinst = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae74f307b6f96950ceedb2c375ef1c3a3">getSVFInstruction</a>(call);</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <a class="code" href="classSVF_1_1SVFCallInst.html">SVFCallInst</a>* svfcall = SVFUtil::cast<SVFCallInst>(svfinst);</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* callee = <a class="code" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">getSVFValue</a>(call->getCalledOperand()->stripPointerCasts());</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  svfcall-><a class="code" href="classSVF_1_1SVFCallInst.html#a6dd304f555d2d2388c4430e57b0d2b91">setCalledOperand</a>(callee);</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1SVFVirtualCallInst.html">SVFVirtualCallInst</a>* virtualCall = SVFUtil::dyn_cast<SVFVirtualCallInst>(svfcall))</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  {</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  virtualCall->setVtablePtr(<a class="code" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">getSVFValue</a>(<a class="code" href="namespaceSVF_1_1cppUtil.html#a374e7c0b161a77f4d693e13b99ed6283">cppUtil::getVCallVtblPtr</a>(call)));</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  virtualCall->setFunIdxInVtable(<a class="code" href="namespaceSVF_1_1cppUtil.html#a279fa78f7a2e45b458a0358de9c061b8">cppUtil::getVCallIdx</a>(call));</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  virtualCall->setFunNameOfVirtualCall(<a class="code" href="namespaceSVF_1_1cppUtil.html#a8f5b8d8f99995821c81ccc8f7781c67e">cppUtil::getFunNameOfVCallSite</a>(call));</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  }</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i < call->arg_size(); i++)</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  {</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* svfval = <a class="code" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">getSVFValue</a>(call->getArgOperand(i));</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  svfcall-><a class="code" href="classSVF_1_1SVFCallInst.html#ac979b49b449b97b2a23f195cb107ec77">addArgument</a>(svfval);</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  }</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  }</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a3b2ca48c72fba877c6cb3d52e23704e3">LLVMUtil::getNextInsts</a>(inst, <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae74f307b6f96950ceedb2c375ef1c3a3">getSVFInstruction</a>(inst)->getSuccInstructions());</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <a class="code" href="namespaceSVF_1_1LLVMUtil.html#ae9ddfd95ec4a36537f582acad0262e70">LLVMUtil::getPrevInsts</a>(inst, <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae74f307b6f96950ceedb2c375ef1c3a3">getSVFInstruction</a>(inst)->getPredInstructions());</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  }</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  }</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span> }</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span> </div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> </div><div class="line"><a name="l00284"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a8ba9092747108e0289014d52465a692d"> 284</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8ba9092747108e0289014d52465a692d">LLVMModuleSet::initDomTree</a>(<a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svffun, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun)</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> {</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="comment">//process and stored dt & df</span></div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <a class="code" href="namespaceSVF.html#aecbb42b8e9d17fa0189c50dda9fd5fdd">DominatorTree</a> dt;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <a class="code" href="namespaceSVF.html#ab44d20f806be99699895260b14a942d7">DominanceFrontier</a> df;</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  dt.recalculate(const_cast<Function&>(*fun));</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  df.analyze(dt);</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <a class="code" href="namespaceSVF.html#a77e088bfe47c0b0ddcbbe0693dec6fe5">LoopInfo</a> loopInfo = <a class="code" href="namespaceSVF.html#a77e088bfe47c0b0ddcbbe0693dec6fe5">LoopInfo</a>(dt);</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <a class="code" href="namespaceSVF.html#ab34383ee87cd45eb485fa29db482ffef">PostDominatorTree</a> pdt = <a class="code" href="namespaceSVF.html#ab34383ee87cd45eb485fa29db482ffef">PostDominatorTree</a>(const_cast<Function&>(*fun));</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html">SVFLoopAndDomInfo</a>* ld = svffun-><a class="code" href="classSVF_1_1SVFFunction.html#a5798ecc742ee74e357d13eea751258c4">getLoopAndDomInfo</a>();</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span> </div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<const SVFBasicBlock*,Set<const SVFBasicBlock*></a>> & dfBBsMap = ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#ae37546be7304c66b4eca2654d995eaa7">getDomFrontierMap</a>();</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="keywordflow">for</span> (DominanceFrontierBase::const_iterator dfIter = df.begin(), eDfIter = df.end(); dfIter != eDfIter; dfIter++)</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  {</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* keyBB = dfIter->first;</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keyword">const</span> std::set<BasicBlock* >& domSet = dfIter->second;</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const SVFBasicBlock*></a>& valueBasicBlocks = dfBBsMap[<a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(keyBB)];</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* bbValue:domSet)</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  {</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  valueBasicBlocks.insert(<a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(bbValue));</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  }</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  }</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  std::vector<const SVFBasicBlock*> reachableBBs;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a7653217714dfac2d92f1307ce8b74ec7">LLVMUtil::getFunReachableBBs</a>(fun, reachableBBs);</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#acc409e328f641a2c9512beeb727f58c7">setReachableBBs</a>(reachableBBs);</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span> </div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  <span class="keywordflow">for</span> (Function::const_iterator bit = fun->begin(), ebit = fun->end(); bit != ebit; ++bit)</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  {</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* bb = &*bit;</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* svf_bb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(bb);</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF.html#a827d09974dc7bf0849f96823cc2fee89">DomTreeNode</a> *dtNode = dt.getNode(const_cast<BasicBlock*>(bb)))</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  {</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  DomTreeNode::iterator DI = dtNode->begin();</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keywordflow">if</span> (DI != dtNode->end())</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  {</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keywordflow">for</span> (DomTreeNode::iterator DI = dtNode->begin(), DE = dtNode->end(); DI != DE; ++DI)</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  {</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* dombb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>((*DI)->getBlock());</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#a2fc6b806a436d8fa65863f6cef99e716">getDomTreeMap</a>()[svf_bb].insert(dombb);</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  }</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  }</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  {</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#a2fc6b806a436d8fa65863f6cef99e716">getDomTreeMap</a>()[svf_bb] = <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const SVFBasicBlock* ></a>();</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  }</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  }</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> </div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF.html#a827d09974dc7bf0849f96823cc2fee89">DomTreeNode</a> * pdtNode = pdt.getNode(const_cast<BasicBlock*>(bb)))</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  {</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  DomTreeNode::iterator DI = pdtNode->begin();</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <span class="keywordflow">if</span> (DI != pdtNode->end())</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  {</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <span class="keywordflow">for</span> (DomTreeNode::iterator DI = pdtNode->begin(), DE = pdtNode->end(); DI != DE; ++DI)</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  {</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* dombb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>((*DI)->getBlock());</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#ad07f95e790b5c3a50c864155aa20a083">getPostDomTreeMap</a>()[svf_bb].insert(dombb);</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  }</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  }</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  {</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#ad07f95e790b5c3a50c864155aa20a083">getPostDomTreeMap</a>()[svf_bb] = <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const SVFBasicBlock* ></a>();</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  }</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  }</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#abf85e29310b2e4df8925d00a5c081314">Loop</a> *loop = loopInfo.getLoopFor(bb))</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  {</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* loopBlock:loop->getBlocks())</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  {</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFBasicBlock.html">SVFBasicBlock</a>* loopbb = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(loopBlock);</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  ld-><a class="code" href="classSVF_1_1SVFLoopAndDomInfo.html#aed2f125f7b8c21092b23d9727568ba50">addToBB2LoopMap</a>(svf_bb,loopbb);</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  }</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  }</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  }</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span> }</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span> </div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> </div><div class="line"><a name="l00362"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a8b5f24c873db1f6a0614d1dac48bb4bb"> 362</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8b5f24c873db1f6a0614d1dac48bb4bb">LLVMModuleSet::prePassSchedule</a>()</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> {</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  std::unique_ptr<BreakConstantGEPs> p1 = std::make_unique<BreakConstantGEPs>();</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M : <a class="code" href="classSVF_1_1LLVMModuleSet.html#a4091b12bdfe4423d8114612a199bc480">getLLVMModules</a>())</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  {</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  p1->runOnModule(M);</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  }</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span> </div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  std::unique_ptr<UnifyFunctionExitNodes> p2 =</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  std::make_unique<UnifyFunctionExitNodes>();</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-><a class="code" href="classSVF_1_1LLVMModuleSet.html#a4091b12bdfe4423d8114612a199bc480">getLLVMModules</a>())</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  {</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> F = M.begin(), E = M.end(); F != E; ++F)</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  {</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> &fun = *F;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="keywordflow">if</span> (fun.isDeclaration())</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  p2->runOnFunction(fun);</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  }</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  }</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> }</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span> </div><div class="line"><a name="l00386"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a2fdc1bd61b8f6cdf6c07a5059b641b04"> 386</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a2fdc1bd61b8f6cdf6c07a5059b641b04">LLVMModuleSet::preProcessBCs</a>(std::vector<std::string> &moduleNameVec)</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span> {</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a298966366b02d0a34f409c2c77da3789">loadModules</a>(moduleNameVec);</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8b5f24c873db1f6a0614d1dac48bb4bb">prePassSchedule</a>();</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span> </div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> preProcessSuffix = <span class="stringliteral">".pre.bc"</span>;</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="comment">// Get the existing module names, remove old extention, add preProcessSuffix</span></div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i < moduleNameVec.size(); i++)</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  {</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> lastIndex = moduleNameVec[i].find_last_of(<span class="stringliteral">"."</span>);</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> rawName = moduleNameVec[i].substr(0, lastIndex);</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  moduleNameVec[i] = (rawName + preProcessSuffix);</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  }</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span> </div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ad5ef9421d501b2747d4fb31d4189b53f">dumpModulesToFile</a>(preProcessSuffix);</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a14b0b55d397d6f8a5dfe3b574021f801">preProcessed</a> = <span class="keyword">true</span>;</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span> </div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a2f8e91c075d90be66412a079fe73e936">releaseLLVMModuleSet</a>();</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> }</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span> </div><div class="line"><a name="l00406"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a298966366b02d0a34f409c2c77da3789"> 406</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a298966366b02d0a34f409c2c77da3789">LLVMModuleSet::loadModules</a>(<span class="keyword">const</span> std::vector<std::string> &moduleNameVec)</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span> {</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span> </div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <span class="comment">// We read SVFIR from LLVM IR</span></div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#a53f783c80f368bcdca6c7620229d6f8e">Options::Graphtxt</a>().<a class="code" href="classSVF_1_1LLVMModuleSet.html#ae19e38054c55d5822dfc83a12f12aa60">empty</a>())</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  {</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="keywordflow">if</span>(moduleNameVec.empty())</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  {</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"no LLVM bc file is found!\n"</span>;</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  exit(0);</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  }</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="comment">//assert(!moduleNameVec.empty() && "no LLVM bc file is found!");</span></div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  }</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <span class="comment">// We read SVFIR from a user-defined txt instead of parsing SVFIR from LLVM IR</span></div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <a class="code" href="classSVF_1_1SVFModule.html#ac630e9f18a239ac6b3b88d05e64140c5">SVFModule::setPagFromTXT</a>(<a class="code" href="classSVF_1_1Options.html#a53f783c80f368bcdca6c7620229d6f8e">Options::Graphtxt</a>());</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> </div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <span class="comment">//</span></div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <span class="comment">// To avoid the following type bugs (t1 != t3) when parsing multiple modules,</span></div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="comment">// We should use only one LLVMContext object for multiple modules in the same thread.</span></div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <span class="comment">// No such problem if only one module is processed by SVF.</span></div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="comment">// LLVMContext ctxa,ctxb;</span></div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <span class="comment">// IntegerType * t1 = IntegerType::get(ctxa,32);</span></div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="comment">// IntegerType * t2 = IntegerType::get(ctxa,32);</span></div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="comment">// assert(t1 == t2);</span></div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="comment">// IntegerType * t3 = IntegerType::get(ctxb,32);</span></div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="comment">// IntegerType * t4 = IntegerType::get(ctxb,32);</span></div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="comment">// assert(t3 == t4);</span></div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="comment">// assert(t1 != t3);</span></div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <span class="comment">//</span></div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ad06a92bf8bc556de742e0ffdf79ffafe">cxts</a> = std::make_unique<LLVMContext>();</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span> </div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>& moduleName : moduleNameVec)</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  {</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keywordflow">if</span> (!<a class="code" href="namespaceSVF_1_1LLVMUtil.html#ad8a8c32a09340f491fffffcb07dd7a41">LLVMUtil::isIRFile</a>(moduleName))</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  {</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() << <span class="stringliteral">"not an IR file: "</span> << moduleName << std::endl;</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  abort();</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  }</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span> </div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <a class="code" href="namespaceSVF.html#a86863d104a3930b3a806935d92ddbf30">SMDiagnostic</a> Err;</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  std::unique_ptr<Module> mod = parseIRFile(moduleName, Err, *<a class="code" href="classSVF_1_1LLVMModuleSet.html#ad06a92bf8bc556de742e0ffdf79ffafe">cxts</a>);</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="keywordflow">if</span> (mod == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  {</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() << <span class="stringliteral">"load module: "</span> << moduleName << <span class="stringliteral">"failed!!\n\n"</span>;</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  Err.print(<span class="stringliteral">"SVFModuleLoader"</span>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">llvm::errs</a>());</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  abort();</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  }</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>.emplace_back(*mod);</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae365189769640adb919a23c36978e5e2">owned_modules</a>.emplace_back(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a72502f7f536418621485e90ab98c2016">std::move</a>(mod));</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  }</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> }</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span> </div><div class="line"><a name="l00461"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#aa1250575db489dc57583b3641fd78b88"> 461</a></span> std::vector<const Function* > <a class="code" href="classSVF_1_1LLVMModuleSet.html#aa1250575db489dc57583b3641fd78b88">LLVMModuleSet::getLLVMGlobalFunctions</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global)</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span> {</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="comment">// This function is used to extract constructor and destructor functions</span></div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="comment">// sorted by their priority from @llvm.global_ctors or @llvm.global_dtors.</span></div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="comment">// For example, given following @llvm.global_ctors, the returning sorted</span></div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <span class="comment">// function list should be [ctor3, ctor1, ctor2].</span></div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="comment">// ; Each struct in the array is {priority, function, associated data}</span></div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <span class="comment">//</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <span class="comment">// @llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }]</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="comment">// [{ i32, void ()*, i8* } { i32 1234, void ()* @ctor1.cpp, i8* null },</span></div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <span class="comment">// { i32, void ()*, i8* } { i32 2345, void ()* @ctor2.cpp, i8* null },</span></div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="comment">// { i32, void ()*, i8* } { i32 345, void ()* @ctor3.cpp, i8* null }]</span></div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <span class="comment">// ------------------------------------------------------------------</span></div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <span class="comment">// TODO: According to LLVM language reference, if the third field is</span></div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="comment">// non-null, and points to a global variable or function, the initializer</span></div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <span class="comment">// function will only run if the associated data from the current module is</span></div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <span class="comment">// not discarded. However the associated data is currently ignored.</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span> </div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span> </div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="comment">// This class is used for the priority queue that sorts the functions by</span></div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <span class="comment">// their priority. Each object of this class stands for an item in the</span></div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="comment">// function array.</span></div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <span class="keyword">class </span>LLVMGlobalFunction</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  {</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <span class="keyword">public</span>:</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> priority;</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* func;</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  LLVMGlobalFunction() {};</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  LLVMGlobalFunction(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> _priority, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* _func)</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  : priority(_priority), func(_func) {};</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF.html#aedd9d023a68dddd66314be63bb8e48d2">operator></a>(<span class="keyword">const</span> LLVMGlobalFunction &other)<span class="keyword"> const</span></div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span> <span class="keyword"> </span>{</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="keywordflow">if</span> (priority != other.priority)</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  {</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <span class="keywordflow">return</span> priority > other.priority;</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  }</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  {</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keywordflow">return</span> func > other.func;</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  }</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  }</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  };</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span> </div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  std::priority_queue<LLVMGlobalFunction, std::vector<LLVMGlobalFunction>,</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  greater<LLVMGlobalFunction>></div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  queue;</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  std::vector<const Function* > result;</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span> </div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="comment">// The @llvm.global_ctors/dtors global variable is an array of struct. Each</span></div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <span class="comment">// struct has three fields: {i32 priority, void ()* @ctor/dtor, i8* @data}.</span></div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <span class="comment">// First get the array here.</span></div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a> *globalFuncArray =</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  SVFUtil::dyn_cast<ConstantArray>(global->getInitializer()))</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  {</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <span class="comment">// Get each struct in the array.</span></div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < globalFuncArray->getNumOperands(); ++i)</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  {</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <span class="keywordflow">if</span> (</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a> *globalFuncItem =</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  SVFUtil::dyn_cast<ConstantStruct>(</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  globalFuncArray->getOperand(i)))</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  {</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span> </div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <span class="comment">// Extract priority and function from the struct</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* priority = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>>(</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  globalFuncItem->getOperand(0));</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* func = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>>(</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  globalFuncItem->getOperand(1));</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span> </div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  <span class="keywordflow">if</span> (priority && func)</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  {</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  queue.push(LLVMGlobalFunction(priority</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  ->getZExtValue(),</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  func));</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  }</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  }</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  }</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  }</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span> </div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <span class="comment">// Generate a sorted vector of functions from the priority queue.</span></div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">while</span> (!queue.empty())</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  {</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  result.push_back(queue.top().func);</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  queue.pop();</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  }</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span> }</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span> </div><div class="line"><a name="l00550"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a8af6b911b728713f66f7c809d5c0fbf1"> 550</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a8af6b911b728713f66f7c809d5c0fbf1">LLVMModuleSet::addSVFMain</a>()</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span> {</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  std::vector<const Function* > ctor_funcs;</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  std::vector<const Function* > dtor_funcs;</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* orgMain = 0;</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>* mainMod = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span> </div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &mod : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>)</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  {</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <span class="comment">// Collect ctor and dtor functions</span></div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <span class="keywordflow">for</span> (Module::global_iterator it = mod.global_begin(), eit = mod.global_end(); it != eit; ++it)</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  {</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global = &*it;</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span> </div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="keywordflow">if</span> (global->getName().equals(<a class="code" href="LLVMModule_8cpp.html#aa18802f2f60ef8030c66a42f20f285af">SVF_GLOBAL_CTORS</a>) &&</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  global->hasInitializer())</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  {</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  ctor_funcs = <a class="code" href="classSVF_1_1LLVMModuleSet.html#aa1250575db489dc57583b3641fd78b88">getLLVMGlobalFunctions</a>(global);</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  }</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (global->getName().equals(<a class="code" href="LLVMModule_8cpp.html#a9fd6e28e6ed93f65a20a348ab0646320">SVF_GLOBAL_DTORS</a>) &&</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  global->hasInitializer())</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  {</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  dtor_funcs = <a class="code" href="classSVF_1_1LLVMModuleSet.html#aa1250575db489dc57583b3641fd78b88">getLLVMGlobalFunctions</a>(global);</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  }</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  }</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span> </div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <span class="comment">// Find main function</span></div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> &func : mod)</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  {</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="keywordflow">if</span> (func.getName().equals(<a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a>))</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  assert(<span class="keyword">false</span> && <a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a> <span class="stringliteral">" already defined"</span>);</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  <span class="keywordflow">if</span>(func.getName().equals(<span class="stringliteral">"main"</span>))</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  {</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  orgMain = &func;</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  mainMod = &mod;</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  }</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  }</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  }</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span> </div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="comment">// Only create svf.main when the original main function is found, and also</span></div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="comment">// there are global contructor or destructor functions.</span></div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  <span class="keywordflow">if</span> (orgMain && <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae265a7f3cc7367d62013e0f15cf3d233">getModuleNum</a>() > 0 &&</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  (ctor_funcs.size() > 0 || dtor_funcs.size() > 0))</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  {</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  assert(mainMod && <span class="stringliteral">"Module with main function not found."</span>);</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> & M = *mainMod;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <span class="comment">// char **</span></div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* i8ptr2 = PointerType::getInt8PtrTy(M.getContext())->getPointerTo();</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* i32 = IntegerType::getInt32Ty(M.getContext());</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="comment">// define void @svf.main(i32, i8**, i8**)</span></div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span> <span class="preprocessor">#if (LLVM_VERSION_MAJOR >= 9)</span></div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  FunctionCallee svfmainFn = M.getOrInsertFunction(</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a>,</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  Type::getVoidTy(M.getContext()),</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  i32,i8ptr2,i8ptr2</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  );</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* svfmain = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>>(svfmainFn.getCallee());</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* svfmain = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>>(M.getOrInsertFunction(</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <a class="code" href="LLVMModule_8cpp.html#a10ab7c7da3a458495d8528b9e90d714b">SVF_MAIN_FUNC_NAME</a>,</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  Type::getVoidTy(M.getContext()),</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  i32,i8ptr2,i8ptr2</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  ));</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  svfmain->setCallingConv(llvm::CallingConv::C);</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* block = BasicBlock::Create(M.getContext(), <span class="stringliteral">"entry"</span>, svfmain);</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <a class="code" href="namespaceSVF.html#a94824519e439aeef1568d415b6f7331c">IRBuilder</a> Builder(block);</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  <span class="comment">// emit "call void @ctor()". ctor_funcs is sorted so the functions are</span></div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  <span class="comment">// emitted in the order of priority</span></div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keywordflow">for</span>(<span class="keyword">auto</span> & ctor: ctor_funcs)</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  {</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <span class="keyword">auto</span> target = M.getOrInsertFunction(</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  ctor->getName(),</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  Type::getVoidTy(M.getContext())</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  );</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  Builder.CreateCall(target);</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  }</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  <span class="comment">// main() should be called after all ctor functions and before dtor</span></div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  <span class="comment">// functions.</span></div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  Function::arg_iterator arg_it = svfmain->arg_begin();</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* args[] = {arg_it, arg_it + 1, arg_it + 2 };</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  <span class="keywordtype">size_t</span> cnt = orgMain->arg_size();</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  assert(cnt <= 3 && <span class="stringliteral">"Too many arguments for main()"</span>);</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  Builder.CreateCall(orgMain, llvm::ArrayRef<Value*>(args,args + cnt));</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  <span class="comment">// emit "call void @dtor()". dtor_funcs is sorted so the functions are</span></div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="comment">// emitted in the order of priority</span></div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> &dtor : dtor_funcs)</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  {</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  <span class="keyword">auto</span> target = M.getOrInsertFunction(</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  dtor->getName(),</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  Type::getVoidTy(M.getContext())</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  );</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  Builder.CreateCall(target);</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  }</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="comment">// return;</span></div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  Builder.CreateRetVoid();</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  }</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span> }</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span> </div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span> </div><div class="line"><a name="l00650"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ac7c646a78c989807c52263fc35fb3628"> 650</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#ac7c646a78c989807c52263fc35fb3628">LLVMModuleSet::buildFunToFunMap</a>()</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span> {</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*></a> funDecls, funDefs;</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  <a class="code" href="namespaceSVF.html#a4f21e91ff8eaea5207afe5c60dbd78d7">OrderedSet<string></a> declNames, defNames, intersectNames;</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<string, const Function*></a> NameToFunDefMapTy;</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<string, Set<const Function*></a>> NameToFunDeclsMapTy;</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span> </div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>& mod : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>)</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  {</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  <span class="keywordflow">for</span> (Module::iterator it = mod.begin(), eit = mod.end(); it != eit; ++it)</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  {</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = &*it;</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="keywordflow">if</span> (fun->isDeclaration())</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  {</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  funDecls.insert(fun);</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  declNames.insert(fun->getName().str());</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  }</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  {</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  funDefs.insert(fun);</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  defNames.insert(fun->getName().str());</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  }</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  }</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  }</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="comment">// Find the intersectNames</span></div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  <a class="code" href="namespaceSVF.html#a4f21e91ff8eaea5207afe5c60dbd78d7">OrderedSet<string>::iterator</a> declIter, defIter;</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  declIter = declNames.begin();</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  defIter = defNames.begin();</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  <span class="keywordflow">while</span> (declIter != declNames.end() && defIter != defNames.end())</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  {</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  <span class="keywordflow">if</span> (*declIter < *defIter)</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  {</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  declIter++;</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  }</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  {</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="keywordflow">if</span> (!(*defIter < *declIter))</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  {</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  intersectNames.insert(*declIter);</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  declIter++;</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  }</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  defIter++;</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  }</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  }</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span> </div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  NameToFunDefMapTy nameToFunDefMap;</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*>::iterator</a> it = funDefs.begin(),</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  eit = funDefs.end(); it != eit; ++it)</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  {</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fdef = *it;</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  <span class="keywordtype">string</span> funName = fdef->getName().str();</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  nameToFunDefMap[funName] = fdef;</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  }</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span> </div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  NameToFunDeclsMapTy nameToFunDeclsMap;</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*>::iterator</a> it = funDecls.begin(),</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  eit = funDecls.end(); it != eit; ++it)</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  {</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fdecl = *it;</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  <span class="keywordtype">string</span> funName = fdecl->getName().str();</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  NameToFunDeclsMapTy::iterator mit = nameToFunDeclsMap.find(funName);</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  <span class="keywordflow">if</span> (mit == nameToFunDeclsMap.end())</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  {</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*></a> decls;</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  decls.insert(fdecl);</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  nameToFunDeclsMap[funName] = decls;</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  }</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  {</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*></a> &decls = mit->second;</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  decls.insert(fdecl);</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  }</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  }</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span> </div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*>::iterator</a> it = funDecls.begin(),</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  eit = funDecls.end(); it != eit; ++it)</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  {</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fdecl = *it;</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  <span class="keywordtype">string</span> funName = fdecl->getName().str();</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  NameToFunDefMapTy::iterator mit = nameToFunDefMap.find(funName);</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  <span class="keywordflow">if</span> (mit == nameToFunDefMap.end())</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#aee80b29e5246e3eaa0e30e165346101f">FunDeclToDefMap</a>[fdecl] = mit->second;</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  }</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span> </div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*>::iterator</a> it = funDefs.begin(),</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  eit = funDefs.end(); it != eit; ++it)</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  {</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fdef = *it;</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  <span class="keywordtype">string</span> funName = fdef->getName().str();</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="keywordflow">if</span> (intersectNames.find(funName) == intersectNames.end())</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  NameToFunDeclsMapTy::iterator mit = nameToFunDeclsMap.find(funName);</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  <span class="keywordflow">if</span> (mit == nameToFunDeclsMap.end())</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  std::vector<const Function*>& decls = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a377cefaad4b688ab6edf94ba4abe00ee">FunDefToDeclsMap</a>[fdef];</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const Function*>::iterator</a> sit = mit->second.begin(),</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  seit = mit->second.end(); sit != seit; ++sit)</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  {</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  decls.push_back(*sit);</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  }</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  }</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span> }</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span> </div><div class="line"><a name="l00765"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#aaab03cb6ff665bc008c67b866ba81e47"> 765</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#aaab03cb6ff665bc008c67b866ba81e47">LLVMModuleSet::buildGlobalDefToRepMap</a>()</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span> {</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<string, Set<GlobalVariable*></a>> NameToGlobalsMapTy;</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  NameToGlobalsMapTy nameToGlobalsMap;</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &mod : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>)</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  {</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  <span class="comment">// Collect ctor and dtor functions</span></div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  <span class="keywordflow">for</span> (Module::global_iterator it = mod.global_begin(), eit = mod.global_end(); it != eit; ++it)</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  {</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *global = &*it;</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <span class="keywordflow">if</span> (global->hasPrivateLinkage())</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  <span class="keywordtype">string</span> <a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a> = global->getName().str();</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  NameToGlobalsMapTy::iterator mit = nameToGlobalsMap.find(name);</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  <span class="keywordflow">if</span> (mit == nameToGlobalsMap.end())</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  {</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<GlobalVariable*></a> globals;</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  globals.insert(global);</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  nameToGlobalsMap[<a class="code" href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a>] = globals;</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  }</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  {</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<GlobalVariable*></a> &globals = mit->second;</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  globals.insert(global);</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  }</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  }</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  }</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span> </div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  <span class="keywordflow">for</span> (NameToGlobalsMapTy::iterator it = nameToGlobalsMap.begin(),</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  eit = nameToGlobalsMap.end(); it != eit; ++it)</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  {</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<GlobalVariable*></a> &globals = it->second;</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *rep = *(globals.begin());</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<GlobalVariable*>::iterator</a> repit = globals.begin();</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  <span class="keywordflow">while</span> (repit != globals.end())</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  {</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *cur = *repit;</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  <span class="keywordflow">if</span> (cur->hasInitializer())</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span>  {</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  rep = cur;</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>  }</div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>  repit++;</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>  }</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<GlobalVariable*>::iterator</a> sit = globals.begin(),</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  seit = globals.end(); sit != seit; ++sit)</div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  {</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *cur = *sit;</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae2a1fa0b908cf372c50af90e62c4bf2b">GlobalDefToRepMap</a>[cur] = rep;</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  }</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>  }</div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span> }</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span> </div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span> <span class="comment">// Dump modules to files</span></div><div class="line"><a name="l00819"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#ad5ef9421d501b2747d4fb31d4189b53f"> 819</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#ad5ef9421d501b2747d4fb31d4189b53f">LLVMModuleSet::dumpModulesToFile</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> suffix)</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span> {</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a>& mod : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">modules</a>)</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  {</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> moduleName = mod.getName().str();</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> OutputFilename;</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  std::size_t pos = moduleName.rfind(<span class="charliteral">'.'</span>);</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  <span class="keywordflow">if</span> (pos != std::string::npos)</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  OutputFilename = moduleName.substr(0, pos) + suffix;</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>  OutputFilename = moduleName + suffix;</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span> </div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  std::error_code EC;</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  <a class="code" href="namespaceSVF.html#a1c7c7ac12791c0ae386283c0a4f127ba">raw_fd_ostream</a> OS(OutputFilename.c_str(), EC, llvm::sys::fs::OF_None);</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span> </div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span> <span class="preprocessor">#if (LLVM_VERSION_MAJOR >= 7)</span></div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  WriteBitcodeToFile(mod, OS);</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span> <span class="preprocessor">#else</span></div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  WriteBitcodeToFile(&mod, OS);</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span> </div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  OS.flush();</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  }</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span> }</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span> </div><div class="line"><a name="l00844"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a7d61f479f52e1dc71a4ae7a4d62f3b6a"> 844</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a7d61f479f52e1dc71a4ae7a4d62f3b6a">LLVMModuleSet::setValueAttr</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* val, <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* svfvalue)</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span> {</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a7f8e61cf5d838d7a2e862bc6955f16be">SVFValue2LLVMValue</a>[svfvalue] = val;</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span> </div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a07c785d931cef3c61e3dab4c615770be">LLVMUtil::isPtrInUncalledFunction</a>(val))</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  svfvalue-><a class="code" href="classSVF_1_1SVFValue.html#ac2e5c42d0ac92375c88ef5b3f1b65dc4">setPtrInUncalledFunction</a>();</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a8a77403306e97ab4cb31a56d38bba5be">LLVMUtil::isConstDataOrAggData</a>(val))</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  svfvalue-><a class="code" href="classSVF_1_1SVFValue.html#afe1de41ca3215b325d0ca61814c6bd6b">setConstDataOrAggData</a>();</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span> </div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a>* glob = SVFUtil::dyn_cast<SVFGlobalValue>(svfvalue))</div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  {</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* llvmVal = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a9e0c786488dfdc4605d4cbcf9943c85a">LLVMUtil::getGlobalRep</a>(val);</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>  assert(SVFUtil::isa<GlobalValue>(llvmVal) && <span class="stringliteral">"not a GlobalValue?"</span>);</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  glob->setDefGlobalForMultipleModule(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a3cbba2eb702a3481478b2590dfffa352">getSVFGlobalValue</a>(SVFUtil::cast<GlobalValue>(llvmVal)));</div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  }</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svffun = SVFUtil::dyn_cast<SVFFunction>(svfvalue))</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>  {</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* func = SVFUtil::cast<Function>(val);</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  svffun->setIsNotRet(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a651b6a1cf3665277d2241220bb145aed">LLVMUtil::functionDoesNotRet</a>(func));</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  svffun->setIsUncalledFunction(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a2c61d741afbcfa853b505cd391f29f9b">LLVMUtil::isUncalledFunction</a>(func));</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  svffun->setDefFunForMultipleModule(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a50fc24901350df9db890ba16a9b87e33">getSVFFunction</a>(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a3d34fcdfc98add848a34fd5259c11eb2">LLVMUtil::getDefFunForMultipleModule</a>(func)));</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  }</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span> </div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  svfvalue-><a class="code" href="classSVF_1_1SVFValue.html#a588acec1904d440797ca4500f63f7d28">setSourceLoc</a>(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a8e4add30bd0ce00d3f2aa2e31c64fef8">LLVMUtil::getSourceLoc</a>(val));</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span> }</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span> </div><div class="line"><a name="l00870"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a25821b0feeb3b08e00ec9d444520b727"> 870</a></span> <a class="code" href="classSVF_1_1SVFConstantData.html">SVFConstantData</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a25821b0feeb3b08e00ec9d444520b727">LLVMModuleSet::getSVFConstantData</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7332f8059ea95472dcc231de884a5768">ConstantData</a>* cd)</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span> {</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  LLVMConst2SVFConstMap::const_iterator it = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a4b94c96898dbbc71bc1cee04786cf3dc">LLVMConst2SVFConst</a>.find(cd);</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  <span class="keywordflow">if</span>(it!=<a class="code" href="classSVF_1_1LLVMModuleSet.html#a4b94c96898dbbc71bc1cee04786cf3dc">LLVMConst2SVFConst</a>.end())</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  {</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  assert(SVFUtil::isa<SVFConstantData>(it->second) && <span class="stringliteral">"not a SVFConstantData type!"</span>);</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="keywordflow">return</span> SVFUtil::cast<SVFConstantData>(it->second);</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  }</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  {</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  <a class="code" href="classSVF_1_1SVFConstantData.html">SVFConstantData</a>* svfcd = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* cint = SVFUtil::dyn_cast<ConstantInt>(cd))</div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  {</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  svfcd = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFConstantInt.html">SVFConstantInt</a>(cd->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(cint->getType()), cint->getZExtValue(),</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  cint->getBitWidth() == 1? cint->getZExtValue(): cint->getSExtValue());</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  }</div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad49e4222ba46d9490b87a80df8b46800">ConstantFP</a>* cfp = SVFUtil::dyn_cast<ConstantFP>(cd))</div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  {</div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  <span class="keywordtype">double</span> dval = 0;</div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  <span class="keywordflow">if</span>(cfp->isNormalFP() && (&cfp->getValueAPF().getSemantics()== &llvm::APFloatBase::IEEEdouble()))</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  dval = cfp->getValueAPF().convertToDouble();</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  svfcd = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFConstantFP.html">SVFConstantFP</a>(cd->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(cd->getType()), dval);</div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  }</div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa<ConstantPointerNull>(cd))</div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  svfcd = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFConstantNullPtr.html">SVFConstantNullPtr</a>(cd->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(cd->getType()));</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<UndefValue>(cd))</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  svfcd = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFBlackHoleValue.html">SVFBlackHoleValue</a>(cd->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(cd->getType()));</div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  svfcd = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFConstantData.html">SVFConstantData</a>(cd->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(cd->getType()));</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>->addConstant(svfcd);</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#af4bd487b3b6efe55bf869b869f5e8a80">addConstantDataMap</a>(cd,svfcd);</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span>  <span class="keywordflow">return</span> svfcd;</div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  }</div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span> }</div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span> </div><div class="line"><a name="l00906"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a74256f36f0fdc242df9729906c34efbc"> 906</a></span> <a class="code" href="classSVF_1_1SVFConstant.html">SVFConstant</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a74256f36f0fdc242df9729906c34efbc">LLVMModuleSet::getOtherSVFConstant</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7e230c0cba2e3a7c2e5a5f2ee7d88af9">Constant</a>* oc)</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span> {</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  LLVMConst2SVFConstMap::const_iterator it = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a4b94c96898dbbc71bc1cee04786cf3dc">LLVMConst2SVFConst</a>.find(oc);</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  <span class="keywordflow">if</span>(it!=<a class="code" href="classSVF_1_1LLVMModuleSet.html#a4b94c96898dbbc71bc1cee04786cf3dc">LLVMConst2SVFConst</a>.end())</div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span>  {</div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  <span class="keywordflow">return</span> it->second;</div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  }</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  {</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  <a class="code" href="classSVF_1_1SVFConstant.html">SVFConstant</a>* svfoc = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFConstant.html">SVFConstant</a>(oc->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(oc->getType()));</div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>->addConstant(svfoc);</div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5badf03aeb1ebda02bc186bbb58a892a">addOtherConstantMap</a>(oc,svfoc);</div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  <span class="keywordflow">return</span> svfoc;</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  }</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span> }</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span> </div><div class="line"><a name="l00922"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a0ef17c1d5e6a95c597d2334ea577a965"> 922</a></span> <a class="code" href="classSVF_1_1SVFOtherValue.html">SVFOtherValue</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a0ef17c1d5e6a95c597d2334ea577a965">LLVMModuleSet::getSVFOtherValue</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* ov)</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span> {</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>  LLVMValue2SVFOtherValueMap::const_iterator it = <a class="code" href="classSVF_1_1LLVMModuleSet.html#ac3e70bd338be3a54330be5dc10321eb3">LLVMValue2SVFOtherValue</a>.find(ov);</div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  <span class="keywordflow">if</span>(it!=<a class="code" href="classSVF_1_1LLVMModuleSet.html#ac3e70bd338be3a54330be5dc10321eb3">LLVMValue2SVFOtherValue</a>.end())</div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  {</div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  <span class="keywordflow">return</span> it->second;</div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  }</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>  {</div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span>  <a class="code" href="classSVF_1_1SVFOtherValue.html">SVFOtherValue</a>* svfov = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>  <span class="keywordflow">if</span>(SVFUtil::isa<MetadataAsValue>(ov))</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  svfov = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFMetadataAsValue.html">SVFMetadataAsValue</a>(ov->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ov->getType()));</div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  svfov = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFOtherValue.html">SVFOtherValue</a>(ov->getName().str(), <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ov->getType()));</div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3e14bbb3ae0acc74775ac3233a84d379">svfModule</a>->addOtherValue(svfov);</div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a023ea6f179433fa4d007c98ddc38e3c5">addOtherValueMap</a>(ov,svfov);</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  <span class="keywordflow">return</span> svfov;</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  }</div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span> }</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span> </div><div class="line"><a name="l00942"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392"> 942</a></span> <a class="code" href="classSVF_1_1SVFValue.html">SVFValue</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">LLVMModuleSet::getSVFValue</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* value)</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span> {</div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = SVFUtil::dyn_cast<Function>(value))</div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a50fc24901350df9db890ba16a9b87e33">getSVFFunction</a>(fun);</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">BasicBlock</a>* bb = SVFUtil::dyn_cast<BasicBlock>(value))</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">getSVFBasicBlock</a>(bb);</div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = SVFUtil::dyn_cast<Instruction>(value))</div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#ae74f307b6f96950ceedb2c375ef1c3a3">getSVFInstruction</a>(inst);</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a58cdfbc4160cae08745b67844ac29801">Argument</a>* arg = SVFUtil::dyn_cast<Argument>(value))</div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#ad3f66b40ad360003845253f452d6a711">getSVFArgument</a>(arg);</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7e230c0cba2e3a7c2e5a5f2ee7d88af9">Constant</a>* cons = SVFUtil::dyn_cast<Constant>(value))</div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  {</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7332f8059ea95472dcc231de884a5768">ConstantData</a>* cd = SVFUtil::dyn_cast<ConstantData>(cons))</div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a25821b0feeb3b08e00ec9d444520b727">getSVFConstantData</a>(cd);</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a>* glob = SVFUtil::dyn_cast<GlobalValue>(cons))</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a3cbba2eb702a3481478b2590dfffa352">getSVFGlobalValue</a>(glob);</div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a74256f36f0fdc242df9729906c34efbc">getOtherSVFConstant</a>(cons);</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  }</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1LLVMModuleSet.html#a0ef17c1d5e6a95c597d2334ea577a965">getSVFOtherValue</a>(value);</div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span> }</div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span> </div><div class="line"><a name="l00965"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a610a7777a48132caadec167c8109f044"> 965</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a610a7777a48132caadec167c8109f044">LLVMModuleSet::getLLVMType</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* T)<span class="keyword"> const</span></div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span> <span class="keyword"></span>{</div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  <span class="keywordflow">for</span>(LLVMType2SVFTypeMap::const_iterator it = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>.begin(), eit = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>.end(); it!=eit; ++it)</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  {</div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  <span class="keywordflow">if</span> (it->second == T)</div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  <span class="keywordflow">return</span> it->first;</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  }</div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"can't find the corresponding LLVM Type"</span>);</div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  abort();</div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span> }</div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span> </div><div class="line"><a name="l00979"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99"> 979</a></span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">LLVMModuleSet::getSVFType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* T)</div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span> {</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  assert(T);</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  LLVMType2SVFTypeMap::const_iterator it = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>.find(T);</div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  <span class="keywordflow">if</span> (it!=<a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>.end())</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  <span class="keywordflow">return</span> it->second;</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  {</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* svfType = <a class="code" href="classSVF_1_1LLVMModuleSet.html#aab7b08db9252ef7e21e54d019f44b073">addSVFTypeInfo</a>(T);</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* stinfo = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a1f6cc76c996a0577b20b8cedd83fff92">collectTypeInfo</a>(T);</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  svfType->setTypeInfo(stinfo);</div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  <a class="code" href="namespaceSVF.html#aa962cc1d782cc46553251e96b64a754b">PointerType</a>* ptrTy = PointerType::getInt8PtrTy(<a class="code" href="classSVF_1_1LLVMModuleSet.html#ac1a9d20d62066ec4e181fad223669e32">getContext</a>())->getPointerTo();</div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  svfType->setPointerTo(SVFUtil::cast<SVFPointerType>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ptrTy)));</div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  <span class="keywordflow">return</span> svfType;</div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  }</div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span> }</div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span> </div><div class="line"><a name="l00998"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a1f6cc76c996a0577b20b8cedd83fff92"> 998</a></span> <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a1f6cc76c996a0577b20b8cedd83fff92">LLVMModuleSet::collectTypeInfo</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* T)</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span> {</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* stinfo = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span> </div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  Type2TypeInfoMap::iterator tit = <a class="code" href="classSVF_1_1LLVMModuleSet.html#af2c555af91679d9e6d3009547ee11486">Type2TypeInfo</a>.find(T);</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  <span class="keywordflow">if</span>(tit!=<a class="code" href="classSVF_1_1LLVMModuleSet.html#af2c555af91679d9e6d3009547ee11486">Type2TypeInfo</a>.end())</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  {</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  stinfo = tit->second.get();</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  }</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  {</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a146d286041987860388da3d8bc85cee3">ArrayType</a>* aty = SVFUtil::dyn_cast<ArrayType>(T))</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  {</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  stinfo = <a class="code" href="classSVF_1_1LLVMModuleSet.html#aa8de934358332505d4805db137d8ec29">collectArrayInfo</a>(aty);</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#af2c555af91679d9e6d3009547ee11486">Type2TypeInfo</a>[T] = std::unique_ptr<StInfo>(stinfo);</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  }</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2bf58575ac7d068e0f1a4cf953b9e6cb">StructType</a>* sty = SVFUtil::dyn_cast<StructType>(T))</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  {</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> nf;</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  stinfo = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a93315673be515ce5c2fabd36fa927128">collectStructInfo</a>(sty, nf);</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#af2c555af91679d9e6d3009547ee11486">Type2TypeInfo</a>[T] = std::unique_ptr<StInfo>(stinfo);</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  <span class="comment">//Record the size of the complete struct and update max_struct.</span></div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  <span class="keywordflow">if</span> (nf > <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5552135a27684cbe4d2a5ed346f64644">symInfo</a>-><a class="code" href="classSVF_1_1SymbolTableInfo.html#abb8550c9ef856e45cb7675c3796f9a35">maxStSize</a>)</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  {</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5552135a27684cbe4d2a5ed346f64644">symInfo</a>-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a0c1143eff451edf8ea47d4487a8d3a55">maxStruct</a> = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(sty);</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5552135a27684cbe4d2a5ed346f64644">symInfo</a>-><a class="code" href="classSVF_1_1SymbolTableInfo.html#abb8550c9ef856e45cb7675c3796f9a35">maxStSize</a> = nf;</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  }</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  }</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  {</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  <span class="keyword">auto</span> stinfo_own = std::make_unique<StInfo>(1);</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  stinfo = stinfo_own.get();</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#af2c555af91679d9e6d3009547ee11486">Type2TypeInfo</a>[T] = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a72502f7f536418621485e90ab98c2016">std::move</a>(stinfo_own);</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#abcd6d9513511e6a306189a87fe3dfa06">collectSimpleTypeInfo</a>(stinfo, T);</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  }</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span> </div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span> </div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>  }</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>  <span class="keywordflow">return</span> stinfo;</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span> }</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span> </div><div class="line"><a name="l01040"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#aab7b08db9252ef7e21e54d019f44b073"> 1040</a></span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#aab7b08db9252ef7e21e54d019f44b073">LLVMModuleSet::addSVFTypeInfo</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* T)</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span> {</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  assert(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>.find(T)==<a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>.end() && <span class="stringliteral">"SVFType has been added before"</span>);</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span> </div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* svftype = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aa962cc1d782cc46553251e96b64a754b">PointerType</a>* pt = SVFUtil::dyn_cast<PointerType>(T))</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  svftype = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFPointerType.html">SVFPointerType</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#abba4111230f6009bbf50518ee36a9870">LLVMUtil::getPtrElementType</a>(pt)));</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<IntegerType>(T))</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>  svftype = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFIntergerType.html">SVFIntergerType</a>();</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a6ec0236303089a01fd9da36a8bb84e0a">FunctionType</a>* ft = SVFUtil::dyn_cast<FunctionType>(T))</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  svftype = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFFunctionType.html">SVFFunctionType</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ft->getReturnType()));</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<StructType>(T))</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  svftype = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFStructType.html">SVFStructType</a>();</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<ArrayType>(T))</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>  svftype = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFArrayType.html">SVFArrayType</a>();</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  svftype = <span class="keyword">new</span> <a class="code" href="classSVF_1_1SVFOtherType.html">SVFOtherType</a>(T->isSingleValueType());</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5552135a27684cbe4d2a5ed346f64644">symInfo</a>-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a91083d9504ae5d220b28e0b3e461d4aa">addTypeInfo</a>(svftype);</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  <a class="code" href="classSVF_1_1LLVMModuleSet.html#a067661e0049314779a44c9600420820f">LLVMType2SVFType</a>[T] = svftype;</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  <span class="keywordflow">return</span> svftype;</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span> }</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span> </div><div class="line"><a name="l01065"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#aa8de934358332505d4805db137d8ec29"> 1065</a></span> <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#aa8de934358332505d4805db137d8ec29">LLVMModuleSet::collectArrayInfo</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a146d286041987860388da3d8bc85cee3">ArrayType</a>* ty)</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span> {</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> totalElemNum = ty->getNumElements();</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* elemTy = ty->getElementType();</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  <span class="keywordflow">while</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a146d286041987860388da3d8bc85cee3">ArrayType</a>* aty = SVFUtil::dyn_cast<ArrayType>(elemTy))</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  {</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  totalElemNum *= aty->getNumElements();</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  elemTy = aty->getElementType();</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>  }</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span> </div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* stinfo = <span class="keyword">new</span> <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>(totalElemNum);</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span> </div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  <span class="keywordflow">if</span>(totalElemNum==0)</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  {</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#aae0736a5e99b11571af52e28500a6f9c">addFldWithType</a>(0, <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(elemTy), 0);</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a1a07c2b1415c29d7d70791c6dfe602a3">setNumOfFieldsAndElems</a>(1, 1);</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>().push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(elemTy));</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(elemTy));</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>  <span class="keywordflow">return</span> stinfo;</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>  }</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span> </div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* elemStInfo = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a1f6cc76c996a0577b20b8cedd83fff92">collectTypeInfo</a>(elemTy);</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> nfE = elemStInfo-><a class="code" href="classSVF_1_1StInfo.html#ae5fad367673315da57a604e64b5889f0">getNumOfFlattenFields</a>();</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> j = 0; j < nfE; j++)</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  {</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* fieldTy = elemStInfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>()[j];</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>().push_back(fieldTy);</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>  }</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span> </div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> outArrayElemNum = ty->getNumElements();</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i < outArrayElemNum; i++)</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#aae0736a5e99b11571af52e28500a6f9c">addFldWithType</a>(0, <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(elemTy), (i * nfE * totalElemNum)/outArrayElemNum);</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span> </div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i < totalElemNum; i++)</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  {</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> j = 0; j < nfE; j++)</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  {</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().push_back(elemStInfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>()[j]);</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  }</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  }</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span> </div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  assert(stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().size() == nfE * totalElemNum && <span class="stringliteral">"typeForArray size incorrect!!!"</span>);</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a1a07c2b1415c29d7d70791c6dfe602a3">setNumOfFieldsAndElems</a>(nfE, nfE * totalElemNum);</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span> </div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  <span class="keywordflow">return</span> stinfo;</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span> }</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span> </div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span> </div><div class="line"><a name="l01122"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#a93315673be515ce5c2fabd36fa927128"> 1122</a></span> <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#a93315673be515ce5c2fabd36fa927128">LLVMModuleSet::collectStructInfo</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2bf58575ac7d068e0f1a4cf953b9e6cb">StructType</a> *sty, <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> &nf)</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span> {</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>  <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* stinfo = <span class="keyword">new</span> <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>(1);</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span> </div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>  <span class="comment">// Number of fields after flattening the struct</span></div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  nf = 0;</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>  <span class="comment">// The offset when considering array stride info</span></div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> strideOffset = 0;</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>  <span class="keywordflow">for</span> (StructType::element_iterator it = sty->element_begin(), ie =</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>  sty->element_end(); it != ie; ++it)</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>  {</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* et = *it;</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#aae0736a5e99b11571af52e28500a6f9c">addFldWithType</a>(nf, <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(et), strideOffset);</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span> </div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  <span class="keywordflow">if</span> (SVFUtil::isa<StructType, ArrayType>(et))</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  {</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>  <a class="code" href="classSVF_1_1StInfo.html">StInfo</a> * subStinfo = <a class="code" href="classSVF_1_1LLVMModuleSet.html#a1f6cc76c996a0577b20b8cedd83fff92">collectTypeInfo</a>(et);</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> nfE = subStinfo-><a class="code" href="classSVF_1_1StInfo.html#ae5fad367673315da57a604e64b5889f0">getNumOfFlattenFields</a>();</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  <span class="comment">//Copy ST's info, whose element 0 is the size of ST itself.</span></div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> j = 0; j < nfE; j++)</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  {</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFType.html">SVFType</a>* elemTy = subStinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>()[j];</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>().push_back(elemTy);</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  }</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>  nf += nfE;</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  strideOffset += nfE * subStinfo-><a class="code" href="classSVF_1_1StInfo.html#af5094ec542f345d214a682d4138cf690">getStride</a>();</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> tpi = 0; tpi < subStinfo-><a class="code" href="classSVF_1_1StInfo.html#af5094ec542f345d214a682d4138cf690">getStride</a>(); tpi++)</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>  {</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> tpj = 0; tpj < nfE; tpj++)</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>  {</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().push_back(subStinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>()[tpj]);</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>  }</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>  }</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>  }</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  <span class="keywordflow">else</span> <span class="comment">//simple type</span></div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  {</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  nf += 1;</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  strideOffset += 1;</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>().push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(et));</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(et));</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>  }</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>  }</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span> </div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>  assert(stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().size() == strideOffset && <span class="stringliteral">"typeForStruct size incorrect!"</span>);</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a1a07c2b1415c29d7d70791c6dfe602a3">setNumOfFieldsAndElems</a>(nf,strideOffset);</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span> </div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  <span class="keywordflow">return</span> stinfo;</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span> }</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span> </div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span> </div><div class="line"><a name="l01177"></a><span class="lineno"><a class="line" href="classSVF_1_1LLVMModuleSet.html#abcd6d9513511e6a306189a87fe3dfa06"> 1177</a></span> <a class="code" href="classSVF_1_1StInfo.html">StInfo</a>* <a class="code" href="classSVF_1_1LLVMModuleSet.html#abcd6d9513511e6a306189a87fe3dfa06">LLVMModuleSet::collectSimpleTypeInfo</a>(<a class="code" href="classSVF_1_1StInfo.html">StInfo</a> * stinfo, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* ty)</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span> {</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#aae0736a5e99b11571af52e28500a6f9c">addFldWithType</a>(0, <a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ty), 0);</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span> </div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">getFlattenFieldTypes</a>().push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ty));</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a03bfeee0406c7e54557e74f3a8e848b7">getFlattenElementTypes</a>().push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">getSVFType</a>(ty));</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  stinfo-><a class="code" href="classSVF_1_1StInfo.html#a1a07c2b1415c29d7d70791c6dfe602a3">setNumOfFieldsAndElems</a>(1,1);</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span> </div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>  <span class="keywordflow">return</span> stinfo;</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span> }</div><div class="ttc" id="classSVF_1_1SymbolTableBuilder_html"><div class="ttname"><a href="classSVF_1_1SymbolTableBuilder.html">SVF::SymbolTableBuilder</a></div><div class="ttdef"><b>Definition:</b> <a href="SymbolTableBuilder_8h_source.html#l00042">SymbolTableBuilder.h:42</a></div></div>
|
|
70
70
|
<div class="ttc" id="classSVF_1_1SVFOtherValue_html"><div class="ttname"><a href="classSVF_1_1SVFOtherValue.html">SVF::SVFOtherValue</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00978">SVFValue.h:978</a></div></div>
|
|
71
71
|
<div class="ttc" id="namespaceSVF_html_a5ae718cba37d8e34d2946530dc098c8e"><div class="ttname"><a href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">SVF::ConstantArray</a></div><div class="ttdeci">llvm::ConstantArray ConstantArray</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00097">BasicTypes.h:97</a></div></div>
|
|
72
72
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a3cbba2eb702a3481478b2590dfffa352"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a3cbba2eb702a3481478b2590dfffa352">SVF::LLVMModuleSet::getSVFGlobalValue</a></div><div class="ttdeci">SVFGlobalValue * getSVFGlobalValue(const GlobalValue *g) const</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00222">LLVMModule.h:222</a></div></div>
|
|
@@ -87,7 +87,7 @@ $(function() {
|
|
|
87
87
|
<div class="ttc" id="classSVF_1_1SymbolTableBuilder_html_aef0bb1e88d0b69313c673318f7b7cb5f"><div class="ttname"><a href="classSVF_1_1SymbolTableBuilder.html#aef0bb1e88d0b69313c673318f7b7cb5f">SVF::SymbolTableBuilder::buildMemModel</a></div><div class="ttdeci">void buildMemModel(SVFModule *svfModule)</div><div class="ttdoc">Start building memory model. </div><div class="ttdef"><b>Definition:</b> <a href="SymbolTableBuilder_8cpp_source.html#l00070">SymbolTableBuilder.cpp:70</a></div></div>
|
|
88
88
|
<div class="ttc" id="classSVF_1_1SVFConstantInt_html"><div class="ttname"><a href="classSVF_1_1SVFConstantInt.html">SVF::SVFConstantInt</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00883">SVFValue.h:883</a></div></div>
|
|
89
89
|
<div class="ttc" id="namespaceSVF_html_a23bf614858f168b6ad76e0233cec9965"><div class="ttname"><a href="namespaceSVF.html#a23bf614858f168b6ad76e0233cec9965">SVF::BasicBlock</a></div><div class="ttdeci">llvm::BasicBlock BasicBlock</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00060">BasicTypes.h:60</a></div></div>
|
|
90
|
-
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_aab7b08db9252ef7e21e54d019f44b073"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#aab7b08db9252ef7e21e54d019f44b073">SVF::LLVMModuleSet::addSVFTypeInfo</a></div><div class="ttdeci">SVFType * addSVFTypeInfo(const Type *t)</div><div class="ttdoc">Create SVFTypes. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#
|
|
90
|
+
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_aab7b08db9252ef7e21e54d019f44b073"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#aab7b08db9252ef7e21e54d019f44b073">SVF::LLVMModuleSet::addSVFTypeInfo</a></div><div class="ttdeci">SVFType * addSVFTypeInfo(const Type *t)</div><div class="ttdoc">Create SVFTypes. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l01040">LLVMModule.cpp:1040</a></div></div>
|
|
91
91
|
<div class="ttc" id="classSVF_1_1SVFMetadataAsValue_html"><div class="ttname"><a href="classSVF_1_1SVFMetadataAsValue.html">SVF::SVFMetadataAsValue</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00995">SVFValue.h:995</a></div></div>
|
|
92
92
|
<div class="ttc" id="namespaceSVF_html_a1d008c0666c145622b81d427be64c52d"><div class="ttname"><a href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">SVF::Type</a></div><div class="ttdeci">llvm::Type Type</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00057">BasicTypes.h:57</a></div></div>
|
|
93
93
|
<div class="ttc" id="namespaceSVF_html_ad49e4222ba46d9490b87a80df8b46800"><div class="ttname"><a href="namespaceSVF.html#ad49e4222ba46d9490b87a80df8b46800">SVF::ConstantFP</a></div><div class="ttdeci">llvm::ConstantFP ConstantFP</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00100">BasicTypes.h:100</a></div></div>
|
|
@@ -109,7 +109,7 @@ $(function() {
|
|
|
109
109
|
<div class="ttc" id="SVFType_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00444">SVFType.h:444</a></div></div>
|
|
110
110
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_aaab03cb6ff665bc008c67b866ba81e47"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#aaab03cb6ff665bc008c67b866ba81e47">SVF::LLVMModuleSet::buildGlobalDefToRepMap</a></div><div class="ttdeci">void buildGlobalDefToRepMap()</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00765">LLVMModule.cpp:765</a></div></div>
|
|
111
111
|
<div class="ttc" id="namespaceSVF_html_a146d286041987860388da3d8bc85cee3"><div class="ttname"><a href="namespaceSVF.html#a146d286041987860388da3d8bc85cee3">SVF::ArrayType</a></div><div class="ttdeci">llvm::ArrayType ArrayType</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00069">BasicTypes.h:69</a></div></div>
|
|
112
|
-
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a93315673be515ce5c2fabd36fa927128"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a93315673be515ce5c2fabd36fa927128">SVF::LLVMModuleSet::collectStructInfo</a></div><div class="ttdeci">StInfo * collectStructInfo(const StructType *T, u32_t &nf)</div><div class="ttdoc">Collect the struct info; nf contains the number of fields after flattening. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#
|
|
112
|
+
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a93315673be515ce5c2fabd36fa927128"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a93315673be515ce5c2fabd36fa927128">SVF::LLVMModuleSet::collectStructInfo</a></div><div class="ttdeci">StInfo * collectStructInfo(const StructType *T, u32_t &nf)</div><div class="ttdoc">Collect the struct info; nf contains the number of fields after flattening. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l01122">LLVMModule.cpp:1122</a></div></div>
|
|
113
113
|
<div class="ttc" id="SVFUtil_8h_html"><div class="ttname"><a href="SVFUtil_8h.html">SVFUtil.h</a></div></div>
|
|
114
114
|
<div class="ttc" id="cJSON_8h_html_a25d22ecc7e656d2c59332072684e8766"><div class="ttname"><a href="cJSON_8h.html#a25d22ecc7e656d2c59332072684e8766">name</a></div><div class="ttdeci">const char *const name</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00264">cJSON.h:264</a></div></div>
|
|
115
115
|
<div class="ttc" id="classSVF_1_1SVFValue_html_afe1de41ca3215b325d0ca61814c6bd6b"><div class="ttname"><a href="classSVF_1_1SVFValue.html#afe1de41ca3215b325d0ca61814c6bd6b">SVF::SVFValue::setConstDataOrAggData</a></div><div class="ttdeci">void setConstDataOrAggData()</div><div class="ttdoc">attributes to be set only through Module builders e.g., LLVMModule </div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00191">SVFValue.h:191</a></div></div>
|
|
@@ -132,7 +132,7 @@ $(function() {
|
|
|
132
132
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_ae265a7f3cc7367d62013e0f15cf3d233"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#ae265a7f3cc7367d62013e0f15cf3d233">SVF::LLVMModuleSet::getModuleNum</a></div><div class="ttdeci">u32_t getModuleNum() const</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00120">LLVMModule.h:120</a></div></div>
|
|
133
133
|
<div class="ttc" id="namespaceSVF_html_ad42bff8d0a7d60a085aa32d10f4955af"><div class="ttname"><a href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">SVF::u32_t</a></div><div class="ttdeci">unsigned u32_t</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00050">SVFType.h:50</a></div></div>
|
|
134
134
|
<div class="ttc" id="namespaceSVF_1_1LLVMUtil_html_a8a77403306e97ab4cb31a56d38bba5be"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#a8a77403306e97ab4cb31a56d38bba5be">SVF::LLVMUtil::isConstDataOrAggData</a></div><div class="ttdeci">bool isConstDataOrAggData(const Value *val)</div><div class="ttdoc">Return true if the value refers to constant data, e.g., i32 0. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8h_source.html#l00374">LLVMUtil.h:374</a></div></div>
|
|
135
|
-
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_aa8de934358332505d4805db137d8ec29"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#aa8de934358332505d4805db137d8ec29">SVF::LLVMModuleSet::collectArrayInfo</a></div><div class="ttdeci">StInfo * collectArrayInfo(const ArrayType *T)</div><div class="ttdoc">Collect the array info. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#
|
|
135
|
+
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_aa8de934358332505d4805db137d8ec29"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#aa8de934358332505d4805db137d8ec29">SVF::LLVMModuleSet::collectArrayInfo</a></div><div class="ttdeci">StInfo * collectArrayInfo(const ArrayType *T)</div><div class="ttdoc">Collect the array info. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l01065">LLVMModule.cpp:1065</a></div></div>
|
|
136
136
|
<div class="ttc" id="classSVF_1_1StInfo_html_ac0a9f85f90524abfd519d3cd2ac95a56"><div class="ttname"><a href="classSVF_1_1StInfo.html#ac0a9f85f90524abfd519d3cd2ac95a56">SVF::StInfo::getFlattenFieldTypes</a></div><div class="ttdeci">std::vector< const SVFType * > & getFlattenFieldTypes()</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00183">SVFType.h:183</a></div></div>
|
|
137
137
|
<div class="ttc" id="classSVF_1_1SVFValue_html"><div class="ttname"><a href="classSVF_1_1SVFValue.html">SVF::SVFValue</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00147">SVFValue.h:147</a></div></div>
|
|
138
138
|
<div class="ttc" id="classSVF_1_1SVFIntergerType_html"><div class="ttname"><a href="classSVF_1_1SVFIntergerType.html">SVF::SVFIntergerType</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00333">SVFType.h:333</a></div></div>
|
|
@@ -158,9 +158,9 @@ $(function() {
|
|
|
158
158
|
<div class="ttc" id="classSVF_1_1StInfo_html_af5094ec542f345d214a682d4138cf690"><div class="ttname"><a href="classSVF_1_1StInfo.html#af5094ec542f345d214a682d4138cf690">SVF::StInfo::getStride</a></div><div class="ttdeci">u32_t getStride() const</div><div class="ttdoc">Return the stride. </div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00227">SVFType.h:227</a></div></div>
|
|
159
159
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_ad3f66b40ad360003845253f452d6a711"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#ad3f66b40ad360003845253f452d6a711">SVF::LLVMModuleSet::getSVFArgument</a></div><div class="ttdeci">SVFArgument * getSVFArgument(const Argument *arg) const</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00215">LLVMModule.h:215</a></div></div>
|
|
160
160
|
<div class="ttc" id="classSVF_1_1SVFValue_html_a588acec1904d440797ca4500f63f7d28"><div class="ttname"><a href="classSVF_1_1SVFValue.html#a588acec1904d440797ca4500f63f7d28">SVF::SVFValue::setSourceLoc</a></div><div class="ttdeci">virtual void setSourceLoc(const std::string &sourceCodeInfo)</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00235">SVFValue.h:235</a></div></div>
|
|
161
|
-
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a610a7777a48132caadec167c8109f044"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a610a7777a48132caadec167c8109f044">SVF::LLVMModuleSet::getLLVMType</a></div><div class="ttdeci">const Type * getLLVMType(const SVFType *T) const</div><div class="ttdoc">Get LLVM Type. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#
|
|
161
|
+
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a610a7777a48132caadec167c8109f044"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a610a7777a48132caadec167c8109f044">SVF::LLVMModuleSet::getLLVMType</a></div><div class="ttdeci">const Type * getLLVMType(const SVFType *T) const</div><div class="ttdoc">Get LLVM Type. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00965">LLVMModule.cpp:965</a></div></div>
|
|
162
162
|
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_aab1dce633f9a03796c208b6fba2bd2b4"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#aab1dce633f9a03796c208b6fba2bd2b4">SVF::cppUtil::isVirtualCallSite</a></div><div class="ttdeci">bool isVirtualCallSite(const CallBase *cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00259">CPPUtil.cpp:259</a></div></div>
|
|
163
|
-
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a74256f36f0fdc242df9729906c34efbc"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a74256f36f0fdc242df9729906c34efbc">SVF::LLVMModuleSet::getOtherSVFConstant</a></div><div class="ttdeci">SVFConstant * getOtherSVFConstant(const Constant *oc)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#
|
|
163
|
+
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a74256f36f0fdc242df9729906c34efbc"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a74256f36f0fdc242df9729906c34efbc">SVF::LLVMModuleSet::getOtherSVFConstant</a></div><div class="ttdeci">SVFConstant * getOtherSVFConstant(const Constant *oc)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00906">LLVMModule.cpp:906</a></div></div>
|
|
164
164
|
<div class="ttc" id="classSVF_1_1SVFConstantNullPtr_html"><div class="ttname"><a href="classSVF_1_1SVFConstantNullPtr.html">SVF::SVFConstantNullPtr</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00940">SVFValue.h:940</a></div></div>
|
|
165
165
|
<div class="ttc" id="namespaceSVF_html_af739db846e47ba6b2fd15eaad31ab7fb"><div class="ttname"><a href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">SVF::Set</a></div><div class="ttdeci">std::unordered_set< Key, Hash, KeyEqual, Allocator > Set</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00094">SVFType.h:94</a></div></div>
|
|
166
166
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_ab0c0f321b6bfbfab2e4ff06d81920ab9"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#ab0c0f321b6bfbfab2e4ff06d81920ab9">SVF::LLVMModuleSet::getSVFBasicBlock</a></div><div class="ttdeci">SVFBasicBlock * getSVFBasicBlock(const BasicBlock *bb) const</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00201">LLVMModule.h:201</a></div></div>
|
|
@@ -187,7 +187,7 @@ $(function() {
|
|
|
187
187
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_af8edfe08027020f14b81b44362c6018e"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#af8edfe08027020f14b81b44362c6018e">SVF::LLVMModuleSet::build</a></div><div class="ttdeci">void build()</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00135">LLVMModule.cpp:135</a></div></div>
|
|
188
188
|
<div class="ttc" id="classSVF_1_1SVFValue_html_ac2e5c42d0ac92375c88ef5b3f1b65dc4"><div class="ttname"><a href="classSVF_1_1SVFValue.html#ac2e5c42d0ac92375c88ef5b3f1b65dc4">SVF::SVFValue::setPtrInUncalledFunction</a></div><div class="ttdeci">void setPtrInUncalledFunction()</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00195">SVFValue.h:195</a></div></div>
|
|
189
189
|
<div class="ttc" id="namespaceSVF_1_1LLVMUtil_html_a07c785d931cef3c61e3dab4c615770be"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#a07c785d931cef3c61e3dab4c615770be">SVF::LLVMUtil::isPtrInUncalledFunction</a></div><div class="ttdeci">bool isPtrInUncalledFunction(const Value *value)</div><div class="ttdoc">Return true if this is value in a dead function (function without any caller) </div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8cpp_source.html#l00171">LLVMUtil.cpp:171</a></div></div>
|
|
190
|
-
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a1f6cc76c996a0577b20b8cedd83fff92"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a1f6cc76c996a0577b20b8cedd83fff92">SVF::LLVMModuleSet::collectTypeInfo</a></div><div class="ttdeci">StInfo * collectTypeInfo(const Type *ty)</div><div class="ttdoc">Collect a type info. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#
|
|
190
|
+
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a1f6cc76c996a0577b20b8cedd83fff92"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a1f6cc76c996a0577b20b8cedd83fff92">SVF::LLVMModuleSet::collectTypeInfo</a></div><div class="ttdeci">StInfo * collectTypeInfo(const Type *ty)</div><div class="ttdoc">Collect a type info. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00998">LLVMModule.cpp:998</a></div></div>
|
|
191
191
|
<div class="ttc" id="classSVF_1_1SVFLoopAndDomInfo_html_acc409e328f641a2c9512beeb727f58c7"><div class="ttname"><a href="classSVF_1_1SVFLoopAndDomInfo.html#acc409e328f641a2c9512beeb727f58c7">SVF::SVFLoopAndDomInfo::setReachableBBs</a></div><div class="ttdeci">void setReachableBBs(BBList &bbs)</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00133">SVFValue.h:133</a></div></div>
|
|
192
192
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a5badf03aeb1ebda02bc186bbb58a892a"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a5badf03aeb1ebda02bc186bbb58a892a">SVF::LLVMModuleSet::addOtherConstantMap</a></div><div class="ttdeci">void addOtherConstantMap(const Constant *cons, SVFConstant *svfcons)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00174">LLVMModule.h:174</a></div></div>
|
|
193
193
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_ab65033f068bfbeb0a1c52dcec3beb6bc"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVF::SVFUtil::errs</a></div><div class="ttdeci">std::ostream & errs()</div><div class="ttdoc">Overwrite llvm::errs() </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00055">SVFUtil.h:55</a></div></div>
|
|
@@ -215,9 +215,9 @@ $(function() {
|
|
|
215
215
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_acf40310917909e4234282c0695a43160"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">SVF::LLVMModuleSet::getLLVMModuleSet</a></div><div class="ttdeci">static LLVMModuleSet * getLLVMModuleSet()</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00095">LLVMModule.h:95</a></div></div>
|
|
216
216
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a8af6b911b728713f66f7c809d5c0fbf1"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a8af6b911b728713f66f7c809d5c0fbf1">SVF::LLVMModuleSet::addSVFMain</a></div><div class="ttdeci">void addSVFMain()</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00550">LLVMModule.cpp:550</a></div></div>
|
|
217
217
|
<div class="ttc" id="namespaceSVF_html"><div class="ttname"><a href="namespaceSVF.html">SVF</a></div><div class="ttdoc">for isBitcode </div><div class="ttdef"><b>Definition:</b> <a href="AbstractValue_8h_source.html#l00037">AbstractValue.h:37</a></div></div>
|
|
218
|
-
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_abcd6d9513511e6a306189a87fe3dfa06"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#abcd6d9513511e6a306189a87fe3dfa06">SVF::LLVMModuleSet::collectSimpleTypeInfo</a></div><div class="ttdeci">StInfo * collectSimpleTypeInfo(StInfo *info, const Type *T)</div><div class="ttdoc">Collect simple type (non-aggregate) info. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#
|
|
218
|
+
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_abcd6d9513511e6a306189a87fe3dfa06"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#abcd6d9513511e6a306189a87fe3dfa06">SVF::LLVMModuleSet::collectSimpleTypeInfo</a></div><div class="ttdeci">StInfo * collectSimpleTypeInfo(StInfo *info, const Type *T)</div><div class="ttdoc">Collect simple type (non-aggregate) info. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l01177">LLVMModule.cpp:1177</a></div></div>
|
|
219
219
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_acde6292e719c80f93d3d1c344ab442cd"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#acde6292e719c80f93d3d1c344ab442cd">SVF::LLVMModuleSet::modules</a></div><div class="ttdeci">std::vector< std::reference_wrapper< Module > > modules</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00069">LLVMModule.h:69</a></div></div>
|
|
220
|
-
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a0ef17c1d5e6a95c597d2334ea577a965"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a0ef17c1d5e6a95c597d2334ea577a965">SVF::LLVMModuleSet::getSVFOtherValue</a></div><div class="ttdeci">SVFOtherValue * getSVFOtherValue(const Value *ov)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#
|
|
220
|
+
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a0ef17c1d5e6a95c597d2334ea577a965"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a0ef17c1d5e6a95c597d2334ea577a965">SVF::LLVMModuleSet::getSVFOtherValue</a></div><div class="ttdeci">SVFOtherValue * getSVFOtherValue(const Value *ov)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00922">LLVMModule.cpp:922</a></div></div>
|
|
221
221
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a298966366b02d0a34f409c2c77da3789"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a298966366b02d0a34f409c2c77da3789">SVF::LLVMModuleSet::loadModules</a></div><div class="ttdeci">void loadModules(const std::vector< std::string > &moduleNameVec)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00406">LLVMModule.cpp:406</a></div></div>
|
|
222
222
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_ae365189769640adb919a23c36978e5e2"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#ae365189769640adb919a23c36978e5e2">SVF::LLVMModuleSet::owned_modules</a></div><div class="ttdeci">std::vector< std::unique_ptr< Module > > owned_modules</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00068">LLVMModule.h:68</a></div></div>
|
|
223
223
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a20162d2894d6a12ba29410311fba4002"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a20162d2894d6a12ba29410311fba4002">SVF::LLVMModuleSet::initSVFBasicBlock</a></div><div class="ttdeci">void initSVFBasicBlock(const Function *func)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00240">LLVMModule.cpp:240</a></div></div>
|
|
@@ -241,7 +241,7 @@ $(function() {
|
|
|
241
241
|
<div class="ttc" id="classSVF_1_1SVFModule_html_a1357c876eccedd58b3abe68875b3a570"><div class="ttname"><a href="classSVF_1_1SVFModule.html#a1357c876eccedd58b3abe68875b3a570">SVF::SVFModule::pagReadFromTXT</a></div><div class="ttdeci">static bool pagReadFromTXT()</div><div class="ttdef"><b>Definition:</b> <a href="SVFModule_8h_source.html#l00089">SVFModule.h:89</a></div></div>
|
|
242
242
|
<div class="ttc" id="namespaceSVF_html_a1f4624771922dc8c2447ad7433588c73"><div class="ttname"><a href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">SVF::CallBase</a></div><div class="ttdeci">llvm::CallBase CallBase</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00119">BasicTypes.h:119</a></div></div>
|
|
243
243
|
<div class="ttc" id="classSVF_1_1Options_html_a3a718b0a27c2d13878c0718af97ad73d"><div class="ttname"><a href="classSVF_1_1Options.html#a3a718b0a27c2d13878c0718af97ad73d">SVF::Options::SVFMain</a></div><div class="ttdeci">static const Option< bool > SVFMain</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00212">Options.h:212</a></div></div>
|
|
244
|
-
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_afdd77bc1fca91f70b2ec362f1dacd392"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">SVF::LLVMModuleSet::getSVFValue</a></div><div class="ttdeci">SVFValue * getSVFValue(const Value *value)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#
|
|
244
|
+
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_afdd77bc1fca91f70b2ec362f1dacd392"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#afdd77bc1fca91f70b2ec362f1dacd392">SVF::LLVMModuleSet::getSVFValue</a></div><div class="ttdeci">SVFValue * getSVFValue(const Value *value)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00942">LLVMModule.cpp:942</a></div></div>
|
|
245
245
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a4b94c96898dbbc71bc1cee04786cf3dc"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a4b94c96898dbbc71bc1cee04786cf3dc">SVF::LLVMModuleSet::LLVMConst2SVFConst</a></div><div class="ttdeci">LLVMConst2SVFConstMap LLVMConst2SVFConst</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00082">LLVMModule.h:82</a></div></div>
|
|
246
246
|
<div class="ttc" id="classSVF_1_1SVFFunction_html_a0d5031bd11b6372803082111ec2cb4f6"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#a0d5031bd11b6372803082111ec2cb4f6">SVF::SVFFunction::addBasicBlock</a></div><div class="ttdeci">void addBasicBlock(const SVFBasicBlock *bb)</div><div class="ttdoc">all formal arguments of this function </div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00283">SVFValue.h:283</a></div></div>
|
|
247
247
|
<div class="ttc" id="classSVF_1_1StInfo_html_a1a07c2b1415c29d7d70791c6dfe602a3"><div class="ttname"><a href="classSVF_1_1StInfo.html#a1a07c2b1415c29d7d70791c6dfe602a3">SVF::StInfo::setNumOfFieldsAndElems</a></div><div class="ttdeci">void setNumOfFieldsAndElems(u32_t nf, u32_t ne)</div><div class="ttdoc">Set number of fields and elements of an aggrate. </div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00209">SVFType.h:209</a></div></div>
|
|
@@ -249,7 +249,7 @@ $(function() {
|
|
|
249
249
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a7de84e7817406867b173e1591e0681ac"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a7de84e7817406867b173e1591e0681ac">SVF::LLVMModuleSet::addGlobalValueMap</a></div><div class="ttdeci">void addGlobalValueMap(const GlobalValue *glob, SVFGlobalValue *svfglob)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00164">LLVMModule.h:164</a></div></div>
|
|
250
250
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a8b5f24c873db1f6a0614d1dac48bb4bb"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a8b5f24c873db1f6a0614d1dac48bb4bb">SVF::LLVMModuleSet::prePassSchedule</a></div><div class="ttdeci">void prePassSchedule()</div><div class="ttdoc">Invoke llvm passes to modify module. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00362">LLVMModule.cpp:362</a></div></div>
|
|
251
251
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_ac7c646a78c989807c52263fc35fb3628"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#ac7c646a78c989807c52263fc35fb3628">SVF::LLVMModuleSet::buildFunToFunMap</a></div><div class="ttdeci">void buildFunToFunMap()</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00650">LLVMModule.cpp:650</a></div></div>
|
|
252
|
-
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a5f0bd932f3129a9c565f3a09711f7b99"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">SVF::LLVMModuleSet::getSVFType</a></div><div class="ttdeci">SVFType * getSVFType(const Type *T)</div><div class="ttdoc">Get or create SVFType and typeinfo. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#
|
|
252
|
+
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a5f0bd932f3129a9c565f3a09711f7b99"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a5f0bd932f3129a9c565f3a09711f7b99">SVF::LLVMModuleSet::getSVFType</a></div><div class="ttdeci">SVFType * getSVFType(const Type *T)</div><div class="ttdoc">Get or create SVFType and typeinfo. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8cpp_source.html#l00979">LLVMModule.cpp:979</a></div></div>
|
|
253
253
|
<div class="ttc" id="cJSON_8h_html_ad4c68ea99a26b0a98ad9a79982960458"><div class="ttname"><a href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">string</a></div><div class="ttdeci">const char *const string</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00172">cJSON.h:172</a></div></div>
|
|
254
254
|
<div class="ttc" id="SVFType_8h_html_a173ce1b9b505fdadf5613b663749d3b0"><div class="ttname"><a href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a></div><div class="ttdeci">#define DBOUT(TYPE, X)</div><div class="ttdoc">LLVM debug macros, define type of your DEBUG model of each pass. </div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00417">SVFType.h:417</a></div></div>
|
|
255
255
|
<div class="ttc" id="classSVF_1_1SVFConstantFP_html"><div class="ttname"><a href="classSVF_1_1SVFConstantFP.html">SVF::SVFConstantFP</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00915">SVFValue.h:915</a></div></div>
|