svf-tools 1.0.586 → 1.0.587

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.
@@ -218,8 +218,8 @@ Private Attributes</h2></td></tr>
218
218
 
219
219
  <p class="definition">Definition at line <a class="el" href="CHGBuilder_8cpp_source.html#l00697">697</a> of file <a class="el" href="CHGBuilder_8cpp_source.html">CHGBuilder.cpp</a>.</p>
220
220
  <div class="fragment"><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160;{</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span> *lf = f-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#a917c4bd2d5fd1354b5069bf0a68533d9">isCPPThunkFunction</a>(lf))</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; {</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; <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="l00703"></a><span class="lineno"> 703</span>&#160; v.push_back(<a class="code" href="classSVF_1_1CHGBuilder.html#ab3471cc9afba5976c7e5fbd07dfb22dc">chg</a>-&gt;<a class="code" href="classSVF_1_1CHGraph.html#a62a3ccdbc55381d5f8d96dc23141f2e5">svfMod</a>-&gt;<a class="code" href="classSVF_1_1SVFModule.html#af969d7739f27c8242985656bafbabaeb">getSVFFunction</a>(tf));</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; }</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; {</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; v.push_back(f);</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>&#160; }</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160;}</div><div class="ttc" id="classSVF_1_1CHGraph_html_a62a3ccdbc55381d5f8d96dc23141f2e5"><div class="ttname"><a href="classSVF_1_1CHGraph.html#a62a3ccdbc55381d5f8d96dc23141f2e5">SVF::CHGraph::svfMod</a></div><div class="ttdeci">SVFModule * svfMod</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00310">CHG.h:310</a></div></div>
221
- <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#l00285">CPPUtil.cpp:285</a></div></div>
222
- <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#l00291">CPPUtil.cpp:291</a></div></div>
221
+ <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#l00289">CPPUtil.cpp:289</a></div></div>
222
+ <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#l00295">CPPUtil.cpp:295</a></div></div>
223
223
  <div class="ttc" id="classSVF_1_1CHGBuilder_html_ab3471cc9afba5976c7e5fbd07dfb22dc"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#ab3471cc9afba5976c7e5fbd07dfb22dc">SVF::CHGBuilder::chg</a></div><div class="ttdeci">CHGraph * chg</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8h_source.html#l00040">CHGBuilder.h:40</a></div></div>
224
224
  <div class="ttc" id="classSVF_1_1SVFFunction_html_ac4ae917ae35ac6fca652fe2dd90a8ac2"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">SVF::SVFFunction::getLLVMFun</a></div><div class="ttdeci">Function * getLLVMFun() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00140">BasicTypes.h:140</a></div></div>
225
225
  <div class="ttc" id="classSVF_1_1SVFModule_html_af969d7739f27c8242985656bafbabaeb"><div class="ttname"><a href="classSVF_1_1SVFModule.html#af969d7739f27c8242985656bafbabaeb">SVF::SVFModule::getSVFFunction</a></div><div class="ttdeci">const SVFFunction * getSVFFunction(const Function *fun) const</div><div class="ttdef"><b>Definition:</b> <a href="SVFModule_8h_source.html#l00130">SVFModule.h:130</a></div></div>
@@ -251,7 +251,7 @@ Private Attributes</h2></td></tr>
251
251
  <div class="ttc" id="classSVF_1_1CHNode_html_a2c31580f1cf43fbdd01a07b6f9f6b04e"><div class="ttname"><a href="classSVF_1_1CHNode.html#a2c31580f1cf43fbdd01a07b6f9f6b04e">SVF::CHNode::setVTable</a></div><div class="ttdeci">void setVTable(const GlobalValue *vtbl)</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00182">CHG.h:182</a></div></div>
252
252
  <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="SVFBasicTypes_8h_source.html#l00085">SVFBasicTypes.h:85</a></div></div>
253
253
  <div class="ttc" id="classSVF_1_1CHGBuilder_html_a77753749b34b00c18d419057b4757a26"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#a77753749b34b00c18d419057b4757a26">SVF::CHGBuilder::addFuncToFuncVector</a></div><div class="ttdeci">void addFuncToFuncVector(CHNode::FuncVector &amp;v, const SVFFunction *f)</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00697">CHGBuilder.cpp:697</a></div></div>
254
- <div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad83c097f1c77cdf52fc219ef07ee0b1a"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad83c097f1c77cdf52fc219ef07ee0b1a">SVF::cppUtil::getClassNameFromVtblObj</a></div><div class="ttdeci">std::string getClassNameFromVtblObj(const Value *value)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00434">CPPUtil.cpp:434</a></div></div>
254
+ <div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad83c097f1c77cdf52fc219ef07ee0b1a"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad83c097f1c77cdf52fc219ef07ee0b1a">SVF::cppUtil::getClassNameFromVtblObj</a></div><div class="ttdeci">std::string getClassNameFromVtblObj(const Value *value)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00438">CPPUtil.cpp:438</a></div></div>
255
255
  <div class="ttc" id="classSVF_1_1CHGBuilder_html_ab3471cc9afba5976c7e5fbd07dfb22dc"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#ab3471cc9afba5976c7e5fbd07dfb22dc">SVF::CHGBuilder::chg</a></div><div class="ttdeci">CHGraph * chg</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8h_source.html#l00040">CHGBuilder.h:40</a></div></div>
256
256
  <div class="ttc" id="classSVF_1_1CHNode_html_a5d751a3a0d88c0de374bfeb526051440"><div class="ttname"><a href="classSVF_1_1CHNode.html#a5d751a3a0d88c0de374bfeb526051440">SVF::CHNode::setMultiInheritance</a></div><div class="ttdeci">void setMultiInheritance()</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00145">CHG.h:145</a></div></div>
257
257
  <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="Util_2BasicTypes_8h_source.html#l00069">BasicTypes.h:69</a></div></div>
@@ -336,9 +336,9 @@ Private Attributes</h2></td></tr>
336
336
  <div class="fragment"><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;{</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* F = fun-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160;</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; <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="l00139"></a><span class="lineno"> 139</span>&#160; {</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keywordflow">for</span> (Function::const_iterator B = F-&gt;begin(), E = F-&gt;end(); B != E; ++B)</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; {</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="keywordflow">for</span> (BasicBlock::const_iterator I = B-&gt;begin(), E = B-&gt;end(); I != E; ++I)</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; {</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a2e08ce822223842fa6a73fd659b1a526">SVFUtil::isCallSite</a>(&amp;(*I)))</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; {</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">SVFUtil::getLLVMCallSite</a>(&amp;(*I));</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; <a class="code" href="classSVF_1_1CHGBuilder.html#a06db89019c094ad35bea97be1d3b452a">connectInheritEdgeViaCall</a>(fun, cs);</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; }</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <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&lt;StoreInst&gt;(&amp;(*I)))</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; {</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <a class="code" href="classSVF_1_1CHGBuilder.html#acbdf97de6a24cec8d0ae020e3bfb79e6">connectInheritEdgeViaStore</a>(fun, store);</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; }</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; }</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; }</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; }</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;}</div><div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a2e08ce822223842fa6a73fd659b1a526"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a2e08ce822223842fa6a73fd659b1a526">SVF::SVFUtil::isCallSite</a></div><div class="ttdeci">bool isCallSite(const Instruction *inst)</div><div class="ttdoc">Whether an instruction is a call or invoke instruction. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00196">SVFUtil.h:196</a></div></div>
337
337
  <div class="ttc" id="namespaceSVF_html_ab696aab940eb187dc81217efe8649af5"><div class="ttname"><a href="namespaceSVF.html#ab696aab940eb187dc81217efe8649af5">SVF::StoreInst</a></div><div class="ttdeci">llvm::StoreInst StoreInst</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00098">BasicTypes.h:98</a></div></div>
338
338
  <div class="ttc" id="classSVF_1_1CHGBuilder_html_a06db89019c094ad35bea97be1d3b452a"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#a06db89019c094ad35bea97be1d3b452a">SVF::CHGBuilder::connectInheritEdgeViaCall</a></div><div class="ttdeci">void connectInheritEdgeViaCall(const SVFFunction *caller, CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00166">CHGBuilder.cpp:166</a></div></div>
339
- <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>
339
+ <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#l00458">CPPUtil.cpp:458</a></div></div>
340
340
  <div class="ttc" id="classSVF_1_1CHGBuilder_html_acbdf97de6a24cec8d0ae020e3bfb79e6"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#acbdf97de6a24cec8d0ae020e3bfb79e6">SVF::CHGBuilder::connectInheritEdgeViaStore</a></div><div class="ttdeci">void connectInheritEdgeViaStore(const SVFFunction *caller, const StoreInst *store)</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00195">CHGBuilder.cpp:195</a></div></div>
341
- <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>
341
+ <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#l00490">CPPUtil.cpp:490</a></div></div>
342
342
  <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="Util_2BasicTypes_8h_source.html#l00069">BasicTypes.h:69</a></div></div>
343
343
  <div class="ttc" id="classSVF_1_1SVFFunction_html_ac4ae917ae35ac6fca652fe2dd90a8ac2"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">SVF::SVFFunction::getLLVMFun</a></div><div class="ttdeci">Function * getLLVMFun() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00140">BasicTypes.h:140</a></div></div>
344
344
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a202de7ad2bea0311e2f75894c030e7a9"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">SVF::SVFUtil::getLLVMCallSite</a></div><div class="ttdeci">CallSite getLLVMCallSite(const Instruction *inst)</div><div class="ttdoc">Return LLVM callsite given a instruction. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00217">SVFUtil.h:217</a></div></div>
@@ -368,7 +368,7 @@ Private Attributes</h2></td></tr>
368
368
  <div class="ttc" id="classSVF_1_1CHGraph_html_a7beec68a60036c93a741a7152e8198b6"><div class="ttname"><a href="classSVF_1_1CHGraph.html#a7beec68a60036c93a741a7152e8198b6">SVF::CHGraph::getNode</a></div><div class="ttdeci">CHNode * getNode(const std::string name) const</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8cpp_source.html#l00088">CHG.cpp:88</a></div></div>
369
369
  <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#l00217">LLVMUtil.h:217</a></div></div>
370
370
  <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="SVFBasicTypes_8h_source.html#l00085">SVFBasicTypes.h:85</a></div></div>
371
- <div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad83c097f1c77cdf52fc219ef07ee0b1a"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad83c097f1c77cdf52fc219ef07ee0b1a">SVF::cppUtil::getClassNameFromVtblObj</a></div><div class="ttdeci">std::string getClassNameFromVtblObj(const Value *value)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00434">CPPUtil.cpp:434</a></div></div>
371
+ <div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad83c097f1c77cdf52fc219ef07ee0b1a"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad83c097f1c77cdf52fc219ef07ee0b1a">SVF::cppUtil::getClassNameFromVtblObj</a></div><div class="ttdeci">std::string getClassNameFromVtblObj(const Value *value)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00438">CPPUtil.cpp:438</a></div></div>
372
372
  <div class="ttc" id="classSVF_1_1CHGBuilder_html_ab3471cc9afba5976c7e5fbd07dfb22dc"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#ab3471cc9afba5976c7e5fbd07dfb22dc">SVF::CHGBuilder::chg</a></div><div class="ttdeci">CHGraph * chg</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8h_source.html#l00040">CHGBuilder.h:40</a></div></div>
373
373
  <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="Util_2BasicTypes_8h_source.html#l00069">BasicTypes.h:69</a></div></div>
374
374
  <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#l00124">CPPUtil.cpp:124</a></div></div>
@@ -399,9 +399,9 @@ Private Attributes</h2></td></tr>
399
399
  <p class="definition">Definition at line <a class="el" href="CHGBuilder_8cpp_source.html#l00122">122</a> of file <a class="el" href="CHGBuilder_8cpp_source.html">CHGBuilder.cpp</a>.</p>
400
400
  <div class="fragment"><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160;{</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* F = fun-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <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="l00126"></a><span class="lineno"> 126</span>&#160; {</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(F-&gt;getName().str());</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a263149d980e5c3165dfe8750bfac3223">DCHA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t build CHANode for class &quot;</span> + dname.className + <span class="stringliteral">&quot;...\n&quot;</span>);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classSVF_1_1CHGBuilder.html#ab3471cc9afba5976c7e5fbd07dfb22dc">chg</a>-&gt;<a class="code" href="classSVF_1_1CHGraph.html#a7beec68a60036c93a741a7152e8198b6">getNode</a>(dname.className))</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <a class="code" href="classSVF_1_1CHGBuilder.html#a8e915f257224b1d8e40d0e4c9b5e1df0">createNode</a>(dname.className);</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; }</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;}</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#l00243">CHGBuilder.cpp:243</a></div></div>
401
401
  <div class="ttc" id="SVFBasicTypes_8h_html_a263149d980e5c3165dfe8750bfac3223"><div class="ttname"><a href="SVFBasicTypes_8h.html#a263149d980e5c3165dfe8750bfac3223">DCHA</a></div><div class="ttdeci">#define DCHA</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00176">SVFBasicTypes.h:176</a></div></div>
402
- <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>
402
+ <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#l00458">CPPUtil.cpp:458</a></div></div>
403
403
  <div class="ttc" id="classSVF_1_1CHGraph_html_a7beec68a60036c93a741a7152e8198b6"><div class="ttname"><a href="classSVF_1_1CHGraph.html#a7beec68a60036c93a741a7152e8198b6">SVF::CHGraph::getNode</a></div><div class="ttdeci">CHNode * getNode(const std::string name) const</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8cpp_source.html#l00088">CHG.cpp:88</a></div></div>
404
- <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>
404
+ <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#l00490">CPPUtil.cpp:490</a></div></div>
405
405
  <div class="ttc" id="classSVF_1_1CHGBuilder_html_ab3471cc9afba5976c7e5fbd07dfb22dc"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#ab3471cc9afba5976c7e5fbd07dfb22dc">SVF::CHGBuilder::chg</a></div><div class="ttdeci">CHGraph * chg</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8h_source.html#l00040">CHGBuilder.h:40</a></div></div>
406
406
  <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="Util_2BasicTypes_8h_source.html#l00069">BasicTypes.h:69</a></div></div>
407
407
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_aed0b0b9f035057552a6a82154fd88e61"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVF::SVFUtil::outs</a></div><div class="ttdeci">std::ostream &amp; outs()</div><div class="ttdoc">Overwrite llvm::outs() </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00049">SVFUtil.h:49</a></div></div>
@@ -560,11 +560,11 @@ Private Attributes</h2></td></tr>
560
560
 
561
561
  <p class="definition">Definition at line <a class="el" href="CHGBuilder_8cpp_source.html#l00166">166</a> of file <a class="el" href="CHGBuilder_8cpp_source.html">CHGBuilder.cpp</a>.</p>
562
562
  <div class="fragment"><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;{</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; <span class="keywordflow">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="l00169"></a><span class="lineno"> 169</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <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)-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* caller = callerfun-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(caller-&gt;getName().str());</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">if</span> ((<a class="code" href="namespaceSVF_1_1cppUtil.html#ad6f9578cdce518141772a11617160da8">isConstructor</a>(caller) &amp;&amp; <a class="code" href="namespaceSVF_1_1cppUtil.html#ad6f9578cdce518141772a11617160da8">isConstructor</a>(callee)) || (<a class="code" href="namespaceSVF_1_1cppUtil.html#af19bec54621f4605bac4feaf9f73803c">isDestructor</a>(caller) &amp;&amp; <a class="code" href="namespaceSVF_1_1cppUtil.html#af19bec54621f4605bac4feaf9f73803c">isDestructor</a>(callee)))</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; {</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordflow">if</span> (cs.<a class="code" href="classSVF_1_1CallSite.html#a145676880fce313b4634d14118476c27">arg_size</a>() &lt; 1 || (cs.<a class="code" href="classSVF_1_1CallSite.html#a145676880fce313b4634d14118476c27">arg_size</a>() &lt; 2 &amp;&amp; cs.<a class="code" href="classSVF_1_1CallSite.html#a15a98a5e0fe91f0e239a052acd029cc2">paramHasAttr</a>(0, llvm::Attribute::StructRet)))</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *csThisPtr = <a class="code" href="namespaceSVF_1_1cppUtil.html#a7c9507812041b5de8dbbca5b602fefbd">getVCallThisPtr</a>(cs);</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="comment">//const Argument *consThisPtr = getConstructorThisPtr(caller);</span></div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; <span class="comment">//bool samePtr = isSameThisPtrInConstructor(consThisPtr, csThisPtr);</span></div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordtype">bool</span> samePtrTrue = <span class="keyword">true</span>;</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keywordflow">if</span> (csThisPtr != <span class="keyword">nullptr</span> &amp;&amp; samePtrTrue)</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; {</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keyword">struct </span>DemangledName basename = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(callee-&gt;getName().str());</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceSVF_1_1SVFUtil.html#a2e08ce822223842fa6a73fd659b1a526">SVFUtil::isCallSite</a>(csThisPtr) &amp;&amp;</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; basename.className.size() &gt; 0)</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; {</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <a class="code" href="classSVF_1_1CHGBuilder.html#ab3471cc9afba5976c7e5fbd07dfb22dc">chg</a>-&gt;<a class="code" href="classSVF_1_1CHGraph.html#a3867db3e76f068bd8c4399b103dcd0b7">addEdge</a>(dname.className, basename.className, <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">CHEdge::INHERITANCE</a>);</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; }</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; }</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; }</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160;}</div><div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a2e08ce822223842fa6a73fd659b1a526"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a2e08ce822223842fa6a73fd659b1a526">SVF::SVFUtil::isCallSite</a></div><div class="ttdeci">bool isCallSite(const Instruction *inst)</div><div class="ttdoc">Whether an instruction is a call or invoke instruction. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00196">SVFUtil.h:196</a></div></div>
563
- <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>
564
- <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>
563
+ <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#l00458">CPPUtil.cpp:458</a></div></div>
564
+ <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#l00490">CPPUtil.cpp:490</a></div></div>
565
565
  <div class="ttc" id="classSVF_1_1CHGBuilder_html_ab3471cc9afba5976c7e5fbd07dfb22dc"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#ab3471cc9afba5976c7e5fbd07dfb22dc">SVF::CHGBuilder::chg</a></div><div class="ttdeci">CHGraph * chg</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8h_source.html#l00040">CHGBuilder.h:40</a></div></div>
566
566
  <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="Util_2BasicTypes_8h_source.html#l00069">BasicTypes.h:69</a></div></div>
567
- <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a7c9507812041b5de8dbbca5b602fefbd"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a7c9507812041b5de8dbbca5b602fefbd">SVF::cppUtil::getVCallThisPtr</a></div><div class="ttdeci">const Value * getVCallThisPtr(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00315">CPPUtil.cpp:315</a></div></div>
567
+ <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a7c9507812041b5de8dbbca5b602fefbd"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a7c9507812041b5de8dbbca5b602fefbd">SVF::cppUtil::getVCallThisPtr</a></div><div class="ttdeci">const Value * getVCallThisPtr(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00319">CPPUtil.cpp:319</a></div></div>
568
568
  <div class="ttc" id="classSVF_1_1CHEdge_html_a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c"><div class="ttname"><a href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">SVF::CHEdge::INHERITANCE</a></div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00082">CHG.h:82</a></div></div>
569
569
  <div class="ttc" id="classSVF_1_1CHGraph_html_a3867db3e76f068bd8c4399b103dcd0b7"><div class="ttname"><a href="classSVF_1_1CHGraph.html#a3867db3e76f068bd8c4399b103dcd0b7">SVF::CHGraph::addEdge</a></div><div class="ttdeci">void addEdge(const std::string className, const std::string baseClassName, CHEdge::CHEDGETYPE edgeType)</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8cpp_source.html#l00073">CHG.cpp:73</a></div></div>
570
570
  <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#l00269">SVFUtil.h:269</a></div></div>
@@ -603,7 +603,7 @@ Private Attributes</h2></td></tr>
603
603
  </div><div class="memdoc">
604
604
 
605
605
  <p class="definition">Definition at line <a class="el" href="CHGBuilder_8cpp_source.html#l00195">195</a> of file <a class="el" href="CHGBuilder_8cpp_source.html">CHGBuilder.cpp</a>.</p>
606
- <div class="fragment"><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;{</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(caller-&gt;<a class="code" href="classSVF_1_1SVFValue.html#a2409c01221b9a6632655cee43d1b35e4">getName</a>());</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *ce = SVFUtil::dyn_cast&lt;ConstantExpr&gt;(storeInst-&gt;getValueOperand()))</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; {</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="keywordflow">if</span> (ce-&gt;getOpcode() == Instruction::BitCast)</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; {</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *bitcastval = ce-&gt;getOperand(0);</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *bcce = SVFUtil::dyn_cast&lt;ConstantExpr&gt;(bitcastval))</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; {</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordflow">if</span> (bcce-&gt;getOpcode() == Instruction::GetElementPtr)</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; {</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *gepval = bcce-&gt;getOperand(0);</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#aeef0f5c6486379043a7d47b0635f2667">isValVtbl</a>(gepval))</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; {</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keywordtype">string</span> vtblClassName = <a class="code" href="namespaceSVF_1_1cppUtil.html#ad83c097f1c77cdf52fc219ef07ee0b1a">getClassNameFromVtblObj</a>(gepval);</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keywordflow">if</span> (vtblClassName.size() &gt; 0 &amp;&amp; dname.className.compare(vtblClassName) != 0)</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; {</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <a class="code" href="classSVF_1_1CHGBuilder.html#ab3471cc9afba5976c7e5fbd07dfb22dc">chg</a>-&gt;<a class="code" href="classSVF_1_1CHGraph.html#a3867db3e76f068bd8c4399b103dcd0b7">addEdge</a>(dname.className, vtblClassName, <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">CHEdge::INHERITANCE</a>);</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; }</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; }</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; }</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; }</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; }</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; }</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160;}</div><div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad83c097f1c77cdf52fc219ef07ee0b1a"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad83c097f1c77cdf52fc219ef07ee0b1a">SVF::cppUtil::getClassNameFromVtblObj</a></div><div class="ttdeci">std::string getClassNameFromVtblObj(const Value *value)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00434">CPPUtil.cpp:434</a></div></div>
606
+ <div class="fragment"><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;{</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="keyword">struct </span>DemangledName dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">demangle</a>(caller-&gt;<a class="code" href="classSVF_1_1SVFValue.html#a2409c01221b9a6632655cee43d1b35e4">getName</a>());</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *ce = SVFUtil::dyn_cast&lt;ConstantExpr&gt;(storeInst-&gt;getValueOperand()))</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; {</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="keywordflow">if</span> (ce-&gt;getOpcode() == Instruction::BitCast)</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; {</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *bitcastval = ce-&gt;getOperand(0);</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *bcce = SVFUtil::dyn_cast&lt;ConstantExpr&gt;(bitcastval))</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; {</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <span class="keywordflow">if</span> (bcce-&gt;getOpcode() == Instruction::GetElementPtr)</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; {</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *gepval = bcce-&gt;getOperand(0);</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1cppUtil.html#aeef0f5c6486379043a7d47b0635f2667">isValVtbl</a>(gepval))</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; {</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keywordtype">string</span> vtblClassName = <a class="code" href="namespaceSVF_1_1cppUtil.html#ad83c097f1c77cdf52fc219ef07ee0b1a">getClassNameFromVtblObj</a>(gepval);</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keywordflow">if</span> (vtblClassName.size() &gt; 0 &amp;&amp; dname.className.compare(vtblClassName) != 0)</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; {</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <a class="code" href="classSVF_1_1CHGBuilder.html#ab3471cc9afba5976c7e5fbd07dfb22dc">chg</a>-&gt;<a class="code" href="classSVF_1_1CHGraph.html#a3867db3e76f068bd8c4399b103dcd0b7">addEdge</a>(dname.className, vtblClassName, <a class="code" href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">CHEdge::INHERITANCE</a>);</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; }</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; }</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; }</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; }</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; }</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; }</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160;}</div><div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad83c097f1c77cdf52fc219ef07ee0b1a"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad83c097f1c77cdf52fc219ef07ee0b1a">SVF::cppUtil::getClassNameFromVtblObj</a></div><div class="ttdeci">std::string getClassNameFromVtblObj(const Value *value)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00438">CPPUtil.cpp:438</a></div></div>
607
607
  <div class="ttc" id="classSVF_1_1CHGBuilder_html_ab3471cc9afba5976c7e5fbd07dfb22dc"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#ab3471cc9afba5976c7e5fbd07dfb22dc">SVF::CHGBuilder::chg</a></div><div class="ttdeci">CHGraph * chg</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8h_source.html#l00040">CHGBuilder.h:40</a></div></div>
608
608
  <div class="ttc" id="classSVF_1_1CHEdge_html_a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c"><div class="ttname"><a href="classSVF_1_1CHEdge.html#a26280c3b724551036f7e3ba2b5922676a78df5157ac61c49a724af5aa03d36d0c">SVF::CHEdge::INHERITANCE</a></div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00082">CHG.h:82</a></div></div>
609
609
  <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#l00124">CPPUtil.cpp:124</a></div></div>
@@ -673,7 +673,7 @@ Private Attributes</h2></td></tr>
673
673
  <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&lt; const CHNode * &gt; CHNodeSetTy</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00213">CHG.h:213</a></div></div>
674
674
  <div class="ttc" id="classSVF_1_1CHGBuilder_html_ab3471cc9afba5976c7e5fbd07dfb22dc"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#ab3471cc9afba5976c7e5fbd07dfb22dc">SVF::CHGBuilder::chg</a></div><div class="ttdeci">CHGraph * chg</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8h_source.html#l00040">CHGBuilder.h:40</a></div></div>
675
675
  <div class="ttc" id="classSVF_1_1CHGraph_html_a7ef9982d89a4932883bd58bc49ad9986"><div class="ttname"><a href="classSVF_1_1CHGraph.html#a7ef9982d89a4932883bd58bc49ad9986">SVF::CHGraph::csToClassesMap</a></div><div class="ttdeci">CallSiteToCHNodesMap csToClassesMap</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00319">CHG.h:319</a></div></div>
676
- <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a3bed7bc0a0ae580841ca049f91690ff7"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a3bed7bc0a0ae580841ca049f91690ff7">SVF::cppUtil::getClassNameOfThisPtr</a></div><div class="ttdeci">std::string getClassNameOfThisPtr(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00520">CPPUtil.cpp:520</a></div></div>
676
+ <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a3bed7bc0a0ae580841ca049f91690ff7"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a3bed7bc0a0ae580841ca049f91690ff7">SVF::cppUtil::getClassNameOfThisPtr</a></div><div class="ttdeci">std::string getClassNameOfThisPtr(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00524">CPPUtil.cpp:524</a></div></div>
677
677
  <div class="ttc" id="classSVF_1_1CHGBuilder_html_a444dba7f18bee07a6cad51f88bb63e30"><div class="ttname"><a href="classSVF_1_1CHGBuilder.html#a444dba7f18bee07a6cad51f88bb63e30">SVF::CHGBuilder::getInstancesAndDescendants</a></div><div class="ttdeci">const CHGraph::CHNodeSetTy &amp; getInstancesAndDescendants(const std::string className)</div><div class="ttdef"><b>Definition:</b> <a href="CHGBuilder_8cpp_source.html#l00304">CHGBuilder.cpp:304</a></div></div>
678
678
  </div><!-- fragment -->
679
679
  </div>
@@ -830,7 +830,7 @@ Additional Inherited Members</h2></td></tr>
830
830
  <p>Implements <a class="el" href="classSVF_1_1CommonCHGraph.html#aae511b2ee7c2c7ea7be70c7884e92021">SVF::CommonCHGraph</a>.</p>
831
831
 
832
832
  <p class="definition">Definition at line <a class="el" href="CHG_8cpp_source.html#l00100">100</a> of file <a class="el" href="CHG_8cpp_source.html">CHG.cpp</a>.</p>
833
- <div class="fragment"><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;{</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keywordtype">size_t</span> idx = <a class="code" href="namespaceSVF_1_1cppUtil.html#ad2a35c1d2e357690e634bb250a68795d">cppUtil::getVCallIdx</a>(cs);</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordtype">string</span> funName = <a class="code" href="namespaceSVF_1_1cppUtil.html#a0a67c31dcc44784b09dca54b4b7c624a">cppUtil::getFunNameOfVCallSite</a>(cs);</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a> *vt : vtbls)</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; {</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *<a class="code" href="cJSON_8cpp.html#ad00efb41ca386db28bacc7aefe79535c">child</a> = <a class="code" href="classSVF_1_1CHGraph.html#a7beec68a60036c93a741a7152e8198b6">getNode</a>(<a class="code" href="namespaceSVF_1_1cppUtil.html#ad83c097f1c77cdf52fc219ef07ee0b1a">cppUtil::getClassNameFromVtblObj</a>(vt));</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordflow">if</span> (child == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <a class="code" href="classSVF_1_1CHNode.html#aa4af6538c9994ec54a7b82691f846a31">CHNode::FuncVector</a> vfns;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; child-&gt;<a class="code" href="classSVF_1_1CHNode.html#a1abfdc91ec77cab40d6894f471f0733d">getVirtualFunctions</a>(idx, vfns);</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordflow">for</span> (CHNode::FuncVector::const_iterator fit = vfns.begin(),</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; feit = vfns.end(); fit != feit; ++fit)</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; {</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* callee = *fit;</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keywordflow">if</span> (cs.<a class="code" href="classSVF_1_1CallSite.html#a145676880fce313b4634d14118476c27">arg_size</a>() == callee-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#a3757cd3ae587eaca488fa4cd8ad3967d">arg_size</a>() ||</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; (cs.<a class="code" href="classSVF_1_1CallSite.html#ad0040f4b7953b509059223d1d52c203f">getFunctionType</a>()-&gt;isVarArg() &amp;&amp; callee-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#a3c1fa59deae39c75c72c97e47326d982">isVarArg</a>()))</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; {</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="comment">// if argument types do not match</span></div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="comment">// skip this one</span></div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="CHG_8cpp.html#a35a17be62be820e4de41ba53a7f7a905">checkArgTypes</a>(cs, callee-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html">cppUtil::DemangledName</a> dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">cppUtil::demangle</a>(callee-&gt;<a class="code" href="classSVF_1_1SVFValue.html#a2409c01221b9a6632655cee43d1b35e4">getName</a>());</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordtype">string</span> calleeName = dname.<a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html#a1dd17b240663bc9412adefde82385e02">funcName</a>;</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;<span class="comment"> * The compiler will add some special suffix (e.g.,</span></div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;<span class="comment"> * &quot;[abi:cxx11]&quot;) to the end of some virtual function:</span></div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;<span class="comment"> * In dealII</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;<span class="comment"> * function: FE_Q&lt;3&gt;::get_name</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;<span class="comment"> * will be mangled as: _ZNK4FE_QILi3EE8get_nameB5cxx11Ev</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160;<span class="comment"> * after demangling: FE_Q&lt;3&gt;::get_name[abi:cxx11]</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160;<span class="comment"> * The special suffix (&quot;[abi:cxx11]&quot;) needs to be removed</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> suffix(<span class="stringliteral">&quot;[abi:cxx11]&quot;</span>);</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keywordtype">size_t</span> suffix_pos = calleeName.rfind(suffix);</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="keywordflow">if</span> (suffix_pos != string::npos)</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; calleeName.erase(suffix_pos, suffix.size());</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;<span class="comment"> * if we can&#39;t get the function name of a virtual callsite, all virtual</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160;<span class="comment"> * functions calculated by idx will be valid</span></div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keywordflow">if</span> (funName.size() == 0)</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; {</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; virtualFunctions.insert(callee);</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; }</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (funName[0] == <span class="charliteral">&#39;~&#39;</span>)</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;<span class="comment"> * if the virtual callsite is calling a destructor, then all</span></div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;<span class="comment"> * destructors in the ch will be valid</span></div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160;<span class="comment"> * class A { virtual ~A(){} };</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;<span class="comment"> * class B: public A { virtual ~B(){} };</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;<span class="comment"> * int main() {</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160;<span class="comment"> * A *a = new B;</span></div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160;<span class="comment"> * delete a; /// the function name of this virtual callsite is ~A()</span></div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;<span class="comment"> * }</span></div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keywordflow">if</span> (calleeName[0] == <span class="charliteral">&#39;~&#39;</span>)</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; {</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; virtualFunctions.insert(callee);</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; }</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; }</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; {</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;<span class="comment"> * for other virtual function calls, the function name of the callsite</span></div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;<span class="comment"> * and the function name of the target callee should match exactly</span></div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">if</span> (funName.compare(calleeName) == 0)</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; {</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; virtualFunctions.insert(callee);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; }</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; }</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; }</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; }</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; }</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;}</div><div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad2a35c1d2e357690e634bb250a68795d"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad2a35c1d2e357690e634bb250a68795d">SVF::cppUtil::getVCallIdx</a></div><div class="ttdeci">u64_t getVCallIdx(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00391">CPPUtil.cpp:391</a></div></div>
833
+ <div class="fragment"><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;{</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keywordtype">size_t</span> idx = <a class="code" href="namespaceSVF_1_1cppUtil.html#ad2a35c1d2e357690e634bb250a68795d">cppUtil::getVCallIdx</a>(cs);</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordtype">string</span> funName = <a class="code" href="namespaceSVF_1_1cppUtil.html#a0a67c31dcc44784b09dca54b4b7c624a">cppUtil::getFunNameOfVCallSite</a>(cs);</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a> *vt : vtbls)</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; {</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1CHNode.html">CHNode</a> *<a class="code" href="cJSON_8cpp.html#ad00efb41ca386db28bacc7aefe79535c">child</a> = <a class="code" href="classSVF_1_1CHGraph.html#a7beec68a60036c93a741a7152e8198b6">getNode</a>(<a class="code" href="namespaceSVF_1_1cppUtil.html#ad83c097f1c77cdf52fc219ef07ee0b1a">cppUtil::getClassNameFromVtblObj</a>(vt));</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; <span class="keywordflow">if</span> (child == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <a class="code" href="classSVF_1_1CHNode.html#aa4af6538c9994ec54a7b82691f846a31">CHNode::FuncVector</a> vfns;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; child-&gt;<a class="code" href="classSVF_1_1CHNode.html#a1abfdc91ec77cab40d6894f471f0733d">getVirtualFunctions</a>(idx, vfns);</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordflow">for</span> (CHNode::FuncVector::const_iterator fit = vfns.begin(),</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; feit = vfns.end(); fit != feit; ++fit)</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; {</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* callee = *fit;</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keywordflow">if</span> (cs.<a class="code" href="classSVF_1_1CallSite.html#a145676880fce313b4634d14118476c27">arg_size</a>() == callee-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#a3757cd3ae587eaca488fa4cd8ad3967d">arg_size</a>() ||</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; (cs.<a class="code" href="classSVF_1_1CallSite.html#ad0040f4b7953b509059223d1d52c203f">getFunctionType</a>()-&gt;isVarArg() &amp;&amp; callee-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#a3c1fa59deae39c75c72c97e47326d982">isVarArg</a>()))</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; {</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="comment">// if argument types do not match</span></div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="comment">// skip this one</span></div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="CHG_8cpp.html#a35a17be62be820e4de41ba53a7f7a905">checkArgTypes</a>(cs, callee-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html">cppUtil::DemangledName</a> dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">cppUtil::demangle</a>(callee-&gt;<a class="code" href="classSVF_1_1SVFValue.html#a2409c01221b9a6632655cee43d1b35e4">getName</a>());</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordtype">string</span> calleeName = dname.<a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html#a1dd17b240663bc9412adefde82385e02">funcName</a>;</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;<span class="comment"> * The compiler will add some special suffix (e.g.,</span></div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;<span class="comment"> * &quot;[abi:cxx11]&quot;) to the end of some virtual function:</span></div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160;<span class="comment"> * In dealII</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160;<span class="comment"> * function: FE_Q&lt;3&gt;::get_name</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;<span class="comment"> * will be mangled as: _ZNK4FE_QILi3EE8get_nameB5cxx11Ev</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160;<span class="comment"> * after demangling: FE_Q&lt;3&gt;::get_name[abi:cxx11]</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160;<span class="comment"> * The special suffix (&quot;[abi:cxx11]&quot;) needs to be removed</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> suffix(<span class="stringliteral">&quot;[abi:cxx11]&quot;</span>);</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keywordtype">size_t</span> suffix_pos = calleeName.rfind(suffix);</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; <span class="keywordflow">if</span> (suffix_pos != string::npos)</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; calleeName.erase(suffix_pos, suffix.size());</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160;</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160;<span class="comment"> * if we can&#39;t get the function name of a virtual callsite, all virtual</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160;<span class="comment"> * functions calculated by idx will be valid</span></div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keywordflow">if</span> (funName.size() == 0)</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; {</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; virtualFunctions.insert(callee);</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; }</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (funName[0] == <span class="charliteral">&#39;~&#39;</span>)</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;<span class="comment"> * if the virtual callsite is calling a destructor, then all</span></div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;<span class="comment"> * destructors in the ch will be valid</span></div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160;<span class="comment"> * class A { virtual ~A(){} };</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;<span class="comment"> * class B: public A { virtual ~B(){} };</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160;<span class="comment"> * int main() {</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160;<span class="comment"> * A *a = new B;</span></div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160;<span class="comment"> * delete a; /// the function name of this virtual callsite is ~A()</span></div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;<span class="comment"> * }</span></div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keywordflow">if</span> (calleeName[0] == <span class="charliteral">&#39;~&#39;</span>)</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; {</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; virtualFunctions.insert(callee);</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; }</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; }</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; {</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;<span class="comment"> * for other virtual function calls, the function name of the callsite</span></div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160;<span class="comment"> * and the function name of the target callee should match exactly</span></div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">if</span> (funName.compare(calleeName) == 0)</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160; {</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; virtualFunctions.insert(callee);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; }</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; }</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; }</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; }</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; }</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;}</div><div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad2a35c1d2e357690e634bb250a68795d"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad2a35c1d2e357690e634bb250a68795d">SVF::cppUtil::getVCallIdx</a></div><div class="ttdeci">u64_t getVCallIdx(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00395">CPPUtil.cpp:395</a></div></div>
834
834
  <div class="ttc" id="classSVF_1_1CHNode_html"><div class="ttname"><a href="classSVF_1_1CHNode.html">SVF::CHNode</a></div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00104">CHG.h:104</a></div></div>
835
835
  <div class="ttc" id="structSVF_1_1cppUtil_1_1DemangledName_html"><div class="ttname"><a href="structSVF_1_1cppUtil_1_1DemangledName.html">SVF::cppUtil::DemangledName</a></div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8h_source.html#l00046">CPPUtil.h:46</a></div></div>
836
836
  <div class="ttc" id="classSVF_1_1CHGraph_html_a7beec68a60036c93a741a7152e8198b6"><div class="ttname"><a href="classSVF_1_1CHGraph.html#a7beec68a60036c93a741a7152e8198b6">SVF::CHGraph::getNode</a></div><div class="ttdeci">CHNode * getNode(const std::string name) const</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8cpp_source.html#l00088">CHG.cpp:88</a></div></div>
@@ -839,7 +839,7 @@ Additional Inherited Members</h2></td></tr>
839
839
  <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>
840
840
  <div class="ttc" id="classSVF_1_1CHNode_html_a1abfdc91ec77cab40d6894f471f0733d"><div class="ttname"><a href="classSVF_1_1CHNode.html#a1abfdc91ec77cab40d6894f471f0733d">SVF::CHNode::getVirtualFunctions</a></div><div class="ttdeci">void getVirtualFunctions(u32_t idx, FuncVector &amp;virtualFunctions) const</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8cpp_source.html#l00186">CHG.cpp:186</a></div></div>
841
841
  <div class="ttc" id="classSVF_1_1SVFFunction_html_a3757cd3ae587eaca488fa4cd8ad3967d"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#a3757cd3ae587eaca488fa4cd8ad3967d">SVF::SVFFunction::arg_size</a></div><div class="ttdeci">u32_t arg_size() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00156">BasicTypes.h:156</a></div></div>
842
- <div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad83c097f1c77cdf52fc219ef07ee0b1a"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad83c097f1c77cdf52fc219ef07ee0b1a">SVF::cppUtil::getClassNameFromVtblObj</a></div><div class="ttdeci">std::string getClassNameFromVtblObj(const Value *value)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00434">CPPUtil.cpp:434</a></div></div>
842
+ <div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad83c097f1c77cdf52fc219ef07ee0b1a"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad83c097f1c77cdf52fc219ef07ee0b1a">SVF::cppUtil::getClassNameFromVtblObj</a></div><div class="ttdeci">std::string getClassNameFromVtblObj(const Value *value)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00438">CPPUtil.cpp:438</a></div></div>
843
843
  <div class="ttc" id="structSVF_1_1cppUtil_1_1DemangledName_html_a1dd17b240663bc9412adefde82385e02"><div class="ttname"><a href="structSVF_1_1cppUtil_1_1DemangledName.html#a1dd17b240663bc9412adefde82385e02">SVF::cppUtil::DemangledName::funcName</a></div><div class="ttdeci">std::string funcName</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8h_source.html#l00049">CPPUtil.h:49</a></div></div>
844
844
  <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="Util_2BasicTypes_8h_source.html#l00074">BasicTypes.h:74</a></div></div>
845
845
  <div class="ttc" id="classSVF_1_1CallSite_html_a145676880fce313b4634d14118476c27"><div class="ttname"><a href="classSVF_1_1CallSite.html#a145676880fce313b4634d14118476c27">SVF::CallSite::arg_size</a></div><div class="ttdeci">unsigned arg_size() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00314">BasicTypes.h:314</a></div></div>
@@ -847,7 +847,7 @@ Additional Inherited Members</h2></td></tr>
847
847
  <div class="ttc" id="classSVF_1_1SVFFunction_html_ac4ae917ae35ac6fca652fe2dd90a8ac2"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">SVF::SVFFunction::getLLVMFun</a></div><div class="ttdeci">Function * getLLVMFun() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00140">BasicTypes.h:140</a></div></div>
848
848
  <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a1007c092efaeae41002efd91b803a7f6"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">SVF::cppUtil::demangle</a></div><div class="ttdeci">struct DemangledName demangle(const std::string &amp;name)</div></div>
849
849
  <div class="ttc" id="CHG_8cpp_html_a35a17be62be820e4de41ba53a7f7a905"><div class="ttname"><a href="CHG_8cpp.html#a35a17be62be820e4de41ba53a7f7a905">checkArgTypes</a></div><div class="ttdeci">static bool checkArgTypes(CallSite cs, const Function *fn)</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8cpp_source.html#l00052">CHG.cpp:52</a></div></div>
850
- <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a0a67c31dcc44784b09dca54b4b7c624a"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a0a67c31dcc44784b09dca54b4b7c624a">SVF::cppUtil::getFunNameOfVCallSite</a></div><div class="ttdeci">std::string getFunNameOfVCallSite(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00547">CPPUtil.cpp:547</a></div></div>
850
+ <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a0a67c31dcc44784b09dca54b4b7c624a"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a0a67c31dcc44784b09dca54b4b7c624a">SVF::cppUtil::getFunNameOfVCallSite</a></div><div class="ttdeci">std::string getFunNameOfVCallSite(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00551">CPPUtil.cpp:551</a></div></div>
851
851
  <div class="ttc" id="classSVF_1_1SVFFunction_html_a3c1fa59deae39c75c72c97e47326d982"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#a3c1fa59deae39c75c72c97e47326d982">SVF::SVFFunction::isVarArg</a></div><div class="ttdeci">bool isVarArg() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00166">BasicTypes.h:166</a></div></div>
852
852
  <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>
853
853
  <div class="ttc" id="classSVF_1_1CallSite_html_ad0040f4b7953b509059223d1d52c203f"><div class="ttname"><a href="classSVF_1_1CallSite.html#ad0040f4b7953b509059223d1d52c203f">SVF::CallSite::getFunctionType</a></div><div class="ttdeci">FunctionType * getFunctionType() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00342">BasicTypes.h:342</a></div></div>
@@ -1244,7 +1244,7 @@ Additional Inherited Members</h2></td></tr>
1244
1244
  <p>Implements <a class="el" href="classSVF_1_1CommonCHGraph.html#aae511b2ee7c2c7ea7be70c7884e92021">SVF::CommonCHGraph</a>.</p>
1245
1245
 
1246
1246
  <p class="definition">Definition at line <a class="el" href="DCHG_8cpp_source.html#l00580">580</a> of file <a class="el" href="DCHG_8cpp_source.html">DCHG.cpp</a>.</p>
1247
- <div class="fragment"><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160;{</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; <span class="keywordtype">size_t</span> idx = <a class="code" href="namespaceSVF_1_1cppUtil.html#ad2a35c1d2e357690e634bb250a68795d">cppUtil::getVCallIdx</a>(cs);</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> funName = <a class="code" href="namespaceSVF_1_1cppUtil.html#a0a67c31dcc44784b09dca54b4b7c624a">cppUtil::getFunNameOfVCallSite</a>(cs);</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a> *vtbl : vtbls)</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; {</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; assert(<a class="code" href="classSVF_1_1DCHGraph.html#aaa63715e67ade7711a0366eb7559b708">vtblToTypeMap</a>.find(vtbl) != <a class="code" href="classSVF_1_1DCHGraph.html#aaa63715e67ade7711a0366eb7559b708">vtblToTypeMap</a>.end() &amp;&amp; <span class="stringliteral">&quot;floating vtbl&quot;</span>);</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <a class="code" href="classSVF_1_1DCHGraph.html#aaa63715e67ade7711a0366eb7559b708">vtblToTypeMap</a>[vtbl];</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; assert(<a class="code" href="classSVF_1_1DCHGraph.html#a58341e23c1dc2b3e7fce190ed16a8a25">hasNode</a>(type) &amp;&amp; <span class="stringliteral">&quot;trying to get vtbl for type not in graph&quot;</span>);</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a96c68bbb5ee5e939158ce0b67da2c61d">getNode</a>(type);</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; std::vector&lt;std::vector&lt;const Function *&gt;&gt; allVfns = node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#a0669b995c4fe72f206154f5cf6889fe8">getVfnVectors</a>();</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="keywordflow">for</span> (std::vector&lt;const Function *&gt; vfnV : allVfns)</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; {</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; <span class="comment">// We only care about any virtual function corresponding to idx.</span></div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="keywordflow">if</span> (idx &gt;= vfnV.size())</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; {</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; }</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160;</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *callee = vfnV[idx];</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="comment">// Practically a copy of that in lib/MemoryModel/CHA.cpp</span></div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; <span class="keywordflow">if</span> (cs.<a class="code" href="classSVF_1_1CallSite.html#a145676880fce313b4634d14118476c27">arg_size</a>() == callee-&gt;arg_size() || (cs.<a class="code" href="classSVF_1_1CallSite.html#ad0040f4b7953b509059223d1d52c203f">getFunctionType</a>()-&gt;isVarArg() &amp;&amp; callee-&gt;isVarArg()))</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; {</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html">cppUtil::DemangledName</a> dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">cppUtil::demangle</a>(callee-&gt;getName().str());</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> calleeName = dname.<a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html#a1dd17b240663bc9412adefde82385e02">funcName</a>;</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160;</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160;<span class="comment"> * The compiler will add some special suffix (e.g.,</span></div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160;<span class="comment"> * &quot;[abi:cxx11]&quot;) to the end of some virtual function:</span></div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160;<span class="comment"> * In dealII</span></div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160;<span class="comment"> * function: FE_Q&lt;3&gt;::get_name</span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160;<span class="comment"> * will be mangled as: _ZNK4FE_QILi3EE8get_nameB5cxx11Ev</span></div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160;<span class="comment"> * after demangling: FE_Q&lt;3&gt;::get_name[abi:cxx11]</span></div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160;<span class="comment"> * The special suffix (&quot;[abi:cxx11]&quot;) needs to be removed</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> suffix(<span class="stringliteral">&quot;[abi:cxx11]&quot;</span>);</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; <span class="keywordtype">size_t</span> suffixPos = calleeName.rfind(suffix);</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <span class="keywordflow">if</span> (suffixPos != std::string::npos)</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; {</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; calleeName.erase(suffixPos, suffix.size());</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; }</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160;</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160;<span class="comment"> * if we can&#39;t get the function name of a virtual callsite, all virtual</span></div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160;<span class="comment"> * functions corresponding to idx will be valid</span></div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <span class="keywordflow">if</span> (funName.size() == 0)</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; {</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1SVFUtil.html#aa09c2b313ff1c1abcc1e5cb3f9ef46a5">SVFUtil::getFunction</a>(callee-&gt;getName().str()));</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; }</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (funName[0] == <span class="charliteral">&#39;~&#39;</span>)</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; {</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160;<span class="comment"> * if the virtual callsite is calling a destructor, then all</span></div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160;<span class="comment"> * destructors in the ch will be valid</span></div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160;<span class="comment"> * class A { virtual ~A(){} };</span></div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160;<span class="comment"> * class B: public A { virtual ~B(){} };</span></div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160;<span class="comment"> * int main() {</span></div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160;<span class="comment"> * A *a = new B;</span></div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160;<span class="comment"> * delete a; /// the function name of this virtual callsite is ~A()</span></div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160;<span class="comment"> * }</span></div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; <span class="keywordflow">if</span> (calleeName[0] == <span class="charliteral">&#39;~&#39;</span>)</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; {</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1SVFUtil.html#aa09c2b313ff1c1abcc1e5cb3f9ef46a5">SVFUtil::getFunction</a>(callee-&gt;getName().str()));</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; }</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; }</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; {</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160;<span class="comment"> * For other virtual function calls, the function name of the callsite</span></div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160;<span class="comment"> * and the function name of the target callee should match exactly</span></div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <span class="keywordflow">if</span> (funName.compare(calleeName) == 0)</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; {</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1SVFUtil.html#aa09c2b313ff1c1abcc1e5cb3f9ef46a5">SVFUtil::getFunction</a>(callee-&gt;getName().str()));</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; }</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; }</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; }</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; }</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; }</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160;}</div><div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad2a35c1d2e357690e634bb250a68795d"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad2a35c1d2e357690e634bb250a68795d">SVF::cppUtil::getVCallIdx</a></div><div class="ttdeci">u64_t getVCallIdx(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00391">CPPUtil.cpp:391</a></div></div>
1247
+ <div class="fragment"><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160;{</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; <span class="keywordtype">size_t</span> idx = <a class="code" href="namespaceSVF_1_1cppUtil.html#ad2a35c1d2e357690e634bb250a68795d">cppUtil::getVCallIdx</a>(cs);</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> funName = <a class="code" href="namespaceSVF_1_1cppUtil.html#a0a67c31dcc44784b09dca54b4b7c624a">cppUtil::getFunNameOfVCallSite</a>(cs);</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a67f3f86344f028cacfbeb08caaf7bb0f">GlobalValue</a> *vtbl : vtbls)</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; {</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; assert(<a class="code" href="classSVF_1_1DCHGraph.html#aaa63715e67ade7711a0366eb7559b708">vtblToTypeMap</a>.find(vtbl) != <a class="code" href="classSVF_1_1DCHGraph.html#aaa63715e67ade7711a0366eb7559b708">vtblToTypeMap</a>.end() &amp;&amp; <span class="stringliteral">&quot;floating vtbl&quot;</span>);</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <a class="code" href="classSVF_1_1DCHGraph.html#aaa63715e67ade7711a0366eb7559b708">vtblToTypeMap</a>[vtbl];</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; assert(<a class="code" href="classSVF_1_1DCHGraph.html#a58341e23c1dc2b3e7fce190ed16a8a25">hasNode</a>(type) &amp;&amp; <span class="stringliteral">&quot;trying to get vtbl for type not in graph&quot;</span>);</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a96c68bbb5ee5e939158ce0b67da2c61d">getNode</a>(type);</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; std::vector&lt;std::vector&lt;const Function *&gt;&gt; allVfns = node-&gt;<a class="code" href="classSVF_1_1DCHNode.html#a0669b995c4fe72f206154f5cf6889fe8">getVfnVectors</a>();</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160; <span class="keywordflow">for</span> (std::vector&lt;const Function *&gt; vfnV : allVfns)</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; {</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>&#160; <span class="comment">// We only care about any virtual function corresponding to idx.</span></div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="keywordflow">if</span> (idx &gt;= vfnV.size())</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; {</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; }</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160;</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *callee = vfnV[idx];</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <span class="comment">// Practically a copy of that in lib/MemoryModel/CHA.cpp</span></div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; <span class="keywordflow">if</span> (cs.<a class="code" href="classSVF_1_1CallSite.html#a145676880fce313b4634d14118476c27">arg_size</a>() == callee-&gt;arg_size() || (cs.<a class="code" href="classSVF_1_1CallSite.html#ad0040f4b7953b509059223d1d52c203f">getFunctionType</a>()-&gt;isVarArg() &amp;&amp; callee-&gt;isVarArg()))</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160; {</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; <a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html">cppUtil::DemangledName</a> dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">cppUtil::demangle</a>(callee-&gt;getName().str());</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160; <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> calleeName = dname.<a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html#a1dd17b240663bc9412adefde82385e02">funcName</a>;</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160;</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160;<span class="comment"> * The compiler will add some special suffix (e.g.,</span></div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160;<span class="comment"> * &quot;[abi:cxx11]&quot;) to the end of some virtual function:</span></div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160;<span class="comment"> * In dealII</span></div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160;<span class="comment"> * function: FE_Q&lt;3&gt;::get_name</span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160;<span class="comment"> * will be mangled as: _ZNK4FE_QILi3EE8get_nameB5cxx11Ev</span></div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160;<span class="comment"> * after demangling: FE_Q&lt;3&gt;::get_name[abi:cxx11]</span></div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160;<span class="comment"> * The special suffix (&quot;[abi:cxx11]&quot;) needs to be removed</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> suffix(<span class="stringliteral">&quot;[abi:cxx11]&quot;</span>);</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; <span class="keywordtype">size_t</span> suffixPos = calleeName.rfind(suffix);</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; <span class="keywordflow">if</span> (suffixPos != std::string::npos)</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; {</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; calleeName.erase(suffixPos, suffix.size());</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; }</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>&#160;</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160;<span class="comment"> * if we can&#39;t get the function name of a virtual callsite, all virtual</span></div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160;<span class="comment"> * functions corresponding to idx will be valid</span></div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <span class="keywordflow">if</span> (funName.size() == 0)</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; {</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1SVFUtil.html#aa09c2b313ff1c1abcc1e5cb3f9ef46a5">SVFUtil::getFunction</a>(callee-&gt;getName().str()));</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; }</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (funName[0] == <span class="charliteral">&#39;~&#39;</span>)</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; {</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160;<span class="comment"> * if the virtual callsite is calling a destructor, then all</span></div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160;<span class="comment"> * destructors in the ch will be valid</span></div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160;<span class="comment"> * class A { virtual ~A(){} };</span></div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160;<span class="comment"> * class B: public A { virtual ~B(){} };</span></div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160;<span class="comment"> * int main() {</span></div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160;<span class="comment"> * A *a = new B;</span></div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160;<span class="comment"> * delete a; /// the function name of this virtual callsite is ~A()</span></div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160;<span class="comment"> * }</span></div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; <span class="keywordflow">if</span> (calleeName[0] == <span class="charliteral">&#39;~&#39;</span>)</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; {</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1SVFUtil.html#aa09c2b313ff1c1abcc1e5cb3f9ef46a5">SVFUtil::getFunction</a>(callee-&gt;getName().str()));</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; }</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; }</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; {</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; <span class="comment">/*</span></div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160;<span class="comment"> * For other virtual function calls, the function name of the callsite</span></div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160;<span class="comment"> * and the function name of the target callee should match exactly</span></div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <span class="keywordflow">if</span> (funName.compare(calleeName) == 0)</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; {</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1SVFUtil.html#aa09c2b313ff1c1abcc1e5cb3f9ef46a5">SVFUtil::getFunction</a>(callee-&gt;getName().str()));</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; }</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; }</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; }</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; }</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; }</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160;}</div><div class="ttc" id="namespaceSVF_1_1cppUtil_html_ad2a35c1d2e357690e634bb250a68795d"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#ad2a35c1d2e357690e634bb250a68795d">SVF::cppUtil::getVCallIdx</a></div><div class="ttdeci">u64_t getVCallIdx(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00395">CPPUtil.cpp:395</a></div></div>
1248
1248
  <div class="ttc" id="structSVF_1_1cppUtil_1_1DemangledName_html"><div class="ttname"><a href="structSVF_1_1cppUtil_1_1DemangledName.html">SVF::cppUtil::DemangledName</a></div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8h_source.html#l00046">CPPUtil.h:46</a></div></div>
1249
1249
  <div class="ttc" id="classSVF_1_1DCHGraph_html_aaa63715e67ade7711a0366eb7559b708"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#aaa63715e67ade7711a0366eb7559b708">SVF::DCHGraph::vtblToTypeMap</a></div><div class="ttdeci">Map&lt; const GlobalValue *, const DIType * &gt; vtblToTypeMap</div><div class="ttdoc">Maps VTables to the DIType associated with them. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00360">DCHG.h:360</a></div></div>
1250
1250
  <div class="ttc" id="classSVF_1_1DCHNode_html_a0669b995c4fe72f206154f5cf6889fe8"><div class="ttname"><a href="classSVF_1_1DCHNode.html#a0669b995c4fe72f206154f5cf6889fe8">SVF::DCHNode::getVfnVectors</a></div><div class="ttdeci">const std::vector&lt; std::vector&lt; const Function * &gt; &gt; &amp; getVfnVectors(void) const</div><div class="ttdoc">Returns the vector of virtual function vectors. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00175">DCHG.h:175</a></div></div>
@@ -1258,7 +1258,7 @@ Additional Inherited Members</h2></td></tr>
1258
1258
  <div class="ttc" id="classSVF_1_1CallSite_html_a145676880fce313b4634d14118476c27"><div class="ttname"><a href="classSVF_1_1CallSite.html#a145676880fce313b4634d14118476c27">SVF::CallSite::arg_size</a></div><div class="ttdeci">unsigned arg_size() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00314">BasicTypes.h:314</a></div></div>
1259
1259
  <div class="ttc" id="classSVF_1_1DCHGraph_html_a58341e23c1dc2b3e7fce190ed16a8a25"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a58341e23c1dc2b3e7fce190ed16a8a25">SVF::DCHGraph::hasNode</a></div><div class="ttdeci">bool hasNode(const DIType *type)</div><div class="ttdoc">Checks if a node exists for type. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00417">DCHG.h:417</a></div></div>
1260
1260
  <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a1007c092efaeae41002efd91b803a7f6"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">SVF::cppUtil::demangle</a></div><div class="ttdeci">struct DemangledName demangle(const std::string &amp;name)</div></div>
1261
- <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a0a67c31dcc44784b09dca54b4b7c624a"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a0a67c31dcc44784b09dca54b4b7c624a">SVF::cppUtil::getFunNameOfVCallSite</a></div><div class="ttdeci">std::string getFunNameOfVCallSite(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00547">CPPUtil.cpp:547</a></div></div>
1261
+ <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a0a67c31dcc44784b09dca54b4b7c624a"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a0a67c31dcc44784b09dca54b4b7c624a">SVF::cppUtil::getFunNameOfVCallSite</a></div><div class="ttdeci">std::string getFunNameOfVCallSite(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00551">CPPUtil.cpp:551</a></div></div>
1262
1262
  <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>
1263
1263
  <div class="ttc" id="classSVF_1_1CallSite_html_ad0040f4b7953b509059223d1d52c203f"><div class="ttname"><a href="classSVF_1_1CallSite.html#ad0040f4b7953b509059223d1d52c203f">SVF::CallSite::getFunctionType</a></div><div class="ttdeci">FunctionType * getFunctionType() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00342">BasicTypes.h:342</a></div></div>
1264
1264
  <div class="ttc" id="namespaceSVF_html_ad127b0ad478640ede3d426e3a58d2632"><div class="ttname"><a href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">SVF::DIType</a></div><div class="ttdeci">llvm::DIType DIType</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00166">BasicTypes.h:166</a></div></div>
@@ -277,7 +277,7 @@ Additional Inherited Members</h2></td></tr>
277
277
  <div class="ttc" id="classSVF_1_1DDAClient_html_a21badb317a249bbb506615182671b32c"><div class="ttname"><a href="classSVF_1_1DDAClient.html#a21badb317a249bbb506615182671b32c">SVF::DDAClient::setPAG</a></div><div class="ttdeci">void setPAG(SVFIR *g)</div><div class="ttdoc">Set SVFIR graph. </div><div class="ttdef"><b>Definition:</b> <a href="DDAClient_8h_source.html#l00079">DDAClient.h:79</a></div></div>
278
278
  <div class="ttc" id="classSVF_1_1DDAClient_html_a7c07d9527011ea0165038e3a112a85d8"><div class="ttname"><a href="classSVF_1_1DDAClient.html#a7c07d9527011ea0165038e3a112a85d8">SVF::DDAClient::addCandidate</a></div><div class="ttdeci">void addCandidate(NodeID id)</div><div class="ttdef"><b>Definition:</b> <a href="DDAClient_8h_source.html#l00105">DDAClient.h:105</a></div></div>
279
279
  <div class="ttc" id="classSVF_1_1IRGraph_html_aceb17dfbe137658625e16291127267d1"><div class="ttname"><a href="classSVF_1_1IRGraph.html#aceb17dfbe137658625e16291127267d1">SVF::IRGraph::hasValueNode</a></div><div class="ttdeci">bool hasValueNode(const Value *V)</div><div class="ttdef"><b>Definition:</b> <a href="IRGraph_8h_source.html#l00128">IRGraph.h:128</a></div></div>
280
- <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a3b00cc9770022f124958513bf1e52a05"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a3b00cc9770022f124958513bf1e52a05">SVF::cppUtil::getVCallVtblPtr</a></div><div class="ttdeci">const Value * getVCallVtblPtr(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00380">CPPUtil.cpp:380</a></div></div>
280
+ <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a3b00cc9770022f124958513bf1e52a05"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a3b00cc9770022f124958513bf1e52a05">SVF::cppUtil::getVCallVtblPtr</a></div><div class="ttdeci">const Value * getVCallVtblPtr(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00384">CPPUtil.cpp:384</a></div></div>
281
281
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a202de7ad2bea0311e2f75894c030e7a9"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">SVF::SVFUtil::getLLVMCallSite</a></div><div class="ttdeci">CallSite getLLVMCallSite(const Instruction *inst)</div><div class="ttdoc">Return LLVM callsite given a instruction. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00217">SVFUtil.h:217</a></div></div>
282
282
  <div class="ttc" id="classSVF_1_1DDAClient_html_a5e02fa3c1e6fbd5ed54038b1eaeeaaff"><div class="ttname"><a href="classSVF_1_1DDAClient.html#a5e02fa3c1e6fbd5ed54038b1eaeeaaff">SVF::DDAClient::pag</a></div><div class="ttdeci">SVFIR * pag</div><div class="ttdoc">SVFIR graph used by current DDA analysis. </div><div class="ttdef"><b>Definition:</b> <a href="DDAClient_8h_source.html#l00111">DDAClient.h:111</a></div></div>
283
283
  <div class="ttc" id="classSVF_1_1SVFIR_html_a2d2131128ceb3362b5dc89317cfd88a0"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a2d2131128ceb3362b5dc89317cfd88a0">SVF::SVFIR::getIndirectCallsites</a></div><div class="ttdeci">const CallSiteToFunPtrMap &amp; getIndirectCallsites() const</div><div class="ttdoc">Add/get indirect callsites. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#l00309">SVFIR.h:309</a></div></div>
@@ -807,7 +807,7 @@ Additional Inherited Members</h2></td></tr>
807
807
  <div class="ttc" id="classSVF_1_1TypeAnalysis_html_aa7fb5d1cd8e42058120758a990ed471d"><div class="ttname"><a href="classSVF_1_1TypeAnalysis.html#aa7fb5d1cd8e42058120758a990ed471d">SVF::TypeAnalysis::virtualCallSites</a></div><div class="ttdeci">Set&lt; CallSite &gt; virtualCallSites</div><div class="ttdef"><b>Definition:</b> <a href="TypeAnalysis_8h_source.html#l00081">TypeAnalysis.h:81</a></div></div>
808
808
  <div class="ttc" id="namespaceSVF_html_ad2b487757f1e1a1d81073120fc1d49c7"><div class="ttname"><a href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">SVF::VFunSet</a></div><div class="ttdeci">Set&lt; const SVFFunction * &gt; VFunSet</div><div class="ttdef"><b>Definition:</b> <a href="CHG_8h_source.html#l00047">CHG.h:47</a></div></div>
809
809
  <div class="ttc" id="classSVF_1_1IRGraph_html_aceb17dfbe137658625e16291127267d1"><div class="ttname"><a href="classSVF_1_1IRGraph.html#aceb17dfbe137658625e16291127267d1">SVF::IRGraph::hasValueNode</a></div><div class="ttdeci">bool hasValueNode(const Value *V)</div><div class="ttdef"><b>Definition:</b> <a href="IRGraph_8h_source.html#l00128">IRGraph.h:128</a></div></div>
810
- <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a3b00cc9770022f124958513bf1e52a05"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a3b00cc9770022f124958513bf1e52a05">SVF::cppUtil::getVCallVtblPtr</a></div><div class="ttdeci">const Value * getVCallVtblPtr(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00380">CPPUtil.cpp:380</a></div></div>
810
+ <div class="ttc" id="namespaceSVF_1_1cppUtil_html_a3b00cc9770022f124958513bf1e52a05"><div class="ttname"><a href="namespaceSVF_1_1cppUtil.html#a3b00cc9770022f124958513bf1e52a05">SVF::cppUtil::getVCallVtblPtr</a></div><div class="ttdeci">const Value * getVCallVtblPtr(CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="CPPUtil_8cpp_source.html#l00384">CPPUtil.cpp:384</a></div></div>
811
811
  <div class="ttc" id="classSVF_1_1CallICFGNode_html_a674753d5ca0fbe28674acb25291f2bcf"><div class="ttname"><a href="classSVF_1_1CallICFGNode.html#a674753d5ca0fbe28674acb25291f2bcf">SVF::CallICFGNode::getCallSite</a></div><div class="ttdeci">const Instruction * getCallSite() const</div><div class="ttdoc">Return callsite. </div><div class="ttdef"><b>Definition:</b> <a href="ICFGNode_8h_source.html#l00380">ICFGNode.h:380</a></div></div>
812
812
  <div class="ttc" id="classSVF_1_1CallICFGNode_html"><div class="ttname"><a href="classSVF_1_1CallICFGNode.html">SVF::CallICFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="ICFGNode_8h_source.html#l00363">ICFGNode.h:363</a></div></div>
813
813
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a202de7ad2bea0311e2f75894c030e7a9"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">SVF::SVFUtil::getLLVMCallSite</a></div><div class="ttdeci">CallSite getLLVMCallSite(const Instruction *inst)</div><div class="ttdoc">Return LLVM callsite given a instruction. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00217">SVFUtil.h:217</a></div></div>