svf-tools 1.0.603 → 1.0.604
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/Andersen_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/CFLGraphBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +11 -11
- package/SVF-doxygen/html/html/CHG_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/CPPUtil_8cpp.html +17 -17
- package/SVF-doxygen/html/html/CPPUtil_8cpp_source.html +29 -29
- package/SVF-doxygen/html/html/CPPUtil_8h_source.html +17 -17
- package/SVF-doxygen/html/html/CSC_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/CallGraphBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/Casting_8h.html +68 -12
- package/SVF-doxygen/html/html/Casting_8h_source.html +49 -42
- package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/DCHG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/DCHG_8h_source.html +2 -2
- package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/IRAnnotator_8h.html +2 -1
- package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +21 -21
- package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/LLVMUtil_8h_source.html +2 -2
- package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +2 -2
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/SVFValue_8h_source.html +2 -2
- package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/annotated.html +31 -27
- package/SVF-doxygen/html/html/classSVF_1_1AliasCFLGraphBuilder.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +10 -10
- package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +23 -23
- package/SVF-doxygen/html/html/classSVF_1_1CHGraph.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CSC.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +22 -22
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1IRAnnotator.html +61 -61
- package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +12 -12
- package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1RaceResultValidator.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1SVFCallInst.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraphBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1VFCFLGraphBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive_1_1SCC.html +2 -2
- package/SVF-doxygen/html/html/classes.html +108 -107
- package/SVF-doxygen/html/html/functions_d.html +1 -1
- package/SVF-doxygen/html/html/functions_func_d.html +1 -1
- package/SVF-doxygen/html/html/functions_i.html +3 -3
- package/SVF-doxygen/html/html/functions_o.html +12 -12
- package/SVF-doxygen/html/html/functions_p.html +6 -6
- package/SVF-doxygen/html/html/functions_r.html +6 -4
- package/SVF-doxygen/html/html/functions_s.html +13 -11
- package/SVF-doxygen/html/html/functions_t.html +8 -4
- package/SVF-doxygen/html/html/functions_type_r.html +1 -1
- package/SVF-doxygen/html/html/functions_type_s.html +1 -1
- package/SVF-doxygen/html/html/functions_type_t.html +6 -0
- package/SVF-doxygen/html/html/functions_v.html +3 -3
- package/SVF-doxygen/html/html/functions_w.html +9 -9
- package/SVF-doxygen/html/html/globals_defs.html +10 -0
- package/SVF-doxygen/html/html/globals_l.html +8 -2
- package/SVF-doxygen/html/html/hierarchy.html +502 -498
- package/SVF-doxygen/html/html/include_2MTA_2MTAResultValidator_8h_source.html +2 -2
- package/SVF-doxygen/html/html/menudata.js +1 -0
- package/SVF-doxygen/html/html/namespaceSVF_1_1LLVMUtil.html +13 -13
- package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +45 -36
- package/SVF-doxygen/html/html/namespaceSVF_1_1cppUtil.html +46 -46
- package/SVF-doxygen/html/html/namespacemembers_d.html +1 -1
- package/SVF-doxygen/html/html/namespacemembers_func_c.html +1 -1
- package/SVF-doxygen/html/html/search/all_1.js +4 -0
- package/SVF-doxygen/html/html/search/all_10.js +2 -2
- package/SVF-doxygen/html/html/search/all_11.js +3 -3
- package/SVF-doxygen/html/html/search/all_12.js +9 -9
- package/SVF-doxygen/html/html/search/all_13.js +5 -5
- package/SVF-doxygen/html/html/search/all_15.js +3 -3
- package/SVF-doxygen/html/html/search/all_16.js +1 -1
- package/SVF-doxygen/html/html/search/all_3.js +1 -1
- package/SVF-doxygen/html/html/search/all_4.js +2 -2
- package/SVF-doxygen/html/html/search/all_9.js +2 -2
- package/SVF-doxygen/html/html/search/all_c.js +2 -0
- package/SVF-doxygen/html/html/search/all_e.js +1 -1
- package/SVF-doxygen/html/html/search/all_f.js +1 -1
- package/SVF-doxygen/html/html/search/classes_0.js +4 -0
- package/SVF-doxygen/html/html/search/classes_8.js +1 -1
- package/SVF-doxygen/html/html/search/defines_9.js +2 -2
- package/SVF-doxygen/html/html/search/defines_a.js +2 -4
- package/SVF-doxygen/html/html/search/defines_b.js +4 -3
- package/SVF-doxygen/html/html/search/functions_2.js +1 -1
- package/SVF-doxygen/html/html/search/functions_3.js +2 -2
- package/SVF-doxygen/html/html/search/searchdata.js +1 -1
- package/SVF-doxygen/html/html/search/typedefs_10.js +1 -1
- package/SVF-doxygen/html/html/search/typedefs_11.js +1 -1
- package/SVF-doxygen/html/html/search/typedefs_f.js +1 -1
- package/SVF-doxygen/html/html/search/variables_13.js +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__const__past__pointer-members.html +81 -0
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__const__past__pointer.html +117 -0
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__const__past__pointer_3_01T_00_01std_1_1enable__if__t_3_01std_1_1is_7fffc8df953a67082a10c9027356ecdf.html +116 -0
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__const__past__pointer_3_01T_00_01std_1_1enable__if__t_3_01std_1_1is_cb99dfac8a8d563a9cc95333664bb3b0.html +81 -0
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__lvalue__reference__if__not__pointer-members.html +81 -0
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__lvalue__reference__if__not__pointer.html +120 -0
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__lvalue__reference__if__not__pointer_3_01T_00_01std_1_1enable__if__t915410d772a4855ec3d21a633a25ee09.html +116 -0
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1add__lvalue__reference__if__not__pointer_3_01T_00_01std_1_1enable__if__t988b83cd34ecdeca7da70d983bff292c.html +81 -0
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__convert__val.html +5 -5
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__convert__val_3_01To_00_01FromTy_00_01FromTy_01_4.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01From_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5const_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html +4 -4
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__wrap.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__simple__type.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl_3_01To_00_01From_00_01std_1_1enable__if__t_3_01std_1_1is__base69cc7dc7020ea1b36a974ffb5131e932.html +81 -0
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl_3_01To_00_01From_00_01std_1_1enable__if__t_3_01std_1_1is__baseacbe8554d65d479d86c5b7d994311309.html +132 -0
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5_01_4.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5const_01_4.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_4.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5_01_4.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5const_01_4.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01std_1_1unique__ptr_3_01From_01_4_01_4.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__wrap.html +5 -5
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1isa__impl__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1simplify__type.html +4 -4
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4-members.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html +20 -20
- package/SVF-doxygen/html/html/tools_2MTA_2MTAResultValidator_8h_source.html +2 -2
- package/include/SVF-LLVM/IRAnnotator.h +1 -0
- package/include/Util/Casting.h +85 -29
- package/lib/SVF-LLVM/CHGBuilder.cpp +2 -2
- package/lib/SVF-LLVM/CPPUtil.cpp +7 -8
- package/package.json +1 -1
|
@@ -66,7 +66,7 @@ $(function() {
|
|
|
66
66
|
<div class="title">CHGBuilder.cpp</div> </div>
|
|
67
67
|
</div><!--header-->
|
|
68
68
|
<div class="contents">
|
|
69
|
-
<a href="CHGBuilder_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">//===----- CHGBuiler.cpp -- Class hierarchy graph builder ---------------------------//</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-> <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"> * CHGBuiler.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: Jun 4, 2021</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * Author: Yulei Sui</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include <set></span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include <vector></span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include <map></span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include <fstream></span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include <iostream></span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="preprocessor">#include <iomanip></span> <span class="comment">// setw() for formatting cout</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="preprocessor">#include <assert.h></span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="preprocessor">#include <stack></span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="preprocessor">#include "<a class="code" href="CHGBuilder_8h.html">SVF-LLVM/CHGBuilder.h</a>"</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="preprocessor">#include "<a class="code" href="CPPUtil_8h.html">SVF-LLVM/CPPUtil.h</a>"</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="preprocessor">#include "<a class="code" href="SymbolTableInfo_8h.html">SVFIR/SymbolTableInfo.h</a>"</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="preprocessor">#include "<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>"</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="preprocessor">#include "<a class="code" href="LLVMUtil_8h.html">SVF-LLVM/LLVMUtil.h</a>"</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="preprocessor">#include "<a class="code" href="SVFModule_8h.html">SVFIR/SVFModule.h</a>"</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="preprocessor">#include "<a class="code" href="PTAStat_8h.html">Util/PTAStat.h</a>"</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> </div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVFUtil.html">SVFUtil</a>;</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="keyword">using namespace </span><a class="code" href="namespacecppUtil.html">cppUtil</a>;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="keyword">using namespace </span><a class="code" href="namespaceLLVMUtil.html">LLVMUtil</a>;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="keyword">using namespace </span><a class="code" href="namespacestd.html">std</a>;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="CHGBuilder_8cpp.html#a5b49460faf973332d3cbfc561c994c6c"> 54</a></span> <span class="keyword">const</span> <span class="keywordtype">string</span> <a class="code" href="CHGBuilder_8cpp.html#a5b49460faf973332d3cbfc561c994c6c">pureVirtualFunName</a> = <span class="stringliteral">"__cxa_pure_virtual"</span>;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> </div><div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="CHGBuilder_8cpp.html#a4ecb39b2fb5510fb20341373b7ad5450"> 56</a></span> <span class="keyword">const</span> <span class="keywordtype">string</span> <a class="code" href="CHGBuilder_8cpp.html#a4ecb39b2fb5510fb20341373b7ad5450">ztiLabel</a> = <span class="stringliteral">"_ZTI"</span>;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> </div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> </div><div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#aa5c672ac426ad4085d64d97f8cb14ace"> 59</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#aa5c672ac426ad4085d64d97f8cb14ace">CHGBuilder::buildCHG</a>()</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> {</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> </div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <span class="keywordtype">double</span> timeStart, timeEnd;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  timeStart = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</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>()->getLLVMModules())</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  {</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</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">outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"construct CHGraph From module "</span></div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  + M.getName().str() + <span class="stringliteral">"...\n"</span>));</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  readInheritanceMetadataFromModule(M);</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="keywordflow">for</span> (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I)</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  buildCHGNodes(&(*I));</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <span class="keywordflow">for</span> (Module::const_iterator F = M.begin(), E = M.end(); F != E; ++F)</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  buildCHGNodes(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a3d34fcdfc98add848a34fd5259c11eb2">LLVMUtil::getDefFunForMultipleModule</a>(&(*F)));</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="keywordflow">for</span> (Module::const_iterator F = M.begin(), E = M.end(); F != E; ++F)</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  buildCHGEdges(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a3d34fcdfc98add848a34fd5259c11eb2">LLVMUtil::getDefFunForMultipleModule</a>(&(*F)));</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>  analyzeVTables(M);</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"> 79</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">outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"build Internal Maps ...\n"</span>));</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  buildInternalMaps();</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>  timeEnd = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  chg->buildingCHGTime = (timeEnd - timeStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span> </div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#ab13a47f6dd4eedfaa607d36448a1d456">Options::DumpCHA</a>)</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  chg->dump(<span class="stringliteral">"cha"</span>);</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> }</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div><div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a648e97899c16a5634fc8369aef8a031f"> 89</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a648e97899c16a5634fc8369aef8a031f">CHGBuilder::buildCHGNodes</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a> *globalvalue)</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> {</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#aeef0f5c6486379043a7d47b0635f2667">isValVtbl</a>(globalvalue) && globalvalue->getNumOperands() > 0)</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  {</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a> *vtblStruct = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a>>(globalvalue->getOperand(0));</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  assert(vtblStruct && <span class="stringliteral">"Initializer of a vtable not a struct?"</span>);</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keywordtype">string</span> className = <a class="code" href="namespaceSVF_1_1cppUtil.html#a9e66b5eaf8b24917d0d3e2e98461f15c">getClassNameFromVtblObj</a>(globalvalue->getName().str());</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keywordflow">if</span> (!chg->getNode(className))</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  createNode(className);</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> </div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ei = 0; ei < vtblStruct->getNumOperands(); ++ei)</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="keyword">const</span> <a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a> *vtbl = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a>>(vtblStruct->getOperand(ei));</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  assert(vtbl && <span class="stringliteral">"Element of initializer not an array?"</span>);</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i < vtbl->getNumOperands(); ++i)</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>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *ce = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#af983b0e1fbd371d8672e8f03f63084fc">isCastConstantExpr</a>(vtbl->getOperand(i)))</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="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* bitcastValue = ce->getOperand(0);</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* func = SVFUtil::dyn_cast<Function>(bitcastValue))</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  {</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(func->getName().str());</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="keywordflow">if</span> (!chg->getNode(dname.className))</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  createNode(dname.className);</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>  }</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  }</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  }</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  }</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> </div><div class="line"><a name="l00120"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#abca5a0a010fdb63a3fa8b92ea0dd55e6"> 120</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a648e97899c16a5634fc8369aef8a031f">CHGBuilder::buildCHGNodes</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* F)</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> {</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#ad6f9578cdce518141772a11617160da8">isConstructor</a>(F) || <a class="code" href="namespaceSVF_1_1cppUtil.html#af19bec54621f4605bac4feaf9f73803c">isDestructor</a>(F))</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  {</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(F->getName().str());</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a263149d980e5c3165dfe8750bfac3223">DCHA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\t build CHANode for class "</span> + dname.className + <span class="stringliteral">"...\n"</span>);</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keywordflow">if</span> (!chg->getNode(dname.className))</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  createNode(dname.className);</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  }</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> }</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> </div><div class="line"><a name="l00131"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a87ad835786fb8fed2a24c122fa839c25"> 131</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a87ad835786fb8fed2a24c122fa839c25">CHGBuilder::buildCHGEdges</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* F)</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span> {</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#ad6f9578cdce518141772a11617160da8">isConstructor</a>(F) || <a class="code" href="namespaceSVF_1_1cppUtil.html#af19bec54621f4605bac4feaf9f73803c">isDestructor</a>(F))</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  {</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keywordflow">for</span> (Function::const_iterator B = F->begin(), E = F->end(); B != E; ++B)</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">for</span> (BasicBlock::const_iterator I = B->begin(), E = B->end(); I != E; ++I)</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  {</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a5a7dc8680a9714e08b01dd339b85bb20">LLVMUtil::isCallSite</a>(&(*I)))</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  {</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  connectInheritEdgeViaCall(F, SVFUtil::cast<CallBase>(&(*I)));</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">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab696aab940eb187dc81217efe8649af5">StoreInst</a> *store = SVFUtil::dyn_cast<StoreInst>(&(*I)))</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  {</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  connectInheritEdgeViaStore(F, store);</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  }</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  }</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"> 150</span> }</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> </div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> </div><div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#ad9f1c51ba6dc279f22aa671f29257a50"> 153</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#ad9f1c51ba6dc279f22aa671f29257a50">CHGBuilder::buildInternalMaps</a>()</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> {</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  buildClassNameToAncestorsDescendantsMap();</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  buildVirtualFunctionToIDMap();</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  buildCSToCHAVtblsAndVfnsMap();</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> }</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span> </div><div class="line"><a name="l00160"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#ae6d92d48149334b177e9cb8be411b09d"> 160</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#ae6d92d48149334b177e9cb8be411b09d">CHGBuilder::connectInheritEdgeViaCall</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* caller, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* cs)</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span> {</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">getCallee</a>(cs) == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> </div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">getCallee</a>(cs);</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span> </div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(caller->getName().str());</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="keywordflow">if</span> ((<a class="code" href="namespaceSVF_1_1cppUtil.html#ad6f9578cdce518141772a11617160da8">isConstructor</a>(caller) && <a class="code" href="namespaceSVF_1_1cppUtil.html#ad6f9578cdce518141772a11617160da8">isConstructor</a>(callee)) || (<a class="code" href="namespaceSVF_1_1cppUtil.html#af19bec54621f4605bac4feaf9f73803c">isDestructor</a>(caller) && <a class="code" href="namespaceSVF_1_1cppUtil.html#af19bec54621f4605bac4feaf9f73803c">isDestructor</a>(callee)))</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  {</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <span class="keywordflow">if</span> (cs->arg_size() < 1 || (cs->arg_size() < 2 && cs->paramHasAttr(0, llvm::Attribute::StructRet)))</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* csThisPtr = <a class="code" href="namespaceSVF_1_1cppUtil.html#a643736d0d9aae502784f736f492201b4">getVCallThisPtr</a>(cs);</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="comment">//const Argument* consThisPtr = getConstructorThisPtr(caller);</span></div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="comment">//bool samePtr = isSameThisPtrInConstructor(consThisPtr, csThisPtr);</span></div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keywordtype">bool</span> samePtrTrue = <span class="keyword">true</span>;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <span class="keywordflow">if</span> (csThisPtr != <span class="keyword">nullptr</span> && samePtrTrue)</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  {</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keyword">struct </span>DemangledName basename = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(callee->getName().str());</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="keywordflow">if</span> (!<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a5a7dc8680a9714e08b01dd339b85bb20">LLVMUtil::isCallSite</a>(csThisPtr) &&</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  basename.className.size() > 0)</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  {</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  chg->addEdge(dname.className, basename.className, <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">CHEdge::INHERITANCE</a>);</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>  }</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  }</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> }</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> </div><div class="line"><a name="l00188"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a2898888c29261911388a9295bc969567"> 188</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a2898888c29261911388a9295bc969567">CHGBuilder::connectInheritEdgeViaStore</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* caller, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab696aab940eb187dc81217efe8649af5">StoreInst</a>* storeInst)</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span> {</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(caller->getName().str());</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *ce = SVFUtil::dyn_cast<ConstantExpr>(storeInst->getValueOperand()))</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  {</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordflow">if</span> (ce->getOpcode() == Instruction::BitCast)</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  {</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* bitcastval = ce->getOperand(0);</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *bcce = SVFUtil::dyn_cast<ConstantExpr>(bitcastval))</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>  <span class="keywordflow">if</span> (bcce->getOpcode() == Instruction::GetElementPtr)</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  {</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* gepval = bcce->getOperand(0);</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#aeef0f5c6486379043a7d47b0635f2667">isValVtbl</a>(gepval))</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="keywordtype">string</span> vtblClassName = <a class="code" href="namespaceSVF_1_1cppUtil.html#a9e66b5eaf8b24917d0d3e2e98461f15c">getClassNameFromVtblObj</a>(gepval->getName().str());</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <span class="keywordflow">if</span> (vtblClassName.size() > 0 && dname.className.compare(vtblClassName) != 0)</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  {</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  chg->addEdge(dname.className, vtblClassName, <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">CHEdge::INHERITANCE</a>);</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="l00209"></a><span class="lineno"> 209</span>  }</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  }</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  }</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> }</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span> </div><div class="line"><a name="l00215"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a443b021eb2b08b92164515750385b058"> 215</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a443b021eb2b08b92164515750385b058">CHGBuilder::readInheritanceMetadataFromModule</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M)</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span> {</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordflow">for</span> (Module::const_named_metadata_iterator mdit = M.named_metadata_begin(),</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  mdeit = M.named_metadata_end(); mdit != mdeit; ++mdit)</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>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a3011dbac9102f044ad5f36a4ad3d4a71">NamedMDNode</a> *md = &*mdit;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="keywordtype">string</span> mdname = md->getName().str();</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keywordflow">if</span> (mdname.compare(0, 15, <span class="stringliteral">"__cxx_bases_of_"</span>) != 0)</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordtype">string</span> className = mdname.substr(15);</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="keywordflow">for</span> (NamedMDNode::const_op_iterator opit = md->op_begin(),</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  opeit = md->op_end(); opit != opeit; ++opit)</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#ad3d3cec1813411f039211c86236f7adb">MDNode</a> *N = *opit;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a28eec26ec8edaa5e96aecfeb01f6c0d4">MDString</a> &mdstr = SVFUtil::cast<MDString>(N->getOperand(0));</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keywordtype">string</span> baseName = mdstr.getString().str();</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  chg->addEdge(className, baseName, <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">CHEdge::INHERITANCE</a>);</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</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> }</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span> </div><div class="line"><a name="l00236"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a8e915f257224b1d8e40d0e4c9b5e1df0"> 236</a></span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *<a class="code" href="classSVF_1_1CHGBuilder.html#a8e915f257224b1d8e40d0e4c9b5e1df0">CHGBuilder::createNode</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> className)</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>  assert(!chg->getNode(className) && <span class="stringliteral">"this node should never be created before!"</span>);</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> * node = <span class="keyword">new</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a>(className, chg->classNum++);</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  chg->classNameToNodeMap[className] = node;</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  chg->addGNode(node->getId(), node);</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordflow">if</span> (className.size() > 0 && className[className.size() - 1] == <span class="charliteral">'>'</span>)</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="keywordtype">string</span> templateName = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1cf2e4671b16b477cc779c72f2419234">getBeforeBrackets</a>(className);</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a>* templateNode = chg->getNode(templateName);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">if</span> (!templateNode)</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>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a263149d980e5c3165dfe8750bfac3223">DCHA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\t Create Template CHANode "</span> + templateName + <span class="stringliteral">" for class "</span> + className + <span class="stringliteral">"...\n"</span>);</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  templateNode = createNode(templateName);</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  templateNode-><a class="code" href="classSVF_1_1CHNode.html#a00343177422c8d84d707432d0c483438">setTemplate</a>();</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  }</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  chg->addEdge(className, templateName, <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a8721eaefd547d6ba5229463d644815f4">CHEdge::INSTANTCE</a>);</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  chg->addInstances(templateName,node);</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  }</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  <span class="keywordflow">return</span> node;</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span> }</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span> </div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span> <span class="comment">/*</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> <span class="comment"> * build the following two maps:</span></div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span> <span class="comment"> * classNameToDescendantsMap</span></div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span> <span class="comment"> * chg->classNameToAncestorsMap</span></div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> <span class="comment"> */</span></div><div class="line"><a name="l00263"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#ae7832c277f0ff86f3ae750aac6063adb"> 263</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#ae7832c277f0ff86f3ae750aac6063adb">CHGBuilder::buildClassNameToAncestorsDescendantsMap</a>()</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span> {</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> </div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">CHGraph::const_iterator</a> it = chg->begin(), eit = chg->end();</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  it != eit; ++it)</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  {</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *node = it->second;</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <a class="code" href="classSVF_1_1FIFOWorkList.html">WorkList</a> worklist;</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <a class="code" href="classSVF_1_1CHGBuilder.html#adbff217477a779de9024d9a5777413a7">CHNodeSetTy</a> visitedNodes;</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a0df409a67428e528321869d201f2a474">push</a>(node);</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordflow">while</span> (!worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">empty</a>())</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  {</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *curnode = worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">pop</a>();</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keywordflow">if</span> (visitedNodes.find(curnode) == visitedNodes.end())</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  {</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">for</span> (CHEdge::CHEdgeSetTy::const_iterator it =</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  curnode-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>().begin(), eit =</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  curnode-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>().end(); it != eit; ++it)</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>  <span class="keywordflow">if</span> ((*it)->getEdgeType() == <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">CHEdge::INHERITANCE</a>)</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  {</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *succnode = (*it)->getDstNode();</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  chg->classNameToAncestorsMap[node-><a class="code" href="classSVF_1_1CHNode.html#af6e71c1a932464b1b615fc177f5af089">getName</a>()].insert(succnode);</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  chg->classNameToDescendantsMap[succnode-><a class="code" href="classSVF_1_1CHNode.html#af6e71c1a932464b1b615fc177f5af089">getName</a>()].insert(node);</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a0df409a67428e528321869d201f2a474">push</a>(succnode);</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  }</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  }</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  visitedNodes.insert(curnode);</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  }</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  }</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  }</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span> }</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> </div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> </div><div class="line"><a name="l00297"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a444dba7f18bee07a6cad51f88bb63e30"> 297</a></span> <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHGraph.html#ad0f60c720b277c60ed8a8966189bb42b">CHGraph::CHNodeSetTy</a>& <a class="code" href="classSVF_1_1CHGBuilder.html#a444dba7f18bee07a6cad51f88bb63e30">CHGBuilder::getInstancesAndDescendants</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> className)</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span> {</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span> </div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  CHGraph::NameToCHNodesMap::const_iterator it = chg->classNameToInstAndDescsMap.find(className);</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <span class="keywordflow">if</span> (it != chg->classNameToInstAndDescsMap.end())</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>  <span class="keywordflow">return</span> it->second;</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>  <span class="keywordflow">else</span></div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  {</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  chg->classNameToInstAndDescsMap[className] = chg->getDescendants(className);</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keywordflow">if</span> (chg->getNode(className)->isTemplate())</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="keyword">const</span> <a class="code" href="classSVF_1_1CHGBuilder.html#adbff217477a779de9024d9a5777413a7">CHNodeSetTy</a>& instances = chg->getInstances(className);</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <span class="keywordflow">for</span> (CHNodeSetTy::const_iterator it = instances.begin(), eit = instances.end(); it != eit; ++it)</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  {</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *node = *it;</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  chg->classNameToInstAndDescsMap[className].insert(node);</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHGBuilder.html#adbff217477a779de9024d9a5777413a7">CHNodeSetTy</a>& instance_descendants = chg->getDescendants(node-><a class="code" href="classSVF_1_1CHNode.html#af6e71c1a932464b1b615fc177f5af089">getName</a>());</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keywordflow">for</span> (CHNodeSetTy::const_iterator dit =</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  instance_descendants.begin(), deit =</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  instance_descendants.end(); dit != deit; ++dit)</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  {</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  chg->classNameToInstAndDescsMap[className].insert(*dit);</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  }</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  }</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  }</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <span class="keywordflow">return</span> chg->classNameToInstAndDescsMap[className];</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  }</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span> }</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span> </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="comment">/*</span></div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> <span class="comment"> * do the following things:</span></div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span> <span class="comment"> * 1. initialize virtualFunctions for each class</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span> <span class="comment"> * 2. mark multi-inheritance classes</span></div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span> <span class="comment"> * 3. mark pure abstract classes</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span> <span class="comment"> *</span></div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span> <span class="comment"> * Layout of VTables:</span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span> <span class="comment"> *</span></div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span> <span class="comment"> * 1. single inheritance</span></div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span> <span class="comment"> * class A {...};</span></div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span> <span class="comment"> * class B: public A {...};</span></div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span> <span class="comment"> * B's vtable: {i8 *null, _ZTI1B, ...}</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span> <span class="comment"> *</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span> <span class="comment"> * 2. normal multiple inheritance</span></div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span> <span class="comment"> * class A {...};</span></div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span> <span class="comment"> * class B {...};</span></div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span> <span class="comment"> * class C: public A, public B {...};</span></div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span> <span class="comment"> * C's vtable: {i8 *null, _ZTI1C, ..., inttoptr xxx, _ZTI1C, ...}</span></div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span> <span class="comment"> * "inttoptr xxx" servers as a delimiter for dividing virtual methods inherited</span></div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span> <span class="comment"> * from "class A" and "class B"</span></div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span> <span class="comment"> *</span></div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span> <span class="comment"> * 3. virtual diamond inheritance</span></div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span> <span class="comment"> * class A {...};</span></div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span> <span class="comment"> * class B: public virtual A {...};</span></div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span> <span class="comment"> * class C: public virtual A {...};</span></div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span> <span class="comment"> * class D: public B, public C {...};</span></div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span> <span class="comment"> * D's vtable: {i8 *null, _ZTI1C, ..., inttoptr xxx, _ZTI1C, i8 *null, ...}</span></div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> <span class="comment"> * there will several "i8 *null" following "inttoptr xxx, _ZTI1C,", and the</span></div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> <span class="comment"> * number of "i8 *null" is the same as the number of virtual methods in</span></div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span> <span class="comment"> * "class A"</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> <span class="comment"> */</span></div><div class="line"><a name="l00362"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a2828eb6b2bd86d6f279967c34da8e7e4"> 362</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a2828eb6b2bd86d6f279967c34da8e7e4">CHGBuilder::analyzeVTables</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M)</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> {</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <span class="keywordflow">for</span> (Module::const_global_iterator I = M.global_begin(),</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  E = M.global_end(); I != E; ++I)</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  {</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a> *globalvalue = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a>>(&(*I));</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#aeef0f5c6486379043a7d47b0635f2667">isValVtbl</a>(globalvalue) && globalvalue->getNumOperands() > 0)</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>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a> *vtblStruct =</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a>>(globalvalue->getOperand(0));</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  assert(vtblStruct && <span class="stringliteral">"Initializer of a vtable not a struct?"</span>);</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> </div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <span class="keywordtype">string</span> vtblClassName = <a class="code" href="namespaceSVF_1_1cppUtil.html#a9e66b5eaf8b24917d0d3e2e98461f15c">getClassNameFromVtblObj</a>(globalvalue->getName().str());</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *node = chg->getNode(vtblClassName);</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  assert(node && <span class="stringliteral">"node not found?"</span>);</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>  node->setVTable(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFGlobalValue(globalvalue));</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span> </div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ei = 0; ei < vtblStruct->getNumOperands(); ++ei)</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  {</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a> *vtbl =</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a>>(vtblStruct->getOperand(ei));</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  assert(vtbl && <span class="stringliteral">"Element of initializer not an array?"</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"> 386</span>  <span class="comment">/*</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span> <span class="comment"> * items in vtables can be classified into 3 categories:</span></div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span> <span class="comment"> * 1. i8* null</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span> <span class="comment"> * 2. i8* inttoptr xxx</span></div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span> <span class="comment"> * 3. i8* bitcast xxx</span></div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span> <span class="comment"> */</span></div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="keywordtype">bool</span> pure_abstract = <span class="keyword">true</span>;</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0;</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="keywordflow">while</span> (i < vtbl->getNumOperands())</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  {</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <a class="code" href="classSVF_1_1CHNode.html#aa4af6538c9994ec54a7b82691f846a31">CHNode::FuncVector</a> virtualFunctions;</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="keywordtype">bool</span> is_virtual = <span class="keyword">false</span>; <span class="comment">// virtual inheritance</span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="keywordtype">int</span> null_ptr_num = 0;</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="keywordflow">for</span> (; i < vtbl->getNumOperands(); ++i)</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  {</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="keywordflow">if</span> (SVFUtil::isa<ConstantPointerNull>(vtbl->getOperand(i)))</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>  <span class="keywordflow">if</span> (i > 0 && !SVFUtil::isa<ConstantPointerNull>(vtbl->getOperand(i-1)))</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  {</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *ce =</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a>>(vtbl->getOperand(i-1));</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  <span class="keywordflow">if</span> (ce->getOpcode() == Instruction::BitCast)</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="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* bitcastValue = ce->getOperand(0);</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="keywordtype">string</span> bitcastValueName = bitcastValue->getName().str();</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <span class="keywordflow">if</span> (bitcastValueName.compare(0, <a class="code" href="CHGBuilder_8cpp.html#a4ecb39b2fb5510fb20341373b7ad5450">ztiLabel</a>.size(), <a class="code" href="CHGBuilder_8cpp.html#a4ecb39b2fb5510fb20341373b7ad5450">ztiLabel</a>) == 0)</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  {</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  is_virtual = <span class="keyword">true</span>;</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  null_ptr_num = 1;</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  <span class="keywordflow">while</span> (i+null_ptr_num < vtbl->getNumOperands())</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  {</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="keywordflow">if</span> (SVFUtil::isa<ConstantPointerNull>(vtbl->getOperand(i+null_ptr_num)))</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  null_ptr_num++;</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  }</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  }</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  }</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  }</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  }</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *ce =</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a>>(vtbl->getOperand(i));</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  assert(ce != <span class="keyword">nullptr</span> && <span class="stringliteral">"item in vtable not constantexp or null"</span>);</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> opcode = ce->getOpcode();</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  assert(opcode == Instruction::IntToPtr ||</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  opcode == Instruction::BitCast);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  assert(ce->getNumOperands() == 1 &&</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="stringliteral">"inttptr or bitcast operand num not 1"</span>);</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="keywordflow">if</span> (opcode == Instruction::IntToPtr)</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  {</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  node->setMultiInheritance();</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  ++i;</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  }</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  <span class="keywordflow">if</span> (opcode == Instruction::BitCast)</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  {</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* bitcastValue = ce->getOperand(0);</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <span class="keywordtype">string</span> bitcastValueName = bitcastValue->getName().str();</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  <span class="comment">/*</span></div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span> <span class="comment"> * value in bitcast:</span></div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span> <span class="comment"> * _ZTIXXX</span></div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span> <span class="comment"> * Function</span></div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span> <span class="comment"> * GlobalAlias (alias to other function)</span></div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span> <span class="comment"> */</span></div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  assert(SVFUtil::isa<Function>(bitcastValue) ||</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  SVFUtil::isa<GlobalValue>(bitcastValue));</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* f = SVFUtil::dyn_cast<Function>(bitcastValue))</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  {</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  addFuncToFuncVector(virtualFunctions, f);</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="keywordflow">if</span> (f->getName().str().compare(<a class="code" href="CHGBuilder_8cpp.html#a5b49460faf973332d3cbfc561c994c6c">pureVirtualFunName</a>) == 0)</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  {</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  pure_abstract &= <span class="keyword">true</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>  <span class="keywordflow">else</span></div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  {</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  pure_abstract &= <span class="keyword">false</span>;</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  }</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(f->getName().str());</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keywordflow">if</span> (dname.className.size() > 0 &&</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  vtblClassName.compare(dname.className) != 0)</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  {</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  chg->addEdge(vtblClassName, dname.className, <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">CHEdge::INHERITANCE</a>);</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  }</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  }</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  {</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a0fd33072b099f61eaa642e94ed0c03fc">GlobalAlias</a> *alias =</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  SVFUtil::dyn_cast<GlobalAlias>(bitcastValue))</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  {</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7e230c0cba2e3a7c2e5a5f2ee7d88af9">Constant</a> *aliasValue = alias->getAliasee();</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* aliasFunc =</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  SVFUtil::dyn_cast<Function>(aliasValue))</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>  addFuncToFuncVector(virtualFunctions, aliasFunc);</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  }</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *aliasconst =</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  SVFUtil::dyn_cast<ConstantExpr>(aliasValue))</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  {</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  (void)aliasconst; <span class="comment">// Suppress warning of unused variable under release build</span></div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  assert(aliasconst->getOpcode() == Instruction::BitCast &&</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="stringliteral">"aliased constantexpr in vtable not a bitcast"</span>);</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>* aliasbitcastfunc =</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>>(aliasconst->getOperand(0));</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  assert(aliasbitcastfunc &&</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <span class="stringliteral">"aliased bitcast in vtable not a function"</span>);</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  addFuncToFuncVector(virtualFunctions, aliasbitcastfunc);</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  }</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="keywordflow">else</span></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>  assert(<span class="keyword">false</span> && <span class="stringliteral">"alias not function or bitcast"</span>);</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> </div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  pure_abstract &= <span class="keyword">false</span>;</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  }</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (bitcastValueName.compare(0, <a class="code" href="CHGBuilder_8cpp.html#a4ecb39b2fb5510fb20341373b7ad5450">ztiLabel</a>.size(),</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  <a class="code" href="CHGBuilder_8cpp.html#a4ecb39b2fb5510fb20341373b7ad5450">ztiLabel</a>) == 0)</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>  <span class="keywordflow">else</span></div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  {</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  assert(<span class="stringliteral">"what else can be in bitcast of a vtable?"</span>);</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  }</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  }</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  }</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  }</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <span class="keywordflow">if</span> (is_virtual && virtualFunctions.size() > 0)</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  {</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < null_ptr_num; ++i)</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="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* fun = virtualFunctions[i];</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  virtualFunctions.insert(virtualFunctions.begin(), fun);</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>  }</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keywordflow">if</span> (virtualFunctions.size() > 0)</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  node->addVirtualFunctionVector(virtualFunctions);</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  }</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keywordflow">if</span> (pure_abstract == <span class="keyword">true</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>  node->setPureAbstract();</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  }</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  }</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  }</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  }</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span> }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> </div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span> </div><div class="line"><a name="l00533"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#aa677ac2c640ee7fc0dab1d4fe508ead8"> 533</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#aa677ac2c640ee7fc0dab1d4fe508ead8">CHGBuilder::buildVirtualFunctionToIDMap</a>()</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span> {</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="comment">/*</span></div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span> <span class="comment"> * 1. Divide classes into groups</span></div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> <span class="comment"> * 2. Get all virtual functions in a group</span></div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span> <span class="comment"> * 3. Assign consecutive IDs to virtual functions that have</span></div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span> <span class="comment"> * the same name (after demangling) in a group</span></div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span> <span class="comment"> */</span></div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <a class="code" href="classSVF_1_1CHGraph.html#ad0f60c720b277c60ed8a8966189bb42b">CHGraph::CHNodeSetTy</a> visitedNodes;</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">CHGraph::const_iterator</a> nit = chg->begin(),</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  neit = chg->end(); nit != neit; ++nit)</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  {</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *node = nit->second;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="keywordflow">if</span> (visitedNodes.find(node) != visitedNodes.end())</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="keywordflow">continue</span>;</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>  <span class="keywordtype">string</span> className = node-><a class="code" href="classSVF_1_1CHNode.html#af6e71c1a932464b1b615fc177f5af089">getName</a>();</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span> </div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="comment">/*</span></div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span> <span class="comment"> * get all the classes in a specific group</span></div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span> <span class="comment"> */</span></div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <a class="code" href="classSVF_1_1CHGraph.html#ad0f60c720b277c60ed8a8966189bb42b">CHGraph::CHNodeSetTy</a> group;</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  stack<const CHNode*> nodeStack;</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  nodeStack.push(node);</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="keywordflow">while</span> (!nodeStack.empty())</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="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *curnode = nodeStack.top();</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  nodeStack.pop();</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  group.insert(curnode);</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keywordflow">if</span> (visitedNodes.find(curnode) != visitedNodes.end())</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="keywordflow">for</span> (CHEdge::CHEdgeSetTy::const_iterator it = curnode-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>().begin(),</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  eit = curnode-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>().end(); it != eit; ++it)</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>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *tmpnode = (*it)->getDstNode();</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  nodeStack.push(tmpnode);</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  group.insert(tmpnode);</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  }</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="keywordflow">for</span> (CHEdge::CHEdgeSetTy::const_iterator it = curnode-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().begin(),</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  eit = curnode-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().end(); it != eit; ++it)</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>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *tmpnode = (*it)->getSrcNode();</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  nodeStack.push(tmpnode);</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  group.insert(tmpnode);</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  }</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  visitedNodes.insert(curnode);</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  }</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span> </div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  <span class="comment">/*</span></div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span> <span class="comment"> * get all virtual functions in a specific group</span></div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span> <span class="comment"> */</span></div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  set<const SVFFunction*> virtualFunctions;</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <span class="keywordflow">for</span> (CHGraph::CHNodeSetTy::iterator it = group.begin(),</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  eit = group.end(); it != eit; ++it)</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>  <span class="keyword">const</span> vector<CHNode::FuncVector> &vecs = (*it)-><a class="code" href="classSVF_1_1CHNode.html#a5df1cf4d51bf3406d188c96bc9aae0af">getVirtualFunctionVectors</a>();</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="keywordflow">for</span> (vector<CHNode::FuncVector>::const_iterator vit = vecs.begin(),</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  veit = vecs.end(); vit != veit; ++vit)</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  {</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keywordflow">for</span> (vector<const SVFFunction*>::const_iterator fit = (*vit).begin(),</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  feit = (*vit).end(); fit != feit; ++fit)</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  {</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  virtualFunctions.insert(*fit);</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  }</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  }</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  }</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span> </div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <span class="comment">/*</span></div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span> <span class="comment"> * build a set of pairs of demangled function name and function in a</span></div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span> <span class="comment"> * specific group, items in the set will be sort by the first item of the</span></div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span> <span class="comment"> * pair, so all the virtual functions in a group will be sorted by the</span></div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span> <span class="comment"> * demangled function name</span></div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span> <span class="comment"> * <f, A::f></span></div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span> <span class="comment"> * <f, B::f></span></div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span> <span class="comment"> * <g, A::g></span></div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span> <span class="comment"> * <g, B::g></span></div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span> <span class="comment"> * <g, C::g></span></div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span> <span class="comment"> * <~A, A::~A></span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span> <span class="comment"> * <~B, B::~B></span></div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> <span class="comment"> * <~C, C::~C></span></div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> <span class="comment"> * ...</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> <span class="comment"> */</span></div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  set<pair<string, const SVFFunction*> > fNameSet;</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <span class="keywordflow">for</span> (set<const SVFFunction*>::iterator fit = virtualFunctions.begin(),</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  feit = virtualFunctions.end(); fit != feit; ++fit)</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  {</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* f = *fit;</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(f-><a class="code" href="classSVF_1_1SVFValue.html#a68b40576b24c4cb81cc3ba75550f4654">getName</a>());</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  fNameSet.insert(pair<string, const SVFFunction*>(dname.funcName, f));</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  }</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <span class="keywordflow">for</span> (<span class="keyword">set</span><pair<string, const SVFFunction*>>::iterator it = fNameSet.begin(),</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  eit = fNameSet.end(); it != eit; ++it)</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  {</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  chg->virtualFunctionToIDMap[it->second] = chg->vfID++;</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  }</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  }</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span> }</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span> </div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span> </div><div class="line"><a name="l00632"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#abab6d95945a43fbe4c73ac12550f5d8c"> 632</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#abab6d95945a43fbe4c73ac12550f5d8c">CHGBuilder::buildCSToCHAVtblsAndVfnsMap</a>()</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span> {</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span> </div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getLLVMModules())</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  {</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  <span class="keywordflow">for</span> (Module::const_iterator F = M.begin(), E = M.end(); F != E; ++F)</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  {</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a032e8478a7b6a8bb0b7755c98a7bce91">const_inst_iterator</a> II = inst_begin(*F), E = inst_end(*F); II != E; ++II)</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  {</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* callInst = SVFUtil::dyn_cast<CallBase>(&*II))</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  {</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#aab1dce633f9a03796c208b6fba2bd2b4">cppUtil::isVirtualCallSite</a>(callInst) == <span class="keyword">false</span>)</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span> </div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  <a class="code" href="namespaceSVF.html#a340a9e77adc2bbfdee79e22da9ead234">VTableSet</a> vtbls;</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHGBuilder.html#adbff217477a779de9024d9a5777413a7">CHNodeSetTy</a>& chClasses = getCSClasses(callInst);</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keywordflow">for</span> (CHNodeSetTy::const_iterator it = chClasses.begin(), eit = chClasses.end(); it != eit; ++it)</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  {</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *<a class="code" href="cJSON_8cpp.html#ad00efb41ca386db28bacc7aefe79535c">child</a> = *it;</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a> *vtbl = child-><a class="code" href="classSVF_1_1CHNode.html#aa49ae91e2dd45c94f3d7694eb7e6737b">getVTable</a>();</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <span class="keywordflow">if</span> (vtbl != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  {</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  vtbls.insert(vtbl);</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  }</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">if</span> (vtbls.size() > 0)</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  {</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a9815a5b31ac7dc21239d08e5b9f61106">SVFUtil::getSVFCallSite</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFInstruction(callInst));</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  chg->csToCHAVtblsMap[cs] = vtbls;</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  <a class="code" href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">VFunSet</a> virtualFunctions;</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  chg->getVFnsFromVtbls(cs, vtbls, virtualFunctions);</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="keywordflow">if</span> (virtualFunctions.size() > 0)</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  chg->csToCHAVFnsMap[cs] = virtualFunctions;</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  }</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  }</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  }</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  }</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> }</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span> </div><div class="line"><a name="l00672"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#adc1b1f45e7000fa57e3a70ef9e4af853"> 672</a></span> <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHGraph.html#ad0f60c720b277c60ed8a8966189bb42b">CHGraph::CHNodeSetTy</a>& <a class="code" href="classSVF_1_1CHGBuilder.html#adc1b1f45e7000fa57e3a70ef9e4af853">CHGBuilder::getCSClasses</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* cs)</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>  assert(<a class="code" href="namespaceSVF_1_1cppUtil.html#aab1dce633f9a03796c208b6fba2bd2b4">isVirtualCallSite</a>(cs) && <span class="stringliteral">"not virtual callsite!"</span>);</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* svfcall = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-><a class="code" href="classSVF_1_1LLVMModuleSet.html#ae74f307b6f96950ceedb2c375ef1c3a3">getSVFInstruction</a>(cs);</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span> </div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  CHGraph::CallSiteToCHNodesMap::const_iterator it = chg->csToClassesMap.find(svfcall);</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="keywordflow">if</span> (it != chg->csToClassesMap.end())</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  {</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keywordflow">return</span> it->second;</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  }</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  {</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  <span class="keywordtype">string</span> thisPtrClassName = <a class="code" href="namespaceSVF_1_1cppUtil.html#a28d7f3931a05ebaf0a01ca4b263989b3">getClassNameOfThisPtr</a>(cs);</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a>* thisNode = chg->getNode(thisPtrClassName))</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="keyword">const</span> <a class="code" href="classSVF_1_1CHGraph.html#ad0f60c720b277c60ed8a8966189bb42b">CHGraph::CHNodeSetTy</a>& instAndDesces = getInstancesAndDescendants(thisPtrClassName);</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  chg->csToClassesMap[svfcall].insert(thisNode);</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <span class="keywordflow">for</span> (CHGraph::CHNodeSetTy::const_iterator it = instAndDesces.begin(), eit = instAndDesces.end(); it != eit; ++it)</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  chg->csToClassesMap[svfcall].insert(*it);</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  }</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <span class="keywordflow">return</span> chg->csToClassesMap[svfcall];</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="l00696"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a87170f2cf98c6094491b8fbafdebec14"> 696</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a87170f2cf98c6094491b8fbafdebec14">CHGBuilder::addFuncToFuncVector</a>(<a class="code" href="classSVF_1_1CHNode.html#aa4af6538c9994ec54a7b82691f846a31">CHNode::FuncVector</a> &v, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *lf)</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span> {</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#a917c4bd2d5fd1354b5069bf0a68533d9">isCPPThunkFunction</a>(lf))</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  {</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <span class="keyword">auto</span> *tf = <a class="code" href="namespaceSVF_1_1cppUtil.html#ac9c6d4315e7a1a826add7ed9cf924553">getThunkTarget</a>(lf))</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  v.push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFFunction(tf));</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  }</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  {</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  v.push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFFunction(lf));</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="ttc" id="classSVF_1_1CHGBuilder_html_a8e915f257224b1d8e40d0e4c9b5e1df0"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#a8e915f257224b1d8e40d0e4c9b5e1df0">SVF::CHGBuilder::createNode</a></div><div class="ttdeci">CHNode * createNode(const std::string name)</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00236">CHGBuilder.cpp:236</a></div></div>
|
|
69
|
+
<a href="CHGBuilder_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">//===----- CHGBuiler.cpp -- Class hierarchy graph builder ---------------------------//</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-> <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"> * CHGBuiler.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: Jun 4, 2021</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * Author: Yulei Sui</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> */</span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include <set></span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include <vector></span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include <map></span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include <fstream></span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include <iostream></span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="preprocessor">#include <iomanip></span> <span class="comment">// setw() for formatting cout</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="preprocessor">#include <assert.h></span></div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="preprocessor">#include <stack></span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="preprocessor">#include "<a class="code" href="CHGBuilder_8h.html">SVF-LLVM/CHGBuilder.h</a>"</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <span class="preprocessor">#include "<a class="code" href="CPPUtil_8h.html">SVF-LLVM/CPPUtil.h</a>"</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="preprocessor">#include "<a class="code" href="SymbolTableInfo_8h.html">SVFIR/SymbolTableInfo.h</a>"</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="preprocessor">#include "<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>"</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="preprocessor">#include "<a class="code" href="LLVMUtil_8h.html">SVF-LLVM/LLVMUtil.h</a>"</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="preprocessor">#include "<a class="code" href="SVFModule_8h.html">SVFIR/SVFModule.h</a>"</span></div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> <span class="preprocessor">#include "<a class="code" href="PTAStat_8h.html">Util/PTAStat.h</a>"</span></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> </div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVFUtil.html">SVFUtil</a>;</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> <span class="keyword">using namespace </span><a class="code" href="namespacecppUtil.html">cppUtil</a>;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> <span class="keyword">using namespace </span><a class="code" href="namespaceLLVMUtil.html">LLVMUtil</a>;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> <span class="keyword">using namespace </span><a class="code" href="namespacestd.html">std</a>;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="CHGBuilder_8cpp.html#a5b49460faf973332d3cbfc561c994c6c"> 54</a></span> <span class="keyword">const</span> <span class="keywordtype">string</span> <a class="code" href="CHGBuilder_8cpp.html#a5b49460faf973332d3cbfc561c994c6c">pureVirtualFunName</a> = <span class="stringliteral">"__cxa_pure_virtual"</span>;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> </div><div class="line"><a name="l00056"></a><span class="lineno"><a class="line" href="CHGBuilder_8cpp.html#a4ecb39b2fb5510fb20341373b7ad5450"> 56</a></span> <span class="keyword">const</span> <span class="keywordtype">string</span> <a class="code" href="CHGBuilder_8cpp.html#a4ecb39b2fb5510fb20341373b7ad5450">ztiLabel</a> = <span class="stringliteral">"_ZTI"</span>;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> </div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> </div><div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#aa5c672ac426ad4085d64d97f8cb14ace"> 59</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#aa5c672ac426ad4085d64d97f8cb14ace">CHGBuilder::buildCHG</a>()</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> {</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> </div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <span class="keywordtype">double</span> timeStart, timeEnd;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  timeStart = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</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>()->getLLVMModules())</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  {</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</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">outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"construct CHGraph From module "</span></div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  + M.getName().str() + <span class="stringliteral">"...\n"</span>));</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  readInheritanceMetadataFromModule(M);</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="keywordflow">for</span> (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I)</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  buildCHGNodes(&(*I));</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <span class="keywordflow">for</span> (Module::const_iterator F = M.begin(), E = M.end(); F != E; ++F)</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  buildCHGNodes(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a3d34fcdfc98add848a34fd5259c11eb2">LLVMUtil::getDefFunForMultipleModule</a>(&(*F)));</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="keywordflow">for</span> (Module::const_iterator F = M.begin(), E = M.end(); F != E; ++F)</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  buildCHGEdges(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a3d34fcdfc98add848a34fd5259c11eb2">LLVMUtil::getDefFunForMultipleModule</a>(&(*F)));</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>  analyzeVTables(M);</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"> 79</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">outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"build Internal Maps ...\n"</span>));</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  buildInternalMaps();</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>  timeEnd = <a class="code" href="classSVF_1_1SVFStat.html#ac9d390c417df6f6af6b274618b87010d">PTAStat::getClk</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  chg->buildingCHGTime = (timeEnd - timeStart) / <a class="code" href="SVFType_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span> </div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#ab13a47f6dd4eedfaa607d36448a1d456">Options::DumpCHA</a>)</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  chg->dump(<span class="stringliteral">"cha"</span>);</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> }</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div><div class="line"><a name="l00089"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a648e97899c16a5634fc8369aef8a031f"> 89</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a648e97899c16a5634fc8369aef8a031f">CHGBuilder::buildCHGNodes</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a> *globalvalue)</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> {</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#aeef0f5c6486379043a7d47b0635f2667">isValVtbl</a>(globalvalue) && globalvalue->getNumOperands() > 0)</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  {</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a> *vtblStruct = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a>>(globalvalue->getOperand(0));</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  assert(vtblStruct && <span class="stringliteral">"Initializer of a vtable not a struct?"</span>);</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keywordtype">string</span> className = <a class="code" href="namespaceSVF_1_1cppUtil.html#a9e66b5eaf8b24917d0d3e2e98461f15c">getClassNameFromVtblObj</a>(globalvalue->getName().str());</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keywordflow">if</span> (!chg->getNode(className))</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  createNode(className);</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> </div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ei = 0; ei < vtblStruct->getNumOperands(); ++ei)</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="keyword">const</span> <a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a> *vtbl = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a>>(vtblStruct->getOperand(ei));</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  assert(vtbl && <span class="stringliteral">"Element of initializer not an array?"</span>);</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i < vtbl->getNumOperands(); ++i)</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>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *ce = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#af983b0e1fbd371d8672e8f03f63084fc">isCastConstantExpr</a>(vtbl->getOperand(i)))</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="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* bitcastValue = ce->getOperand(0);</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* func = SVFUtil::dyn_cast<Function>(bitcastValue))</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  {</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(func->getName().str());</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="keywordflow">if</span> (!chg->getNode(dname.className))</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  createNode(dname.className);</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>  }</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  }</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  }</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  }</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> </div><div class="line"><a name="l00120"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#abca5a0a010fdb63a3fa8b92ea0dd55e6"> 120</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a648e97899c16a5634fc8369aef8a031f">CHGBuilder::buildCHGNodes</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* F)</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> {</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#ad6f9578cdce518141772a11617160da8">isConstructor</a>(F) || <a class="code" href="namespaceSVF_1_1cppUtil.html#af19bec54621f4605bac4feaf9f73803c">isDestructor</a>(F))</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  {</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(F->getName().str());</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a263149d980e5c3165dfe8750bfac3223">DCHA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\t build CHANode for class "</span> + dname.className + <span class="stringliteral">"...\n"</span>);</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keywordflow">if</span> (!chg->getNode(dname.className))</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  createNode(dname.className);</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  }</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> }</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> </div><div class="line"><a name="l00131"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a87ad835786fb8fed2a24c122fa839c25"> 131</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a87ad835786fb8fed2a24c122fa839c25">CHGBuilder::buildCHGEdges</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* F)</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span> {</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#ad6f9578cdce518141772a11617160da8">isConstructor</a>(F) || <a class="code" href="namespaceSVF_1_1cppUtil.html#af19bec54621f4605bac4feaf9f73803c">isDestructor</a>(F))</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  {</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keywordflow">for</span> (Function::const_iterator B = F->begin(), E = F->end(); B != E; ++B)</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">for</span> (BasicBlock::const_iterator I = B->begin(), E = B->end(); I != E; ++I)</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  {</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a5a7dc8680a9714e08b01dd339b85bb20">LLVMUtil::isCallSite</a>(&(*I)))</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  {</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  connectInheritEdgeViaCall(F, SVFUtil::cast<CallBase>(&(*I)));</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">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab696aab940eb187dc81217efe8649af5">StoreInst</a> *store = SVFUtil::dyn_cast<StoreInst>(&(*I)))</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  {</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  connectInheritEdgeViaStore(F, store);</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  }</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  }</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"> 150</span> }</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> </div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> </div><div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#ad9f1c51ba6dc279f22aa671f29257a50"> 153</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#ad9f1c51ba6dc279f22aa671f29257a50">CHGBuilder::buildInternalMaps</a>()</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> {</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  buildClassNameToAncestorsDescendantsMap();</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  buildVirtualFunctionToIDMap();</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  buildCSToCHAVtblsAndVfnsMap();</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> }</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span> </div><div class="line"><a name="l00160"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#ae6d92d48149334b177e9cb8be411b09d"> 160</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#ae6d92d48149334b177e9cb8be411b09d">CHGBuilder::connectInheritEdgeViaCall</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* caller, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* cs)</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span> {</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">getCallee</a>(cs) == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> </div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">getCallee</a>(cs);</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span> </div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(caller->getName().str());</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="keywordflow">if</span> ((<a class="code" href="namespaceSVF_1_1cppUtil.html#ad6f9578cdce518141772a11617160da8">isConstructor</a>(caller) && <a class="code" href="namespaceSVF_1_1cppUtil.html#ad6f9578cdce518141772a11617160da8">isConstructor</a>(callee)) || (<a class="code" href="namespaceSVF_1_1cppUtil.html#af19bec54621f4605bac4feaf9f73803c">isDestructor</a>(caller) && <a class="code" href="namespaceSVF_1_1cppUtil.html#af19bec54621f4605bac4feaf9f73803c">isDestructor</a>(callee)))</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  {</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <span class="keywordflow">if</span> (cs->arg_size() < 1 || (cs->arg_size() < 2 && cs->paramHasAttr(0, llvm::Attribute::StructRet)))</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* csThisPtr = <a class="code" href="namespaceSVF_1_1cppUtil.html#a643736d0d9aae502784f736f492201b4">getVCallThisPtr</a>(cs);</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="comment">//const Argument* consThisPtr = getConstructorThisPtr(caller);</span></div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="comment">//bool samePtr = isSameThisPtrInConstructor(consThisPtr, csThisPtr);</span></div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keywordtype">bool</span> samePtrTrue = <span class="keyword">true</span>;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <span class="keywordflow">if</span> (csThisPtr != <span class="keyword">nullptr</span> && samePtrTrue)</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  {</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keyword">struct </span>DemangledName basename = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(callee->getName().str());</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="keywordflow">if</span> (!<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a5a7dc8680a9714e08b01dd339b85bb20">LLVMUtil::isCallSite</a>(csThisPtr) &&</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  basename.className.size() > 0)</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  {</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  chg->addEdge(dname.className, basename.className, <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">CHEdge::INHERITANCE</a>);</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>  }</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  }</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> }</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> </div><div class="line"><a name="l00188"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a2898888c29261911388a9295bc969567"> 188</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a2898888c29261911388a9295bc969567">CHGBuilder::connectInheritEdgeViaStore</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* caller, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab696aab940eb187dc81217efe8649af5">StoreInst</a>* storeInst)</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span> {</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(caller->getName().str());</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *ce = SVFUtil::dyn_cast<ConstantExpr>(storeInst->getValueOperand()))</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  {</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordflow">if</span> (ce->getOpcode() == Instruction::BitCast)</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  {</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* bitcastval = ce->getOperand(0);</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *bcce = SVFUtil::dyn_cast<ConstantExpr>(bitcastval))</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>  <span class="keywordflow">if</span> (bcce->getOpcode() == Instruction::GetElementPtr)</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  {</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* gepval = bcce->getOperand(0);</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#aeef0f5c6486379043a7d47b0635f2667">isValVtbl</a>(gepval))</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="keywordtype">string</span> vtblClassName = <a class="code" href="namespaceSVF_1_1cppUtil.html#a9e66b5eaf8b24917d0d3e2e98461f15c">getClassNameFromVtblObj</a>(gepval->getName().str());</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <span class="keywordflow">if</span> (vtblClassName.size() > 0 && dname.className.compare(vtblClassName) != 0)</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  {</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  chg->addEdge(dname.className, vtblClassName, <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">CHEdge::INHERITANCE</a>);</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="l00209"></a><span class="lineno"> 209</span>  }</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  }</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  }</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> }</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span> </div><div class="line"><a name="l00215"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a443b021eb2b08b92164515750385b058"> 215</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a443b021eb2b08b92164515750385b058">CHGBuilder::readInheritanceMetadataFromModule</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M)</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span> {</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordflow">for</span> (Module::const_named_metadata_iterator mdit = M.named_metadata_begin(),</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  mdeit = M.named_metadata_end(); mdit != mdeit; ++mdit)</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>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a3011dbac9102f044ad5f36a4ad3d4a71">NamedMDNode</a> *md = &*mdit;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="keywordtype">string</span> mdname = md->getName().str();</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keywordflow">if</span> (mdname.compare(0, 15, <span class="stringliteral">"__cxx_bases_of_"</span>) != 0)</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordtype">string</span> className = mdname.substr(15);</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="keywordflow">for</span> (NamedMDNode::const_op_iterator opit = md->op_begin(),</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  opeit = md->op_end(); opit != opeit; ++opit)</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#ad3d3cec1813411f039211c86236f7adb">MDNode</a> *N = *opit;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a28eec26ec8edaa5e96aecfeb01f6c0d4">MDString</a>* mdstr = SVFUtil::cast<MDString>(N->getOperand(0).get());</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keywordtype">string</span> baseName = mdstr->getString().str();</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  chg->addEdge(className, baseName, <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">CHEdge::INHERITANCE</a>);</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</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> }</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span> </div><div class="line"><a name="l00236"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a8e915f257224b1d8e40d0e4c9b5e1df0"> 236</a></span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *<a class="code" href="classSVF_1_1CHGBuilder.html#a8e915f257224b1d8e40d0e4c9b5e1df0">CHGBuilder::createNode</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> className)</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>  assert(!chg->getNode(className) && <span class="stringliteral">"this node should never be created before!"</span>);</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> * node = <span class="keyword">new</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a>(className, chg->classNum++);</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  chg->classNameToNodeMap[className] = node;</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  chg->addGNode(node->getId(), node);</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordflow">if</span> (className.size() > 0 && className[className.size() - 1] == <span class="charliteral">'>'</span>)</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="keywordtype">string</span> templateName = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1cf2e4671b16b477cc779c72f2419234">getBeforeBrackets</a>(className);</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a>* templateNode = chg->getNode(templateName);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">if</span> (!templateNode)</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>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a263149d980e5c3165dfe8750bfac3223">DCHA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\t Create Template CHANode "</span> + templateName + <span class="stringliteral">" for class "</span> + className + <span class="stringliteral">"...\n"</span>);</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  templateNode = createNode(templateName);</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  templateNode-><a class="code" href="classSVF_1_1CHNode.html#a00343177422c8d84d707432d0c483438">setTemplate</a>();</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  }</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  chg->addEdge(className, templateName, <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a8721eaefd547d6ba5229463d644815f4">CHEdge::INSTANTCE</a>);</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  chg->addInstances(templateName,node);</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  }</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  <span class="keywordflow">return</span> node;</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span> }</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span> </div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span> <span class="comment">/*</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> <span class="comment"> * build the following two maps:</span></div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span> <span class="comment"> * classNameToDescendantsMap</span></div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span> <span class="comment"> * chg->classNameToAncestorsMap</span></div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> <span class="comment"> */</span></div><div class="line"><a name="l00263"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#ae7832c277f0ff86f3ae750aac6063adb"> 263</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#ae7832c277f0ff86f3ae750aac6063adb">CHGBuilder::buildClassNameToAncestorsDescendantsMap</a>()</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span> {</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> </div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">CHGraph::const_iterator</a> it = chg->begin(), eit = chg->end();</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  it != eit; ++it)</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  {</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *node = it->second;</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <a class="code" href="classSVF_1_1FIFOWorkList.html">WorkList</a> worklist;</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <a class="code" href="classSVF_1_1CHGBuilder.html#adbff217477a779de9024d9a5777413a7">CHNodeSetTy</a> visitedNodes;</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a0df409a67428e528321869d201f2a474">push</a>(node);</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordflow">while</span> (!worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">empty</a>())</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  {</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *curnode = worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">pop</a>();</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keywordflow">if</span> (visitedNodes.find(curnode) == visitedNodes.end())</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  {</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">for</span> (CHEdge::CHEdgeSetTy::const_iterator it =</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  curnode-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>().begin(), eit =</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  curnode-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>().end(); it != eit; ++it)</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>  <span class="keywordflow">if</span> ((*it)->getEdgeType() == <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">CHEdge::INHERITANCE</a>)</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  {</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *succnode = (*it)->getDstNode();</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  chg->classNameToAncestorsMap[node-><a class="code" href="classSVF_1_1CHNode.html#af6e71c1a932464b1b615fc177f5af089">getName</a>()].insert(succnode);</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  chg->classNameToDescendantsMap[succnode-><a class="code" href="classSVF_1_1CHNode.html#af6e71c1a932464b1b615fc177f5af089">getName</a>()].insert(node);</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a0df409a67428e528321869d201f2a474">push</a>(succnode);</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  }</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  }</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  visitedNodes.insert(curnode);</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  }</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  }</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  }</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span> }</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> </div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> </div><div class="line"><a name="l00297"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a444dba7f18bee07a6cad51f88bb63e30"> 297</a></span> <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHGraph.html#ad0f60c720b277c60ed8a8966189bb42b">CHGraph::CHNodeSetTy</a>& <a class="code" href="classSVF_1_1CHGBuilder.html#a444dba7f18bee07a6cad51f88bb63e30">CHGBuilder::getInstancesAndDescendants</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> className)</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span> {</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span> </div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  CHGraph::NameToCHNodesMap::const_iterator it = chg->classNameToInstAndDescsMap.find(className);</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <span class="keywordflow">if</span> (it != chg->classNameToInstAndDescsMap.end())</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>  <span class="keywordflow">return</span> it->second;</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>  <span class="keywordflow">else</span></div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  {</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  chg->classNameToInstAndDescsMap[className] = chg->getDescendants(className);</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keywordflow">if</span> (chg->getNode(className)->isTemplate())</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="keyword">const</span> <a class="code" href="classSVF_1_1CHGBuilder.html#adbff217477a779de9024d9a5777413a7">CHNodeSetTy</a>& instances = chg->getInstances(className);</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <span class="keywordflow">for</span> (CHNodeSetTy::const_iterator it = instances.begin(), eit = instances.end(); it != eit; ++it)</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  {</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *node = *it;</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  chg->classNameToInstAndDescsMap[className].insert(node);</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHGBuilder.html#adbff217477a779de9024d9a5777413a7">CHNodeSetTy</a>& instance_descendants = chg->getDescendants(node-><a class="code" href="classSVF_1_1CHNode.html#af6e71c1a932464b1b615fc177f5af089">getName</a>());</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keywordflow">for</span> (CHNodeSetTy::const_iterator dit =</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  instance_descendants.begin(), deit =</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  instance_descendants.end(); dit != deit; ++dit)</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  {</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  chg->classNameToInstAndDescsMap[className].insert(*dit);</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  }</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  }</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  }</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <span class="keywordflow">return</span> chg->classNameToInstAndDescsMap[className];</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  }</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span> }</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span> </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="comment">/*</span></div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> <span class="comment"> * do the following things:</span></div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span> <span class="comment"> * 1. initialize virtualFunctions for each class</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span> <span class="comment"> * 2. mark multi-inheritance classes</span></div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span> <span class="comment"> * 3. mark pure abstract classes</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span> <span class="comment"> *</span></div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span> <span class="comment"> * Layout of VTables:</span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span> <span class="comment"> *</span></div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span> <span class="comment"> * 1. single inheritance</span></div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span> <span class="comment"> * class A {...};</span></div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span> <span class="comment"> * class B: public A {...};</span></div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span> <span class="comment"> * B's vtable: {i8 *null, _ZTI1B, ...}</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span> <span class="comment"> *</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span> <span class="comment"> * 2. normal multiple inheritance</span></div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span> <span class="comment"> * class A {...};</span></div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span> <span class="comment"> * class B {...};</span></div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span> <span class="comment"> * class C: public A, public B {...};</span></div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span> <span class="comment"> * C's vtable: {i8 *null, _ZTI1C, ..., inttoptr xxx, _ZTI1C, ...}</span></div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span> <span class="comment"> * "inttoptr xxx" servers as a delimiter for dividing virtual methods inherited</span></div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span> <span class="comment"> * from "class A" and "class B"</span></div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span> <span class="comment"> *</span></div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span> <span class="comment"> * 3. virtual diamond inheritance</span></div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span> <span class="comment"> * class A {...};</span></div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span> <span class="comment"> * class B: public virtual A {...};</span></div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span> <span class="comment"> * class C: public virtual A {...};</span></div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span> <span class="comment"> * class D: public B, public C {...};</span></div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span> <span class="comment"> * D's vtable: {i8 *null, _ZTI1C, ..., inttoptr xxx, _ZTI1C, i8 *null, ...}</span></div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> <span class="comment"> * there will several "i8 *null" following "inttoptr xxx, _ZTI1C,", and the</span></div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> <span class="comment"> * number of "i8 *null" is the same as the number of virtual methods in</span></div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span> <span class="comment"> * "class A"</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> <span class="comment"> */</span></div><div class="line"><a name="l00362"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a2828eb6b2bd86d6f279967c34da8e7e4"> 362</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a2828eb6b2bd86d6f279967c34da8e7e4">CHGBuilder::analyzeVTables</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M)</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> {</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <span class="keywordflow">for</span> (Module::const_global_iterator I = M.global_begin(),</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  E = M.global_end(); I != E; ++I)</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  {</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a> *globalvalue = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a>>(&(*I));</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#aeef0f5c6486379043a7d47b0635f2667">isValVtbl</a>(globalvalue) && globalvalue->getNumOperands() > 0)</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>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a> *vtblStruct =</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a>>(globalvalue->getOperand(0));</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  assert(vtblStruct && <span class="stringliteral">"Initializer of a vtable not a struct?"</span>);</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> </div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <span class="keywordtype">string</span> vtblClassName = <a class="code" href="namespaceSVF_1_1cppUtil.html#a9e66b5eaf8b24917d0d3e2e98461f15c">getClassNameFromVtblObj</a>(globalvalue->getName().str());</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *node = chg->getNode(vtblClassName);</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  assert(node && <span class="stringliteral">"node not found?"</span>);</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>  node->setVTable(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFGlobalValue(globalvalue));</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span> </div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ei = 0; ei < vtblStruct->getNumOperands(); ++ei)</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  {</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a> *vtbl =</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a>>(vtblStruct->getOperand(ei));</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  assert(vtbl && <span class="stringliteral">"Element of initializer not an array?"</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"> 386</span>  <span class="comment">/*</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span> <span class="comment"> * items in vtables can be classified into 3 categories:</span></div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span> <span class="comment"> * 1. i8* null</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span> <span class="comment"> * 2. i8* inttoptr xxx</span></div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span> <span class="comment"> * 3. i8* bitcast xxx</span></div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span> <span class="comment"> */</span></div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="keywordtype">bool</span> pure_abstract = <span class="keyword">true</span>;</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0;</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="keywordflow">while</span> (i < vtbl->getNumOperands())</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  {</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <a class="code" href="classSVF_1_1CHNode.html#aa4af6538c9994ec54a7b82691f846a31">CHNode::FuncVector</a> virtualFunctions;</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="keywordtype">bool</span> is_virtual = <span class="keyword">false</span>; <span class="comment">// virtual inheritance</span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="keywordtype">int</span> null_ptr_num = 0;</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="keywordflow">for</span> (; i < vtbl->getNumOperands(); ++i)</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  {</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="keywordflow">if</span> (SVFUtil::isa<ConstantPointerNull>(vtbl->getOperand(i)))</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>  <span class="keywordflow">if</span> (i > 0 && !SVFUtil::isa<ConstantPointerNull>(vtbl->getOperand(i-1)))</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  {</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *ce =</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a>>(vtbl->getOperand(i-1));</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  <span class="keywordflow">if</span> (ce->getOpcode() == Instruction::BitCast)</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="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* bitcastValue = ce->getOperand(0);</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="keywordtype">string</span> bitcastValueName = bitcastValue->getName().str();</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <span class="keywordflow">if</span> (bitcastValueName.compare(0, <a class="code" href="CHGBuilder_8cpp.html#a4ecb39b2fb5510fb20341373b7ad5450">ztiLabel</a>.size(), <a class="code" href="CHGBuilder_8cpp.html#a4ecb39b2fb5510fb20341373b7ad5450">ztiLabel</a>) == 0)</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  {</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  is_virtual = <span class="keyword">true</span>;</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  null_ptr_num = 1;</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  <span class="keywordflow">while</span> (i+null_ptr_num < vtbl->getNumOperands())</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  {</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="keywordflow">if</span> (SVFUtil::isa<ConstantPointerNull>(vtbl->getOperand(i+null_ptr_num)))</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  null_ptr_num++;</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  }</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  }</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  }</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  }</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  }</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *ce =</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a>>(vtbl->getOperand(i));</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  assert(ce != <span class="keyword">nullptr</span> && <span class="stringliteral">"item in vtable not constantexp or null"</span>);</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> opcode = ce->getOpcode();</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  assert(opcode == Instruction::IntToPtr ||</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  opcode == Instruction::BitCast);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  assert(ce->getNumOperands() == 1 &&</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="stringliteral">"inttptr or bitcast operand num not 1"</span>);</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="keywordflow">if</span> (opcode == Instruction::IntToPtr)</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  {</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  node->setMultiInheritance();</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  ++i;</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  }</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  <span class="keywordflow">if</span> (opcode == Instruction::BitCast)</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  {</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* bitcastValue = ce->getOperand(0);</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <span class="keywordtype">string</span> bitcastValueName = bitcastValue->getName().str();</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  <span class="comment">/*</span></div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span> <span class="comment"> * value in bitcast:</span></div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span> <span class="comment"> * _ZTIXXX</span></div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span> <span class="comment"> * Function</span></div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span> <span class="comment"> * GlobalAlias (alias to other function)</span></div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span> <span class="comment"> */</span></div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  assert(SVFUtil::isa<Function>(bitcastValue) ||</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  SVFUtil::isa<GlobalValue>(bitcastValue));</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* f = SVFUtil::dyn_cast<Function>(bitcastValue))</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  {</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  addFuncToFuncVector(virtualFunctions, f);</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="keywordflow">if</span> (f->getName().str().compare(<a class="code" href="CHGBuilder_8cpp.html#a5b49460faf973332d3cbfc561c994c6c">pureVirtualFunName</a>) == 0)</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  {</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  pure_abstract &= <span class="keyword">true</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>  <span class="keywordflow">else</span></div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  {</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  pure_abstract &= <span class="keyword">false</span>;</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  }</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(f->getName().str());</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keywordflow">if</span> (dname.className.size() > 0 &&</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  vtblClassName.compare(dname.className) != 0)</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  {</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  chg->addEdge(vtblClassName, dname.className, <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">CHEdge::INHERITANCE</a>);</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  }</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  }</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  {</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a0fd33072b099f61eaa642e94ed0c03fc">GlobalAlias</a> *alias =</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  SVFUtil::dyn_cast<GlobalAlias>(bitcastValue))</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  {</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7e230c0cba2e3a7c2e5a5f2ee7d88af9">Constant</a> *aliasValue = alias->getAliasee();</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* aliasFunc =</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  SVFUtil::dyn_cast<Function>(aliasValue))</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>  addFuncToFuncVector(virtualFunctions, aliasFunc);</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  }</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *aliasconst =</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  SVFUtil::dyn_cast<ConstantExpr>(aliasValue))</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  {</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  (void)aliasconst; <span class="comment">// Suppress warning of unused variable under release build</span></div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  assert(aliasconst->getOpcode() == Instruction::BitCast &&</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="stringliteral">"aliased constantexpr in vtable not a bitcast"</span>);</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>* aliasbitcastfunc =</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>>(aliasconst->getOperand(0));</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  assert(aliasbitcastfunc &&</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <span class="stringliteral">"aliased bitcast in vtable not a function"</span>);</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  addFuncToFuncVector(virtualFunctions, aliasbitcastfunc);</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  }</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="keywordflow">else</span></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>  assert(<span class="keyword">false</span> && <span class="stringliteral">"alias not function or bitcast"</span>);</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> </div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  pure_abstract &= <span class="keyword">false</span>;</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  }</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (bitcastValueName.compare(0, <a class="code" href="CHGBuilder_8cpp.html#a4ecb39b2fb5510fb20341373b7ad5450">ztiLabel</a>.size(),</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  <a class="code" href="CHGBuilder_8cpp.html#a4ecb39b2fb5510fb20341373b7ad5450">ztiLabel</a>) == 0)</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>  <span class="keywordflow">else</span></div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  {</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  assert(<span class="stringliteral">"what else can be in bitcast of a vtable?"</span>);</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  }</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  }</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  }</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  }</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <span class="keywordflow">if</span> (is_virtual && virtualFunctions.size() > 0)</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  {</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < null_ptr_num; ++i)</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="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* fun = virtualFunctions[i];</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  virtualFunctions.insert(virtualFunctions.begin(), fun);</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>  }</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keywordflow">if</span> (virtualFunctions.size() > 0)</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  node->addVirtualFunctionVector(virtualFunctions);</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  }</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keywordflow">if</span> (pure_abstract == <span class="keyword">true</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>  node->setPureAbstract();</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  }</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  }</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  }</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  }</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span> }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> </div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span> </div><div class="line"><a name="l00533"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#aa677ac2c640ee7fc0dab1d4fe508ead8"> 533</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#aa677ac2c640ee7fc0dab1d4fe508ead8">CHGBuilder::buildVirtualFunctionToIDMap</a>()</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span> {</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="comment">/*</span></div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span> <span class="comment"> * 1. Divide classes into groups</span></div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> <span class="comment"> * 2. Get all virtual functions in a group</span></div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span> <span class="comment"> * 3. Assign consecutive IDs to virtual functions that have</span></div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span> <span class="comment"> * the same name (after demangling) in a group</span></div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span> <span class="comment"> */</span></div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <a class="code" href="classSVF_1_1CHGraph.html#ad0f60c720b277c60ed8a8966189bb42b">CHGraph::CHNodeSetTy</a> visitedNodes;</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">CHGraph::const_iterator</a> nit = chg->begin(),</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  neit = chg->end(); nit != neit; ++nit)</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  {</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *node = nit->second;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="keywordflow">if</span> (visitedNodes.find(node) != visitedNodes.end())</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="keywordflow">continue</span>;</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>  <span class="keywordtype">string</span> className = node-><a class="code" href="classSVF_1_1CHNode.html#af6e71c1a932464b1b615fc177f5af089">getName</a>();</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span> </div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="comment">/*</span></div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span> <span class="comment"> * get all the classes in a specific group</span></div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span> <span class="comment"> */</span></div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <a class="code" href="classSVF_1_1CHGraph.html#ad0f60c720b277c60ed8a8966189bb42b">CHGraph::CHNodeSetTy</a> group;</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  stack<const CHNode*> nodeStack;</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  nodeStack.push(node);</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="keywordflow">while</span> (!nodeStack.empty())</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="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *curnode = nodeStack.top();</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  nodeStack.pop();</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  group.insert(curnode);</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keywordflow">if</span> (visitedNodes.find(curnode) != visitedNodes.end())</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="keywordflow">for</span> (CHEdge::CHEdgeSetTy::const_iterator it = curnode-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>().begin(),</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  eit = curnode-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>().end(); it != eit; ++it)</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>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *tmpnode = (*it)->getDstNode();</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  nodeStack.push(tmpnode);</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  group.insert(tmpnode);</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  }</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="keywordflow">for</span> (CHEdge::CHEdgeSetTy::const_iterator it = curnode-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().begin(),</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  eit = curnode-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().end(); it != eit; ++it)</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>  <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *tmpnode = (*it)->getSrcNode();</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  nodeStack.push(tmpnode);</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  group.insert(tmpnode);</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  }</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  visitedNodes.insert(curnode);</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  }</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span> </div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  <span class="comment">/*</span></div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span> <span class="comment"> * get all virtual functions in a specific group</span></div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span> <span class="comment"> */</span></div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  set<const SVFFunction*> virtualFunctions;</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <span class="keywordflow">for</span> (CHGraph::CHNodeSetTy::iterator it = group.begin(),</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  eit = group.end(); it != eit; ++it)</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>  <span class="keyword">const</span> vector<CHNode::FuncVector> &vecs = (*it)-><a class="code" href="classSVF_1_1CHNode.html#a5df1cf4d51bf3406d188c96bc9aae0af">getVirtualFunctionVectors</a>();</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="keywordflow">for</span> (vector<CHNode::FuncVector>::const_iterator vit = vecs.begin(),</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  veit = vecs.end(); vit != veit; ++vit)</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  {</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keywordflow">for</span> (vector<const SVFFunction*>::const_iterator fit = (*vit).begin(),</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  feit = (*vit).end(); fit != feit; ++fit)</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  {</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  virtualFunctions.insert(*fit);</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  }</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  }</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  }</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span> </div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <span class="comment">/*</span></div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span> <span class="comment"> * build a set of pairs of demangled function name and function in a</span></div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span> <span class="comment"> * specific group, items in the set will be sort by the first item of the</span></div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span> <span class="comment"> * pair, so all the virtual functions in a group will be sorted by the</span></div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span> <span class="comment"> * demangled function name</span></div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span> <span class="comment"> * <f, A::f></span></div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span> <span class="comment"> * <f, B::f></span></div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span> <span class="comment"> * <g, A::g></span></div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span> <span class="comment"> * <g, B::g></span></div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span> <span class="comment"> * <g, C::g></span></div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span> <span class="comment"> * <~A, A::~A></span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span> <span class="comment"> * <~B, B::~B></span></div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> <span class="comment"> * <~C, C::~C></span></div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> <span class="comment"> * ...</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> <span class="comment"> */</span></div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  set<pair<string, const SVFFunction*> > fNameSet;</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <span class="keywordflow">for</span> (set<const SVFFunction*>::iterator fit = virtualFunctions.begin(),</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  feit = virtualFunctions.end(); fit != feit; ++fit)</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  {</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* f = *fit;</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(f-><a class="code" href="classSVF_1_1SVFValue.html#a68b40576b24c4cb81cc3ba75550f4654">getName</a>());</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  fNameSet.insert(pair<string, const SVFFunction*>(dname.funcName, f));</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  }</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <span class="keywordflow">for</span> (<span class="keyword">set</span><pair<string, const SVFFunction*>>::iterator it = fNameSet.begin(),</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  eit = fNameSet.end(); it != eit; ++it)</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  {</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  chg->virtualFunctionToIDMap[it->second] = chg->vfID++;</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  }</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  }</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span> }</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span> </div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span> </div><div class="line"><a name="l00632"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#abab6d95945a43fbe4c73ac12550f5d8c"> 632</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#abab6d95945a43fbe4c73ac12550f5d8c">CHGBuilder::buildCSToCHAVtblsAndVfnsMap</a>()</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span> {</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span> </div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getLLVMModules())</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  {</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  <span class="keywordflow">for</span> (Module::const_iterator F = M.begin(), E = M.end(); F != E; ++F)</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  {</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a032e8478a7b6a8bb0b7755c98a7bce91">const_inst_iterator</a> II = inst_begin(*F), E = inst_end(*F); II != E; ++II)</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  {</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* callInst = SVFUtil::dyn_cast<CallBase>(&*II))</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  {</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#aab1dce633f9a03796c208b6fba2bd2b4">cppUtil::isVirtualCallSite</a>(callInst) == <span class="keyword">false</span>)</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span> </div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  <a class="code" href="namespaceSVF.html#a340a9e77adc2bbfdee79e22da9ead234">VTableSet</a> vtbls;</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHGBuilder.html#adbff217477a779de9024d9a5777413a7">CHNodeSetTy</a>& chClasses = getCSClasses(callInst);</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keywordflow">for</span> (CHNodeSetTy::const_iterator it = chClasses.begin(), eit = chClasses.end(); it != eit; ++it)</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  {</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *<a class="code" href="cJSON_8cpp.html#ad00efb41ca386db28bacc7aefe79535c">child</a> = *it;</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a> *vtbl = child-><a class="code" href="classSVF_1_1CHNode.html#aa49ae91e2dd45c94f3d7694eb7e6737b">getVTable</a>();</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <span class="keywordflow">if</span> (vtbl != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  {</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  vtbls.insert(vtbl);</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  }</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">if</span> (vtbls.size() > 0)</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  {</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a9815a5b31ac7dc21239d08e5b9f61106">SVFUtil::getSVFCallSite</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFInstruction(callInst));</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  chg->csToCHAVtblsMap[cs] = vtbls;</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  <a class="code" href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">VFunSet</a> virtualFunctions;</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  chg->getVFnsFromVtbls(cs, vtbls, virtualFunctions);</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="keywordflow">if</span> (virtualFunctions.size() > 0)</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  chg->csToCHAVFnsMap[cs] = virtualFunctions;</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  }</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  }</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  }</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  }</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> }</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span> </div><div class="line"><a name="l00672"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#adc1b1f45e7000fa57e3a70ef9e4af853"> 672</a></span> <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHGraph.html#ad0f60c720b277c60ed8a8966189bb42b">CHGraph::CHNodeSetTy</a>& <a class="code" href="classSVF_1_1CHGBuilder.html#adc1b1f45e7000fa57e3a70ef9e4af853">CHGBuilder::getCSClasses</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a>* cs)</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>  assert(<a class="code" href="namespaceSVF_1_1cppUtil.html#aab1dce633f9a03796c208b6fba2bd2b4">isVirtualCallSite</a>(cs) && <span class="stringliteral">"not virtual callsite!"</span>);</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* svfcall = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-><a class="code" href="classSVF_1_1LLVMModuleSet.html#ae74f307b6f96950ceedb2c375ef1c3a3">getSVFInstruction</a>(cs);</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span> </div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  CHGraph::CallSiteToCHNodesMap::const_iterator it = chg->csToClassesMap.find(svfcall);</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="keywordflow">if</span> (it != chg->csToClassesMap.end())</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  {</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keywordflow">return</span> it->second;</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  }</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  {</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  <span class="keywordtype">string</span> thisPtrClassName = <a class="code" href="namespaceSVF_1_1cppUtil.html#a28d7f3931a05ebaf0a01ca4b263989b3">getClassNameOfThisPtr</a>(cs);</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a>* thisNode = chg->getNode(thisPtrClassName))</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="keyword">const</span> <a class="code" href="classSVF_1_1CHGraph.html#ad0f60c720b277c60ed8a8966189bb42b">CHGraph::CHNodeSetTy</a>& instAndDesces = getInstancesAndDescendants(thisPtrClassName);</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  chg->csToClassesMap[svfcall].insert(thisNode);</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <span class="keywordflow">for</span> (CHGraph::CHNodeSetTy::const_iterator it = instAndDesces.begin(), eit = instAndDesces.end(); it != eit; ++it)</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  chg->csToClassesMap[svfcall].insert(*it);</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  }</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <span class="keywordflow">return</span> chg->csToClassesMap[svfcall];</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="l00696"></a><span class="lineno"><a class="line" href="classSVF_1_1CHGBuilder.html#a87170f2cf98c6094491b8fbafdebec14"> 696</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1CHGBuilder.html#a87170f2cf98c6094491b8fbafdebec14">CHGBuilder::addFuncToFuncVector</a>(<a class="code" href="classSVF_1_1CHNode.html#aa4af6538c9994ec54a7b82691f846a31">CHNode::FuncVector</a> &v, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *lf)</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span> {</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#a917c4bd2d5fd1354b5069bf0a68533d9">isCPPThunkFunction</a>(lf))</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  {</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <span class="keyword">auto</span> *tf = <a class="code" href="namespaceSVF_1_1cppUtil.html#ac9c6d4315e7a1a826add7ed9cf924553">getThunkTarget</a>(lf))</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  v.push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFFunction(tf));</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  }</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  {</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  v.push_back(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFFunction(lf));</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="ttc" id="classSVF_1_1CHGBuilder_html_a8e915f257224b1d8e40d0e4c9b5e1df0"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#a8e915f257224b1d8e40d0e4c9b5e1df0">SVF::CHGBuilder::createNode</a></div><div class="ttdeci">CHNode * createNode(const std::string name)</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00236">CHGBuilder.cpp:236</a></div></div>
|
|
70
70
|
<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>
|
|
71
71
|
<div class="ttc" id="namespaceSVF_html_a28eec26ec8edaa5e96aecfeb01f6c0d4"><div class="ttname"><a href="namespaceSVF.html#a28eec26ec8edaa5e96aecfeb01f6c0d4">SVF::MDString</a></div><div class="ttdeci">llvm::MDString MDString</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00075">BasicTypes.h:75</a></div></div>
|
|
72
72
|
<div class="ttc" id="classSVF_1_1SVFInstruction_html"><div class="ttname"><a href="classSVF_1_1SVFInstruction.html">SVF::SVFInstruction</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00570">SVFValue.h:570</a></div></div>
|
|
@@ -84,13 +84,14 @@ $(function() {
|
|
|
84
84
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a9815a5b31ac7dc21239d08e5b9f61106"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a9815a5b31ac7dc21239d08e5b9f61106">SVF::SVFUtil::getSVFCallSite</a></div><div class="ttdeci">CallSite getSVFCallSite(const SVFInstruction *inst)</div><div class="ttdoc">Return LLVM callsite given an instruction. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00194">SVFUtil.h:194</a></div></div>
|
|
85
85
|
<div class="ttc" id="namespaceLLVMUtil_html"><div class="ttname"><a href="namespaceLLVMUtil.html">LLVMUtil</a></div></div>
|
|
86
86
|
<div class="ttc" id="classSVF_1_1FIFOWorkList_html_a7056704c224dfb4b57287fe90c004aa8"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">SVF::FIFOWorkList::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00146">WorkList.h:146</a></div></div>
|
|
87
|
-
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad6f9578cdce518141772a11617160da8"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad6f9578cdce518141772a11617160da8">SVF::cppUtil::isConstructor</a></div><div class="ttdeci">bool isConstructor(const Function *F)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#
|
|
87
|
+
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad6f9578cdce518141772a11617160da8"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad6f9578cdce518141772a11617160da8">SVF::cppUtil::isConstructor</a></div><div class="ttdeci">bool isConstructor(const Function *F)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00454">CPPUtil.cpp:454</a></div></div>
|
|
88
88
|
<div class="ttc" id="classSVF_1_1SVFFunction_html"><div class="ttname"><a href="classSVF_1_1SVFFunction.html">SVF::SVFFunction</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00257">SVFValue.h:257</a></div></div>
|
|
89
89
|
<div class="ttc" id="classSVF_1_1CHNode_html_aa4af6538c9994ec54a7b82691f846a31"><div class="ttname"><a href="classSVF_1_1CHNode.html#aa4af6538c9994ec54a7b82691f846a31">SVF::CHNode::FuncVector</a></div><div class="ttdeci">std::vector< const SVFFunction * > FuncVector</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00114">CHG.h:114</a></div></div>
|
|
90
90
|
<div class="ttc" id="SVFType_8h_html_a2c64190a065f342897573a3ef4973adb"><div class="ttname"><a href="SVFType_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a></div><div class="ttdeci">#define DGENERAL</div><div class="ttdoc">General debug flag is for each phase of a pass, it is often in a colorful output format. </div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00424">SVFType.h:424</a></div></div>
|
|
91
91
|
<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#l00446">SVFType.h:446</a></div></div>
|
|
92
92
|
<div class="ttc" id="SVFUtil_8h_html"><div class="ttname"><a href="SVFUtil_8h.html">SVFUtil.h</a></div></div>
|
|
93
93
|
<div class="ttc" id="namespacestd_html"><div class="ttname"><a href="namespacestd.html">std</a></div></div>
|
|
94
|
+
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_af6e96694d983643a66c238cce01bff0e"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if_t<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type > dyn_cast(const Y &Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00398">Casting.h:398</a></div></div>
|
|
94
95
|
<div class="ttc" id="CHGBuilder_8h_html"><div class="ttname"><a href="CHGBuilder_8h.html">CHGBuilder.h</a></div></div>
|
|
95
96
|
<div class="ttc" id="cJSON_8cpp_html_ad00efb41ca386db28bacc7aefe79535c"><div class="ttname"><a href="cJSON_8cpp.html#ad00efb41ca386db28bacc7aefe79535c">child</a></div><div class="ttdeci">cJSON * child</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02723">cJSON.cpp:2723</a></div></div>
|
|
96
97
|
<div class="ttc" id="classSVF_1_1CHGraph_html_ad0f60c720b277c60ed8a8966189bb42b"><div class="ttname"><a href="classSVF_1_1CHGraph.html#ad0f60c720b277c60ed8a8966189bb42b">SVF::CHGraph::CHNodeSetTy</a></div><div class="ttdeci">Set< const CHNode * > CHNodeSetTy</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00213">CHG.h:213</a></div></div>
|
|
@@ -98,16 +99,16 @@ $(function() {
|
|
|
98
99
|
<div class="ttc" id="namespaceSVF_1_1LLVMUtil_html_af983b0e1fbd371d8672e8f03f63084fc"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#af983b0e1fbd371d8672e8f03f63084fc">SVF::LLVMUtil::isCastConstantExpr</a></div><div class="ttdeci">const ConstantExpr * isCastConstantExpr(const Value *val)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8h_source.html#l00259">LLVMUtil.h:259</a></div></div>
|
|
99
100
|
<div class="ttc" id="classSVF_1_1CHEdge_html_a26280c3b724551036f7e3ba2b5922676a8721eaefd547d6ba5229463d644815f4"><div class="ttname"><a href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a8721eaefd547d6ba5229463d644815f4">SVF::CHEdge::INSTANTCE</a></div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00083">CHG.h:83</a></div></div>
|
|
100
101
|
<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>
|
|
101
|
-
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_af19bec54621f4605bac4feaf9f73803c"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#af19bec54621f4605bac4feaf9f73803c">SVF::cppUtil::isDestructor</a></div><div class="ttdeci">bool isDestructor(const Function *F)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#
|
|
102
|
+
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_af19bec54621f4605bac4feaf9f73803c"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#af19bec54621f4605bac4feaf9f73803c">SVF::cppUtil::isDestructor</a></div><div class="ttdeci">bool isDestructor(const Function *F)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00486">CPPUtil.cpp:486</a></div></div>
|
|
102
103
|
<div class="ttc" id="classSVF_1_1FIFOWorkList_html_a0df409a67428e528321869d201f2a474"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html#a0df409a67428e528321869d201f2a474">SVF::FIFOWorkList::push</a></div><div class="ttdeci">bool push(const Data &data)</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00165">WorkList.h:165</a></div></div>
|
|
103
|
-
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_a917c4bd2d5fd1354b5069bf0a68533d9"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a917c4bd2d5fd1354b5069bf0a68533d9">SVF::cppUtil::isCPPThunkFunction</a></div><div class="ttdeci">bool isCPPThunkFunction(const Function *F)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#
|
|
104
|
+
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_a917c4bd2d5fd1354b5069bf0a68533d9"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a917c4bd2d5fd1354b5069bf0a68533d9">SVF::cppUtil::isCPPThunkFunction</a></div><div class="ttdeci">bool isCPPThunkFunction(const Function *F)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00288">CPPUtil.cpp:288</a></div></div>
|
|
104
105
|
<div class="ttc" id="classSVF_1_1CHGBuilder_html_ad9f1c51ba6dc279f22aa671f29257a50"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#ad9f1c51ba6dc279f22aa671f29257a50">SVF::CHGBuilder::buildInternalMaps</a></div><div class="ttdeci">void buildInternalMaps()</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00153">CHGBuilder.cpp:153</a></div></div>
|
|
105
106
|
<div class="ttc" id="classSVF_1_1CHGBuilder_html_a2898888c29261911388a9295bc969567"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#a2898888c29261911388a9295bc969567">SVF::CHGBuilder::connectInheritEdgeViaStore</a></div><div class="ttdeci">void connectInheritEdgeViaStore(const Function *caller, const StoreInst *store)</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00188">CHGBuilder.cpp:188</a></div></div>
|
|
106
107
|
<div class="ttc" id="classSVF_1_1CHGBuilder_html_a443b021eb2b08b92164515750385b058"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#a443b021eb2b08b92164515750385b058">SVF::CHGBuilder::readInheritanceMetadataFromModule</a></div><div class="ttdeci">void readInheritanceMetadataFromModule(const Module &M)</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00215">CHGBuilder.cpp:215</a></div></div>
|
|
107
|
-
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_ac9c6d4315e7a1a826add7ed9cf924553"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ac9c6d4315e7a1a826add7ed9cf924553">SVF::cppUtil::getThunkTarget</a></div><div class="ttdeci">const Function * getThunkTarget(const Function *F)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#
|
|
108
|
+
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_ac9c6d4315e7a1a826add7ed9cf924553"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ac9c6d4315e7a1a826add7ed9cf924553">SVF::cppUtil::getThunkTarget</a></div><div class="ttdeci">const Function * getThunkTarget(const Function *F)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00294">CPPUtil.cpp:294</a></div></div>
|
|
108
109
|
<div class="ttc" id="classSVF_1_1CHGBuilder_html_adc1b1f45e7000fa57e3a70ef9e4af853"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#adc1b1f45e7000fa57e3a70ef9e4af853">SVF::CHGBuilder::getCSClasses</a></div><div class="ttdeci">const CHNodeSetTy & getCSClasses(const CallBase *cs)</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00672">CHGBuilder.cpp:672</a></div></div>
|
|
109
|
-
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_a9e66b5eaf8b24917d0d3e2e98461f15c"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a9e66b5eaf8b24917d0d3e2e98461f15c">SVF::cppUtil::getClassNameFromVtblObj</a></div><div class="ttdeci">std::string getClassNameFromVtblObj(const std::string &vtblName)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#
|
|
110
|
-
<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#
|
|
110
|
+
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_a9e66b5eaf8b24917d0d3e2e98461f15c"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a9e66b5eaf8b24917d0d3e2e98461f15c">SVF::cppUtil::getClassNameFromVtblObj</a></div><div class="ttdeci">std::string getClassNameFromVtblObj(const std::string &vtblName)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00435">CPPUtil.cpp:435</a></div></div>
|
|
111
|
+
<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>
|
|
111
112
|
<div class="ttc" id="SymbolTableInfo_8h_html"><div class="ttname"><a href="SymbolTableInfo_8h.html">SymbolTableInfo.h</a></div></div>
|
|
112
113
|
<div class="ttc" id="namespaceSVF_html_a5faee14fa1dd41447bc73ac365fe33c1"><div class="ttname"><a href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">SVF::Function</a></div><div class="ttdeci">llvm::Function Function</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00059">BasicTypes.h:59</a></div></div>
|
|
113
114
|
<div class="ttc" id="classSVF_1_1CHGBuilder_html_a2828eb6b2bd86d6f279967c34da8e7e4"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#a2828eb6b2bd86d6f279967c34da8e7e4">SVF::CHGBuilder::analyzeVTables</a></div><div class="ttdeci">void analyzeVTables(const Module &M)</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00362">CHGBuilder.cpp:362</a></div></div>
|
|
@@ -118,7 +119,7 @@ $(function() {
|
|
|
118
119
|
<div class="ttc" id="namespaceSVF_html_a0fd33072b099f61eaa642e94ed0c03fc"><div class="ttname"><a href="namespaceSVF.html#a0fd33072b099f61eaa642e94ed0c03fc">SVF::GlobalAlias</a></div><div class="ttdeci">llvm::GlobalAlias GlobalAlias</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00102">BasicTypes.h:102</a></div></div>
|
|
119
120
|
<div class="ttc" id="namespaceSVF_html_a67f3f86344f028cacfbeb08caaf7bb0f"><div class="ttname"><a href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">SVF::GlobalValue</a></div><div class="ttdeci">llvm::GlobalValue GlobalValue</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00062">BasicTypes.h:62</a></div></div>
|
|
120
121
|
<div class="ttc" id="namespaceSVF_html_a340a9e77adc2bbfdee79e22da9ead234"><div class="ttname"><a href="namespaceSVF.html#a340a9e77adc2bbfdee79e22da9ead234">SVF::VTableSet</a></div><div class="ttdeci">Set< const SVFGlobalValue * > VTableSet</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00044">CHG.h:44</a></div></div>
|
|
121
|
-
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_aeef0f5c6486379043a7d47b0635f2667"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#aeef0f5c6486379043a7d47b0635f2667">SVF::cppUtil::isValVtbl</a></div><div class="ttdeci">bool isValVtbl(const Value *val)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#
|
|
122
|
+
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_aeef0f5c6486379043a7d47b0635f2667"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#aeef0f5c6486379043a7d47b0635f2667">SVF::cppUtil::isValVtbl</a></div><div class="ttdeci">bool isValVtbl(const Value *val)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00123">CPPUtil.cpp:123</a></div></div>
|
|
122
123
|
<div class="ttc" id="namespaceSVF_html_ad2b487757f1e1a1d81073120fc1d49c7"><div class="ttname"><a href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">SVF::VFunSet</a></div><div class="ttdeci">Set< const SVFFunction * > VFunSet</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00047">CHG.h:47</a></div></div>
|
|
123
124
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a145abbd2958629718fbca41d25c3124d"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVF::SVFUtil::getCallee</a></div><div class="ttdeci">const SVFFunction * getCallee(const CallSite cs)</div><div class="ttdoc">Return callee of a callsite. Return null if this is an indirect call. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00227">SVFUtil.h:227</a></div></div>
|
|
124
125
|
<div class="ttc" id="classSVF_1_1CHGBuilder_html_ae7832c277f0ff86f3ae750aac6063adb"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#ae7832c277f0ff86f3ae750aac6063adb">SVF::CHGBuilder::buildClassNameToAncestorsDescendantsMap</a></div><div class="ttdeci">void buildClassNameToAncestorsDescendantsMap()</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00263">CHGBuilder.cpp:263</a></div></div>
|
|
@@ -132,7 +133,7 @@ $(function() {
|
|
|
132
133
|
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_a1cf2e4671b16b477cc779c72f2419234"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a1cf2e4671b16b477cc779c72f2419234">SVF::cppUtil::getBeforeBrackets</a></div><div class="ttdeci">std::string getBeforeBrackets(const std::string &name)</div></div>
|
|
133
134
|
<div class="ttc" id="namespaceSVF_html_a7e230c0cba2e3a7c2e5a5f2ee7d88af9"><div class="ttname"><a href="namespaceSVF.html#a7e230c0cba2e3a7c2e5a5f2ee7d88af9">SVF::Constant</a></div><div class="ttdeci">llvm::Constant Constant</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00098">BasicTypes.h:98</a></div></div>
|
|
134
135
|
<div class="ttc" id="Options_8h_html"><div class="ttname"><a href="Options_8h.html">Options.h</a></div></div>
|
|
135
|
-
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_a643736d0d9aae502784f736f492201b4"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a643736d0d9aae502784f736f492201b4">SVF::cppUtil::getVCallThisPtr</a></div><div class="ttdeci">const Value * getVCallThisPtr(const CallBase *cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#
|
|
136
|
+
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_a643736d0d9aae502784f736f492201b4"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a643736d0d9aae502784f736f492201b4">SVF::cppUtil::getVCallThisPtr</a></div><div class="ttdeci">const Value * getVCallThisPtr(const CallBase *cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00316">CPPUtil.cpp:316</a></div></div>
|
|
136
137
|
<div class="ttc" id="classSVF_1_1FIFOWorkList_html"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html">SVF::FIFOWorkList</a></div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00137">WorkList.h:137</a></div></div>
|
|
137
138
|
<div class="ttc" id="namespacecppUtil_html"><div class="ttname"><a href="namespacecppUtil.html">cppUtil</a></div></div>
|
|
138
139
|
<div class="ttc" id="namespaceSVF_html_ad3d3cec1813411f039211c86236f7adb"><div class="ttname"><a href="namespaceSVF.html#ad3d3cec1813411f039211c86236f7adb">SVF::MDNode</a></div><div class="ttdeci">llvm::MDNode MDNode</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00086">BasicTypes.h:86</a></div></div>
|
|
@@ -145,7 +146,6 @@ $(function() {
|
|
|
145
146
|
<div class="ttc" id="classSVF_1_1CallSite_html"><div class="ttname"><a href="classSVF_1_1CallSite.html">SVF::CallSite</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l01014">SVFValue.h:1014</a></div></div>
|
|
146
147
|
<div class="ttc" id="classSVF_1_1CHGBuilder_html_abab6d95945a43fbe4c73ac12550f5d8c"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#abab6d95945a43fbe4c73ac12550f5d8c">SVF::CHGBuilder::buildCSToCHAVtblsAndVfnsMap</a></div><div class="ttdeci">void buildCSToCHAVtblsAndVfnsMap()</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00632">CHGBuilder.cpp:632</a></div></div>
|
|
147
148
|
<div class="ttc" id="SVFModule_8h_html"><div class="ttname"><a href="SVFModule_8h.html">SVFModule.h</a></div></div>
|
|
148
|
-
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a8182be247907420db00837cef9bcfa70"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00342">Casting.h:342</a></div></div>
|
|
149
149
|
<div class="ttc" id="classSVF_1_1CHGBuilder_html_a648e97899c16a5634fc8369aef8a031f"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#a648e97899c16a5634fc8369aef8a031f">SVF::CHGBuilder::buildCHGNodes</a></div><div class="ttdeci">void buildCHGNodes(const GlobalValue *V)</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00089">CHGBuilder.cpp:89</a></div></div>
|
|
150
150
|
<div class="ttc" id="namespaceSVF_html_a2b28f48dde0a9a91d251e654ce1f9477"><div class="ttname"><a href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">SVF::ConstantStruct</a></div><div class="ttdeci">llvm::ConstantStruct ConstantStruct</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00080">BasicTypes.h:80</a></div></div>
|
|
151
151
|
<div class="ttc" id="namespaceSVF_html_a911dbaab38cb42deb9c195c7f687853d"><div class="ttname"><a href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">SVF::ConstantExpr</a></div><div class="ttdeci">llvm::ConstantExpr ConstantExpr</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00094">BasicTypes.h:94</a></div></div>
|
|
@@ -156,7 +156,7 @@ $(function() {
|
|
|
156
156
|
<div class="ttc" id="SVFType_8h_html_a263149d980e5c3165dfe8750bfac3223"><div class="ttname"><a href="SVFType_8h.html#a263149d980e5c3165dfe8750bfac3223">DCHA</a></div><div class="ttdeci">#define DCHA</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00440">SVFType.h:440</a></div></div>
|
|
157
157
|
<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>
|
|
158
158
|
<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#l00419">SVFType.h:419</a></div></div>
|
|
159
|
-
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_a28d7f3931a05ebaf0a01ca4b263989b3"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a28d7f3931a05ebaf0a01ca4b263989b3">SVF::cppUtil::getClassNameOfThisPtr</a></div><div class="ttdeci">std::string getClassNameOfThisPtr(const CallBase *cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#
|
|
159
|
+
<div class="ttc" id="namespaceSVF_1_1cppUtil_html_a28d7f3931a05ebaf0a01ca4b263989b3"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a28d7f3931a05ebaf0a01ca4b263989b3">SVF::cppUtil::getClassNameOfThisPtr</a></div><div class="ttdeci">std::string getClassNameOfThisPtr(const CallBase *cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00520">CPPUtil.cpp:520</a></div></div>
|
|
160
160
|
<div class="ttc" id="PTAStat_8h_html"><div class="ttname"><a href="PTAStat_8h.html">PTAStat.h</a></div></div>
|
|
161
161
|
<div class="ttc" id="classSVF_1_1FIFOWorkList_html_a8fa72918fce7e9c0b2dc34b683a797c6"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">SVF::FIFOWorkList::pop</a></div><div class="ttdeci">Data pop()</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00200">WorkList.h:200</a></div></div>
|
|
162
162
|
<div class="ttc" id="namespaceSVF_html_a90b263fd2f541eca78135078114cabda"><div class="ttname"><a href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">SVF::Value</a></div><div class="ttdeci">llvm::Value Value</div><div class="ttdoc">LLVM Basic classes. </div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00056">BasicTypes.h:56</a></div></div>
|