svf-tools 1.0.500 → 1.0.503
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SVF-doxygen/html/html/ExtAPI_8cpp.html +79 -17
- package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +24 -22
- package/SVF-doxygen/html/html/ExtAPI_8h_source.html +19 -18
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +2 -1
- package/SVF-doxygen/html/html/SVFModule_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SVFUtil_8h_source.html +9 -9
- package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ExtAPI-members.html +24 -23
- package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +98 -66
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +9 -8
- package/SVF-doxygen/html/html/classSVF_1_1SVFModule.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +1 -1
- package/SVF-doxygen/html/html/functions_e.html +4 -1
- package/SVF-doxygen/html/html/functions_func_e.html +5 -2
- package/SVF-doxygen/html/html/functions_func_g.html +2 -2
- package/SVF-doxygen/html/html/functions_g.html +2 -2
- package/SVF-doxygen/html/html/functions_i.html +3 -3
- package/SVF-doxygen/html/html/functions_l.html +3 -3
- package/SVF-doxygen/html/html/functions_o.html +12 -12
- package/SVF-doxygen/html/html/functions_p.html +10 -8
- package/SVF-doxygen/html/html/functions_r.html +4 -2
- package/SVF-doxygen/html/html/functions_s.html +7 -7
- package/SVF-doxygen/html/html/functions_t.html +4 -4
- package/SVF-doxygen/html/html/functions_v.html +3 -3
- package/SVF-doxygen/html/html/functions_w.html +10 -6
- package/SVF-doxygen/html/html/globals_func_g.html +2 -2
- package/SVF-doxygen/html/html/globals_func_p.html +3 -0
- package/SVF-doxygen/html/html/globals_g.html +2 -2
- package/SVF-doxygen/html/html/globals_p.html +6 -3
- package/SVF-doxygen/html/html/globals_r.html +3 -3
- package/SVF-doxygen/html/html/globals_s.html +12 -12
- package/SVF-doxygen/html/html/search/all_10.js +7 -6
- package/SVF-doxygen/html/html/search/all_12.js +2 -2
- package/SVF-doxygen/html/html/search/all_13.js +9 -9
- package/SVF-doxygen/html/html/search/all_14.js +3 -3
- package/SVF-doxygen/html/html/search/all_15.js +1 -1
- package/SVF-doxygen/html/html/search/all_16.js +1 -1
- package/SVF-doxygen/html/html/search/all_17.js +1 -1
- package/SVF-doxygen/html/html/search/all_5.js +1 -1
- package/SVF-doxygen/html/html/search/all_7.js +4 -4
- package/SVF-doxygen/html/html/search/all_9.js +1 -1
- package/SVF-doxygen/html/html/search/all_c.js +1 -1
- package/SVF-doxygen/html/html/search/all_d.js +2 -2
- package/SVF-doxygen/html/html/search/all_e.js +1 -1
- package/SVF-doxygen/html/html/search/all_f.js +2 -2
- package/SVF-doxygen/html/html/search/functions_4.js +1 -0
- package/SVF-doxygen/html/html/search/functions_6.js +4 -4
- package/SVF-doxygen/html/html/search/functions_f.js +2 -1
- package/SVF-doxygen/html/html/search/variables_15.js +1 -1
- package/SVF-doxygen/html/html/search/variables_d.js +1 -1
- package/SVF-doxygen/html/html/search/variables_e.js +1 -1
- package/include/Util/ExtAPI.h +4 -2
- package/lib/SVF-FE/SVFIRBuilder.cpp +4 -4
- package/lib/SVF-FE/SymbolTableBuilder.cpp +1 -1
- package/lib/Util/ExtAPI.cpp +119 -98
- package/package.json +1 -1
|
@@ -1592,10 +1592,11 @@ Private Attributes</h2></td></tr>
|
|
|
1592
1592
|
<p>Return the object node offset according to GEP insn (V). Given a gep edge p = q + i, if "i" is a constant then we return its offset size otherwise if "i" is a variable determined by runtime, then it is a variant offset Return TRUE if the offset of this GEP insn is a constant. </p>
|
|
1593
1593
|
|
|
1594
1594
|
<p class="definition">Definition at line <a class="el" href="SVFIRBuilder_8cpp_source.html#l00241">241</a> of file <a class="el" href="SVFIRBuilder_8cpp_source.html">SVFIRBuilder.cpp</a>.</p>
|
|
1595
|
-
<div class="fragment"><div class="line"><a name="l00242"></a><span class="lineno"> 242</span> {</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(V);</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span> </div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="keyword">const</span> llvm::GEPOperator *gepOp = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<span class="keyword">const</span> llvm::GEPOperator>(V);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <a class="code" href="SVF-FE_2BasicTypes_8h.html#aa81a27b9c6b2a354437417162220fb14">DataLayout</a> * dataLayout = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a151fd7fb2b2ebe72af7c417defbb4f4d">getDataLayout</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getMainLLVMModule());</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  llvm::APInt byteOffset(dataLayout->getIndexSizeInBits(gepOp->getPointerAddressSpace()),0,<span class="keyword">true</span>);</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="keywordflow">if</span>(gepOp && dataLayout && gepOp->accumulateConstantOffset(*dataLayout,byteOffset))</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  {</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="comment">//s32_t bo = byteOffset.getSExtValue();</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  }</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span> </div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1generic__bridge__gep__type__iterator.html">bridge_gep_iterator</a> gi = <a class="code" href="namespacellvm.html#acfe99e9d441434240c79f6d76b73fe0a">bridge_gep_begin</a>(*V), ge = <a class="code" href="namespacellvm.html#a7cfc92a12082d69711c97bb3d1b99c48">bridge_gep_end</a>(*V);</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  gi != ge; ++gi)</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  {</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* gepTy = *gi;</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* offsetVal = gi.getOperand();</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  ls.<a class="code" href="classSVF_1_1LocationSet.html#aa2682a73f1ab2c32326fb4e0d5b3586b">addOffsetValue</a>(offsetVal, gepTy);</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> </div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="comment">//The int value of the current index operand</span></div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a> *op = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>>(offsetVal);</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> </div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="comment">// if Options::ModelConsts is disabled. We will treat whole array as one,</span></div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="comment">// but we can distinguish different field of an array of struct, e.g. s[1].f1 is differet from s[0].f2</span></div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">if</span>(SVFUtil::isa<ArrayType>(gepTy))</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  {</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keywordflow">if</span>(!op)</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <a class="code" href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">s32_t</a> idx = op->getSExtValue();</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a8fc42c2b02317621d6aeb3c5f52d3ee8">getFlattenedElemIdx</a>(gepTy, idx);</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  ls.<a class="code" href="classSVF_1_1LocationSet.html#abe990543374ebd8c1b3ee0d37c83eb8f">setFldIdx</a>(ls.<a class="code" href="classSVF_1_1LocationSet.html#a63c5c8e03b35e0d0cea94137d309c853">accumulateConstantFieldIdx</a>() + <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a>);</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  }</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2bf58575ac7d068e0f1a4cf953b9e6cb">StructType</a> *ST = SVFUtil::dyn_cast<StructType>(gepTy))</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  {</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(op && <span class="stringliteral">"non-const offset accessing a struct"</span>);</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="comment">//The actual index</span></div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <a class="code" href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">s32_t</a> idx = op->getSExtValue();</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> offset = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a8fc42c2b02317621d6aeb3c5f52d3ee8">getFlattenedElemIdx</a>(ST, idx);</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  ls.<a class="code" href="classSVF_1_1LocationSet.html#abe990543374ebd8c1b3ee0d37c83eb8f">setFldIdx</a>(ls.<a class="code" href="classSVF_1_1LocationSet.html#a63c5c8e03b35e0d0cea94137d309c853">accumulateConstantFieldIdx</a>() + <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a>);</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  }</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (gepTy->isSingleValueType())</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  {</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <span class="comment">// If it's a non-constant offset access</span></div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="comment">// If its point-to target is struct or array, it's likely an array accessing (%result = gep %struct.A* %a, i32 %non-const-index)</span></div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="comment">// If its point-to target is single value (pointer arithmetic), then it's a variant gep (%result = gep i8* %p, i32 %non-const-index)</span></div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="keywordflow">if</span>(!op && gepTy->isPointerTy() && <a class="code" href="namespaceSVF_1_1LLVMUtil.html#abba4111230f6009bbf50518ee36a9870">getPtrElementType</a>(SVFUtil::dyn_cast<PointerType>(gepTy))->isSingleValueType())</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> </div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="comment">// The actual index</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="comment">//s32_t idx = op->getSExtValue();</span></div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> </div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="comment">// For pointer arithmetic we ignore the byte offset</span></div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="comment">// consider using inferFieldIdxFromByteOffset(geopOp,dataLayout,ls,idx)?</span></div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="comment">// ls.setFldIdx(ls.accumulateConstantFieldIdx() + inferFieldIdxFromByteOffset(geopOp,idx));</span></div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  }</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  }</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span> }</div><div class="ttc" id="SVF-FE_2BasicTypes_8h_html_aa81a27b9c6b2a354437417162220fb14"><div class="ttname"><a href="SVF-FE_2BasicTypes_8h.html#aa81a27b9c6b2a354437417162220fb14">DataLayout</a></div><div class="ttdeci">llvm::DataLayout DataLayout</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00051">BasicTypes.h:51</a></div></div>
|
|
1595
|
+
<div class="fragment"><div class="line"><a name="l00242"></a><span class="lineno"> 242</span> {</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(V);</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span> </div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="keyword">const</span> llvm::GEPOperator *gepOp = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<span class="keyword">const</span> llvm::GEPOperator>(V);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <a class="code" href="SVF-FE_2BasicTypes_8h.html#aa81a27b9c6b2a354437417162220fb14">DataLayout</a> * dataLayout = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a151fd7fb2b2ebe72af7c417defbb4f4d">getDataLayout</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getMainLLVMModule());</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  llvm::APInt byteOffset(dataLayout->getIndexSizeInBits(gepOp->getPointerAddressSpace()),0,<span class="keyword">true</span>);</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="keywordflow">if</span>(gepOp && dataLayout && gepOp->accumulateConstantOffset(*dataLayout,byteOffset))</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  {</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="comment">//s32_t bo = byteOffset.getSExtValue();</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  }</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span> </div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1generic__bridge__gep__type__iterator.html">bridge_gep_iterator</a> gi = <a class="code" href="namespacellvm.html#acfe99e9d441434240c79f6d76b73fe0a">bridge_gep_begin</a>(*V), ge = <a class="code" href="namespacellvm.html#a7cfc92a12082d69711c97bb3d1b99c48">bridge_gep_end</a>(*V);</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  gi != ge; ++gi)</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  {</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a>* gepTy = *gi;</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a>* offsetVal = gi.getOperand();</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  ls.<a class="code" href="classSVF_1_1LocationSet.html#aa2682a73f1ab2c32326fb4e0d5b3586b">addOffsetValue</a>(offsetVal, gepTy);</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> </div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="comment">//The int value of the current index operand</span></div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a> *op = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>>(offsetVal);</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> </div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="comment">// if Options::ModelConsts is disabled. We will treat whole array as one,</span></div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="comment">// but we can distinguish different field of an array of struct, e.g. s[1].f1 is differet from s[0].f2</span></div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">if</span>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a146d286041987860388da3d8bc85cee3">ArrayType</a>* arrTy = SVFUtil::dyn_cast<ArrayType>(gepTy))</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  {</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keywordflow">if</span>(!op || (arrTy->getArrayNumElements() <= (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a>)op->getSExtValue()))</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <a class="code" href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">s32_t</a> idx = op->getSExtValue();</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a8fc42c2b02317621d6aeb3c5f52d3ee8">getFlattenedElemIdx</a>(arrTy, idx);</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  ls.<a class="code" href="classSVF_1_1LocationSet.html#abe990543374ebd8c1b3ee0d37c83eb8f">setFldIdx</a>(ls.<a class="code" href="classSVF_1_1LocationSet.html#a63c5c8e03b35e0d0cea94137d309c853">accumulateConstantFieldIdx</a>() + <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a>);</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  }</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2bf58575ac7d068e0f1a4cf953b9e6cb">StructType</a> *ST = SVFUtil::dyn_cast<StructType>(gepTy))</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  {</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(op && <span class="stringliteral">"non-const offset accessing a struct"</span>);</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="comment">//The actual index</span></div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <a class="code" href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">s32_t</a> idx = op->getSExtValue();</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> offset = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a8fc42c2b02317621d6aeb3c5f52d3ee8">getFlattenedElemIdx</a>(ST, idx);</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  ls.<a class="code" href="classSVF_1_1LocationSet.html#abe990543374ebd8c1b3ee0d37c83eb8f">setFldIdx</a>(ls.<a class="code" href="classSVF_1_1LocationSet.html#a63c5c8e03b35e0d0cea94137d309c853">accumulateConstantFieldIdx</a>() + <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a>);</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  }</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (gepTy->isSingleValueType())</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  {</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <span class="comment">// If it's a non-constant offset access</span></div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="comment">// If its point-to target is struct or array, it's likely an array accessing (%result = gep %struct.A* %a, i32 %non-const-index)</span></div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="comment">// If its point-to target is single value (pointer arithmetic), then it's a variant gep (%result = gep i8* %p, i32 %non-const-index)</span></div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="keywordflow">if</span>(!op && gepTy->isPointerTy() && <a class="code" href="namespaceSVF_1_1LLVMUtil.html#abba4111230f6009bbf50518ee36a9870">getPtrElementType</a>(SVFUtil::dyn_cast<PointerType>(gepTy))->isSingleValueType())</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> </div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="comment">// The actual index</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="comment">//s32_t idx = op->getSExtValue();</span></div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> </div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="comment">// For pointer arithmetic we ignore the byte offset</span></div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="comment">// consider using inferFieldIdxFromByteOffset(geopOp,dataLayout,ls,idx)?</span></div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="comment">// ls.setFldIdx(ls.accumulateConstantFieldIdx() + inferFieldIdxFromByteOffset(geopOp,idx));</span></div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  }</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  }</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span> }</div><div class="ttc" id="SVF-FE_2BasicTypes_8h_html_aa81a27b9c6b2a354437417162220fb14"><div class="ttname"><a href="SVF-FE_2BasicTypes_8h.html#aa81a27b9c6b2a354437417162220fb14">DataLayout</a></div><div class="ttdeci">llvm::DataLayout DataLayout</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00051">BasicTypes.h:51</a></div></div>
|
|
1596
1596
|
<div class="ttc" id="namespaceSVF_html_a1d008c0666c145622b81d427be64c52d"><div class="ttname"><a href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">SVF::Type</a></div><div class="ttdeci">llvm::Type Type</div><div class="ttdoc">LLVM Basic classes. </div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00065">BasicTypes.h:65</a></div></div>
|
|
1597
1597
|
<div class="ttc" id="util_8h_html_a07d17d6d5d1074c0969bc5d3c3d1d84a"><div class="ttname"><a href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a></div><div class="ttdeci">#define assert(ex)</div><div class="ttdef"><b>Definition:</b> <a href="util_8h_source.html#l00141">util.h:141</a></div></div>
|
|
1598
1598
|
<div class="ttc" id="classSVF_1_1SymbolTableInfo_html_a8fc42c2b02317621d6aeb3c5f52d3ee8"><div class="ttname"><a href="classSVF_1_1SymbolTableInfo.html#a8fc42c2b02317621d6aeb3c5f52d3ee8">SVF::SymbolTableInfo::getFlattenedElemIdx</a></div><div class="ttdeci">u32_t getFlattenedElemIdx(const Type *T, u32_t origId)</div><div class="ttdoc">Flatterned element idx of an array or struct by considering stride. </div><div class="ttdef"><b>Definition:</b> <a href="SymbolTableInfo_8cpp_source.html#l00375">SymbolTableInfo.cpp:375</a></div></div>
|
|
1599
|
+
<div class="ttc" id="namespaceSVF_html_a146d286041987860388da3d8bc85cee3"><div class="ttname"><a href="namespaceSVF.html#a146d286041987860388da3d8bc85cee3">SVF::ArrayType</a></div><div class="ttdeci">llvm::ArrayType ArrayType</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00088">BasicTypes.h:88</a></div></div>
|
|
1599
1600
|
<div class="ttc" id="namespaceSVF_html_a9b707002523ece2ac54ca893ee9a2d4e"><div class="ttname"><a href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">SVF::s32_t</a></div><div class="ttdeci">signed s32_t</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00085">SVFBasicTypes.h:85</a></div></div>
|
|
1600
1601
|
<div class="ttc" id="namespaceSVF_html_adefcb50414ea999d70cea5ccdbcb98d7"><div class="ttname"><a href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">SVF::ConstantInt</a></div><div class="ttdeci">llvm::ConstantInt ConstantInt</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00094">BasicTypes.h:94</a></div></div>
|
|
1601
1602
|
<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#l00084">SVFBasicTypes.h:84</a></div></div>
|
|
@@ -2237,7 +2238,7 @@ Private Attributes</h2></td></tr>
|
|
|
2237
2238
|
<p>TODO: inter-procedural <a class="el" href="classSVF_1_1SVFIR.html">SVFIR</a> edges for thread joins </p>
|
|
2238
2239
|
|
|
2239
2240
|
<p class="definition">Definition at line <a class="el" href="SVFIRBuilder_8cpp_source.html#l01166">1166</a> of file <a class="el" href="SVFIRBuilder_8cpp_source.html">SVFIRBuilder.cpp</a>.</p>
|
|
2240
|
-
<div class="fragment"><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span> {</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *inst = cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>();</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a61ed4bb80d88b0f8dbc02535c224fdfb">isHeapAllocOrStaticExtCall</a>(cs))</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  {</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  <span class="comment">// case 1: ret = new obj</span></div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#ab2064cb70c76f399ce115f2621adea35">isHeapAllocExtCallViaRet</a>(cs) || <a class="code" href="namespaceSVF_1_1SVFUtil.html#ae62938f722543d6d7fc201b685be1abf">isStaticExtCall</a>(cs))</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  {</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> val = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(inst);</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> obj = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a93f3d13e2b3df126fbc42b1bd09006">getObjectNode</a>(inst);</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a2a0711cb1fdd3c5c90b07ff107aff1ac">addAddrEdge</a>(obj, val);</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>  }</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  <span class="comment">// case 2: *arg = new obj</span></div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  {</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#aedfa6e9216c6c788c26aef1967689b76">isHeapAllocExtCallViaArg</a>(cs) && <span class="stringliteral">"Must be heap alloc call via arg."</span>);</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_pos = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a73215bac62f1340a58f6c7f2ba9b0e7b">getHeapAllocHoldingArgPosition</a>(callee);</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *arg = cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_pos);</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  <span class="keywordflow">if</span> (arg->getType()->isPointerTy())</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>  {</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnArg = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(arg);</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dummy = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#aa7e98cd2fd599aedefa4c2e6fb659da0">addDummyValNode</a>();</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> obj = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#a905b16c9fe739c4e95902b2729951b5b">addDummyObjNode</a>(arg->getType());</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>  <span class="keywordflow">if</span> (vnArg && dummy && obj)</div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  {</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a2a0711cb1fdd3c5c90b07ff107aff1ac">addAddrEdge</a>(obj, dummy);</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(dummy, vnArg);</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>  }</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>  }</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  {</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">"Arg receiving new object must be pointer type"</span>);</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>  }</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>  }</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>  }</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>  {</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">isExtCall</a>(callee))</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>  {</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> funName = <a class="code" href="classSVF_1_1ExtAPI.html#a58a764c27354d5f9b70995d30de65f1d">ExtAPI::getExtAPI</a>()-><a class="code" href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a">get_name</a>(callee);</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>  <a class="code" href="structcJSON.html">cJSON</a> *<a class="code" href="cJSON_8h.html#ac76cea59d438ba893d2f82aabb367d14">item</a> = <a class="code" href="classSVF_1_1ExtAPI.html#a58a764c27354d5f9b70995d30de65f1d">ExtAPI::getExtAPI</a>()-><a class="code" href="classSVF_1_1ExtAPI.html#a1c95cd414e34e2b8b23c3b11c26e2a04">get_FunJson</a>(funName);</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>  <span class="comment">// The external function exists in ExtAPI.json</span></div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>  <span class="keywordflow">if</span> (item != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>  {</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>  <a class="code" href="structcJSON.html">cJSON</a> *obj = item-><a class="code" href="structcJSON.html#a401b274c2da358dac5c23ab8b2c71f85">child</a>;</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>  <span class="comment">// Get the first operation of the function</span></div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  obj = obj -> <a class="code" href="cJSON_8cpp.html#a2599f74bdbbc1b3fd1ba8db3789a0be7">next</a> -> <a class="code" href="cJSON_8cpp.html#a2599f74bdbbc1b3fd1ba8db3789a0be7">next</a>;</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  <span class="keywordflow">while</span> (obj)</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  {</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> op = obj-><a class="code" href="structcJSON.html#aa6b47e9a4b0e0a26f519b1a2b6739983">string</a>;</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>  std::vector<std::string> args;</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>  <span class="keywordflow">if</span> (obj-><a class="code" href="structcJSON.html#ab13084c574681593b12f6e0a3db0dcfc">type</a> == <a class="code" href="cJSON_8h.html#a57cffa126740a8efcdcb7bcef80e8897">cJSON_Array</a>)</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  {</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>  <span class="comment">// Get the first argument of the operation</span></div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  <a class="code" href="structcJSON.html">cJSON</a> *value = obj-><a class="code" href="structcJSON.html#a401b274c2da358dac5c23ab8b2c71f85">child</a>;</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  args = <a class="code" href="classSVF_1_1ExtAPI.html#a58a764c27354d5f9b70995d30de65f1d">ExtAPI::getExtAPI</a>()-><a class="code" href="classSVF_1_1ExtAPI.html#a906a3728bbcfb7a43ac0938ffcb3df23">get_opArgs</a>(value);</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  obj = obj-><a class="code" href="structcJSON.html#ade862b880379b5e2a591f7326401fa8d">next</a>;</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  }</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>  {</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> && <span class="stringliteral">"The function operation format is illegal!"</span>);</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  }</div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span> </div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094">ExtAPI::extf_t</a> opName = <a class="code" href="classSVF_1_1ExtAPI.html#a58a764c27354d5f9b70995d30de65f1d">ExtAPI::getExtAPI</a>()-><a class="code" href="classSVF_1_1ExtAPI.html#a6298f765cd73e9d71fc6b3b55fb7e56f">get_opName</a>(op);</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span> </div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  <span class="keywordflow">switch</span> (opName)</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  {</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094aedaa8f975941f17692f993d8a8b6dd30">ExtAPI::EXT_ADDR</a>:</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  {</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>  <span class="keywordflow">if</span> (args.size() == 1)</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>  {</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  <span class="keywordflow">if</span> (!SVFUtil::isa<PointerType>(inst->getType()))</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>  <span class="comment">// e.g. void *realloc(void *ptr, size_t size)</span></div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  <span class="comment">// if ptr is null then we will treat it as a malloc</span></div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>  <span class="comment">// if ptr is not null, then we assume a new data memory will be attached to</span></div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>  <span class="comment">// the tail of old allocated memory block.</span></div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>  <span class="keywordflow">if</span> (SVFUtil::isa<ConstantPointerNull>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(0)))</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>  {</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> val = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[0], cs, inst);</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> obj = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a93f3d13e2b3df126fbc42b1bd09006">getObjectNode</a>(inst);</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a2a0711cb1fdd3c5c90b07ff107aff1ac">addAddrEdge</a>(obj, val);</div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>  }</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>  }</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>  }</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094aaaaeb3443da98c5132ebcf33617962de">ExtAPI::EXT_COPY</a>:</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>  {</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[0], cs, inst);</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[1], cs, inst);</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>  <span class="keywordflow">if</span> (vnS && vnD)</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a140defeb309d895394822f8780deda16">addCopyEdge</a>(vnS, vnD);</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>  }</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094ab21117e18dd413220f4a331629d32bd8">ExtAPI::EXT_LOAD</a>:</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>  {</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[0], cs, inst);</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[1], cs, inst);</div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  <span class="keywordflow">if</span> (vnS && vnD)</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4469ae4c52c162d3fbbd559420045243">addLoadEdge</a>(vnS, vnD);</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>  }</div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094a501a7dadb95aa1a97b8fe111c7838900">ExtAPI::EXT_STORE</a>:</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>  {</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[0], cs, inst);</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[1], cs, inst);</div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>  <span class="keywordflow">if</span> (vnS && vnD)</div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(vnS, vnD);</div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>  }</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094a9b961a2cf28f4ae48e8a120a65721669">ExtAPI::EXT_LOADSTORE</a>:</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>  {</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[0], cs, inst);</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnV = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[1], cs, inst);</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[2], cs, inst);</div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>  <span class="keywordflow">if</span> (vnD && vnV && vnS)</div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  {</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4469ae4c52c162d3fbbd559420045243">addLoadEdge</a>(vnS, vnV);</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(vnV, vnD);</div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>  }</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>  }</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094a16fe812578afb8f018b6dd503c7bad49">ExtAPI::EXT_COPY_N</a>:</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>  {</div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>  <span class="comment">// void *memset(void *str, int c, size_t n)</span></div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>  <span class="comment">// this is for memset(void *str, int c, size_t n)</span></div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  <span class="comment">// which copies the character c (an unsigned char) to the first n characters of the string pointed to, by the argument str</span></div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posA = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[0]);</div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posB = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[1]);</div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posC = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[2]);</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  std::vector<LocationSet> dstFields;</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *dtype = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4cb5ac4a19002023683c4ee47aabb802">getBaseTypeAndFlattenedFields</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posA), dstFields, cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posC));</div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> sz = dstFields.size();</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>  <span class="comment">// For each field (i), add store edge *(arg0 + i) = arg1</span></div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < sz; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>++)</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  {</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *dElementType = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a87ee08e81de307eb9c02889b6ed98dd5">getFlatternedElemType</a>(dtype, dstFields[<a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].accumulateConstantFieldIdx());</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dField = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a74cff1c31f2fd1d23709b34ae988c29a">getGepValVar</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posA), dstFields[<a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>], dElementType);</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posB)), dField);</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>  }</div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>(inst->getType()))</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a140defeb309d895394822f8780deda16">addCopyEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posA)), <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(inst));</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  }</div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094acfb80bb18d5cc826c04a57517b9d723a">ExtAPI::EXT_COPY_MN</a>:</div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  {</div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posA = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[0]);</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posB = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[1]);</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>  <span class="keywordflow">if</span> (args.size() >= 3)</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  {</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posC = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[2]);</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad0e9f1dd1cba235a699c2b710a888d06">addComplexConsForExt</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posA), cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posB), cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posC));</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  }</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad0e9f1dd1cba235a699c2b710a888d06">addComplexConsForExt</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posA), cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posB), <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>  }</div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094ab6db72191d9b7d667fb6f7bd5b200d24">ExtAPI::EXT_FUNPTR</a>:</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>  {</div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posA = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[0]);</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *src = cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posA);</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="SVF-FE_2BasicTypes_8h.html#a255d310b1b573ca5c69fd715d7815d79">GetElementPtrInst</a> *gep = SVFUtil::dyn_cast<GetElementPtrInst>(src))</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>  src = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a07bd47ccfd02c5a2a6db26b537b2184f">stripConstantCasts</a>(gep->getPointerOperand());</div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *glob = SVFUtil::dyn_cast<GlobalVariable>(src))</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>  {</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="SVF-FE_2BasicTypes_8h.html#a7d8006ceeea7c796af22da70c5cb93a0">ConstantDataArray</a> *constarray = SVFUtil::dyn_cast<ConstantDataArray>(glob->getInitializer()))</div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>  {</div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *fun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a6f82e03d880257527bd9cb5978e05604">getProgFunction</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#aa67bbd366b93fb1ec7a540c83566c977">svfMod</a>, constarray->getAsCString().str()))</div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  {</div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcNode = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(fun->getLLVMFun());</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a140defeb309d895394822f8780deda16">addCopyEdge</a>(srcNode, <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(inst));</div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>  }</div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>  }</div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>  }</div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  }</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094aa9e95e42adbdc4db3dd5e76785916154">ExtAPI::EXT_COMPLEX</a>:</div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  {</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *argA = cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[0]));</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *argB = cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[1]));</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span> </div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  <span class="comment">// We have vArg3 points to the entry of _Rb_tree_node_base { color; parent; left; right; }.</span></div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  <span class="comment">// Now we calculate the offset from base to vArg3</span></div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnB = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(argB);</div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  <a class="code" href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">s32_t</a> <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acdb0cc97c0a0df00a6bf73cdb5cab5ba">getLocationSetFromBaseNode</a>(vnB).<a class="code" href="classSVF_1_1LocationSet.html#a63c5c8e03b35e0d0cea94137d309c853">accumulateConstantFieldIdx</a>();</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span> </div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  <span class="comment">// We get all flattened fields of base</span></div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  vector<LocationSet> fields;</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4cb5ac4a19002023683c4ee47aabb802">getBaseTypeAndFlattenedFields</a>(argB, fields, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(fields.size() >= 4 && <span class="stringliteral">"_Rb_tree_node_base should have at least 4 fields.\n"</span>);</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span> </div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  <span class="comment">// We summarize the side effects: arg3->parent = arg1, arg3->left = arg1, arg3->right = arg1</span></div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>  <span class="comment">// Note that arg0 is aligned with "offset".</span></div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">s32_t</a> i = offset + 1; i <= offset + 3; ++i)</div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  {</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  <span class="keywordflow">if</span> ((<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a>)i >= fields.size())</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *elementType = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a87ee08e81de307eb9c02889b6ed98dd5">getFlatternedElemType</a>(type, fields[i].accumulateConstantFieldIdx());</div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a74cff1c31f2fd1d23709b34ae988c29a">getGepValVar</a>(argB, fields[i], elementType);</div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(argA);</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  <span class="keywordflow">if</span> (vnD && vnS)</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(vnS, vnD);</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  }</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  }</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  <span class="comment">// default</span></div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  <span class="comment">// illegal function operation of external function</span></div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094a894fdba1a423fe49fa357f87ea69cf69">ExtAPI::EXT_OTHER</a>:</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  <span class="keywordflow">default</span>:</div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  {</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> && <span class="stringliteral">"new type of SVFStmt for external calls?"</span>);</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  }</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  }</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>  }</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  }</div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  <span class="comment">// // The external function doesn't exist in ExtAPI.json</span></div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  {</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> str;</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  <a class="code" href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">raw_string_ostream</a> rawstr(str);</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  rawstr << <span class="stringliteral">"function "</span> << callee-><a class="code" href="classSVF_1_1SVFValue.html#a2409c01221b9a6632655cee43d1b35e4">getName</a>() << <span class="stringliteral">" not in the external function summary ExtAPI.json file"</span>;</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(rawstr.str());</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  }</div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>  }</div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span> </div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a5c2abeb363081381c3dc939ab511e3f0">isThreadForkCall</a>(inst))</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>  {</div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *forkedFun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#ad98299033577f1e7f4e9bc73dff3b253">getLLVMFunction</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#ac840e43fa58a90099de99a1953f091ac">getForkedFun</a>(inst)))</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  {</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  forkedFun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a142e650415cb81011eb59dadd3cb0637">getDefFunForMultipleModule</a>(forkedFun)-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *actualParm = <a class="code" href="namespaceSVF_1_1SVFUtil.html#aaeeb386d80b51d729322317065606454">getActualParmAtForkSite</a>(inst);</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>((forkedFun->arg_size() <= 2) && <span class="stringliteral">"Size of formal parameter of start routine should be one"</span>);</div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>  <span class="keywordflow">if</span> (forkedFun->arg_size() <= 2 && forkedFun->arg_size() >= 1)</div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>  {</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a58cdfbc4160cae08745b67844ac29801">Argument</a> *formalParm = &(*forkedFun->arg_begin());</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>(actualParm->getType()) && SVFUtil::isa<PointerType>(formalParm->getType()))</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>  {</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *icfgNode = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#adc66b547720b9271e6805edea0b9d01f">getCallICFGNode</a>(inst);</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  <a class="code" href="classSVF_1_1FunEntryICFGNode.html">FunEntryICFGNode</a> *<a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a> = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#a0dca4655c2f6112a5be1f921b8e81076">getFunEntryICFGNode</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFFunction(forkedFun));</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a54636413fd3ed7e634ac7428139966a4">addThreadForkEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(actualParm), <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(formalParm), icfgNode, <a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a>);</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  }</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>  }</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>  }</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  {</div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>  }</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>  }</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span> </div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a28fbb7cc51eb7e25d88f43e3eb1f30fb">isHareParForCall</a>(inst))</div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  {</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *taskFunc = <a class="code" href="namespaceSVF_1_1SVFUtil.html#ad98299033577f1e7f4e9bc73dff3b253">getLLVMFunction</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#ab048cbce6e4f5a3d6ff90da3565220ff">getTaskFuncAtHareParForSite</a>(inst)))</div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  {</div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>((taskFunc->arg_size() == 3) && <span class="stringliteral">"Size of formal parameter of hare_parallel_for's task routine should be 3"</span>);</div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *actualParm = <a class="code" href="namespaceSVF_1_1SVFUtil.html#ad3471260b66bdd7e6b790ad2a94fe7ce">getTaskDataAtHareParForSite</a>(inst);</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a58cdfbc4160cae08745b67844ac29801">Argument</a> *formalParm = &(*taskFunc->arg_begin());</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>(actualParm->getType()) && SVFUtil::isa<PointerType>(formalParm->getType()))</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>  {</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *icfgNode = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#adc66b547720b9271e6805edea0b9d01f">getCallICFGNode</a>(inst);</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  <a class="code" href="classSVF_1_1FunEntryICFGNode.html">FunEntryICFGNode</a> *entry = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#a0dca4655c2f6112a5be1f921b8e81076">getFunEntryICFGNode</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFFunction(taskFunc));</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a54636413fd3ed7e634ac7428139966a4">addThreadForkEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(actualParm), <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(formalParm), icfgNode, <a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a>);</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>  }</div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  }</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  {</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  }</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  }</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span> </div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  }</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span> }</div><div class="ttc" id="classSVF_1_1ExtAPI_html_aaf94c82d98f8ed1514ee49c9881a4094acfb80bb18d5cc826c04a57517b9d723a"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094acfb80bb18d5cc826c04a57517b9d723a">SVF::ExtAPI::EXT_COPY_MN</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00117">ExtAPI.h:117</a></div></div>
|
|
2241
|
+
<div class="fragment"><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span> {</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *inst = cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>();</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a61ed4bb80d88b0f8dbc02535c224fdfb">isHeapAllocOrStaticExtCall</a>(cs))</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  {</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  <span class="comment">// case 1: ret = new obj</span></div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#ab2064cb70c76f399ce115f2621adea35">isHeapAllocExtCallViaRet</a>(cs) || <a class="code" href="namespaceSVF_1_1SVFUtil.html#ae62938f722543d6d7fc201b685be1abf">isStaticExtCall</a>(cs))</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  {</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> val = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(inst);</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> obj = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a93f3d13e2b3df126fbc42b1bd09006">getObjectNode</a>(inst);</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a2a0711cb1fdd3c5c90b07ff107aff1ac">addAddrEdge</a>(obj, val);</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>  }</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  <span class="comment">// case 2: *arg = new obj</span></div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>  {</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#aedfa6e9216c6c788c26aef1967689b76">isHeapAllocExtCallViaArg</a>(cs) && <span class="stringliteral">"Must be heap alloc call via arg."</span>);</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_pos = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a73215bac62f1340a58f6c7f2ba9b0e7b">getHeapAllocHoldingArgPosition</a>(callee);</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *arg = cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_pos);</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  <span class="keywordflow">if</span> (arg->getType()->isPointerTy())</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>  {</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnArg = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(arg);</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dummy = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#aa7e98cd2fd599aedefa4c2e6fb659da0">addDummyValNode</a>();</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> obj = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#a905b16c9fe739c4e95902b2729951b5b">addDummyObjNode</a>(arg->getType());</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>  <span class="keywordflow">if</span> (vnArg && dummy && obj)</div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  {</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a2a0711cb1fdd3c5c90b07ff107aff1ac">addAddrEdge</a>(obj, dummy);</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(dummy, vnArg);</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>  }</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>  }</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  {</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">"Arg receiving new object must be pointer type"</span>);</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>  }</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>  }</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>  }</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>  {</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">isExtCall</a>(callee))</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>  {</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> funName = <a class="code" href="classSVF_1_1ExtAPI.html#a02380d22fd6021ebce1e54723d695c99">ExtAPI::getExtAPI</a>()-><a class="code" href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a">get_name</a>(callee);</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>  <a class="code" href="structcJSON.html">cJSON</a> *<a class="code" href="cJSON_8h.html#ac76cea59d438ba893d2f82aabb367d14">item</a> = <a class="code" href="classSVF_1_1ExtAPI.html#a02380d22fd6021ebce1e54723d695c99">ExtAPI::getExtAPI</a>()-><a class="code" href="classSVF_1_1ExtAPI.html#ab61fbc80acc89e26df2b451cbab81246">get_FunJson</a>(funName);</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>  <span class="comment">// The external function exists in ExtAPI.json</span></div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>  <span class="keywordflow">if</span> (item != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>  {</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>  <a class="code" href="structcJSON.html">cJSON</a> *obj = item-><a class="code" href="structcJSON.html#a401b274c2da358dac5c23ab8b2c71f85">child</a>;</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>  <span class="comment">// Get the first operation of the function</span></div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  obj = obj -> <a class="code" href="cJSON_8cpp.html#a2599f74bdbbc1b3fd1ba8db3789a0be7">next</a> -> <a class="code" href="cJSON_8cpp.html#a2599f74bdbbc1b3fd1ba8db3789a0be7">next</a>;</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  <span class="keywordflow">while</span> (obj)</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  {</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> op = obj-><a class="code" href="structcJSON.html#aa6b47e9a4b0e0a26f519b1a2b6739983">string</a>;</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>  std::vector<std::string> args;</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>  <span class="keywordflow">if</span> (obj-><a class="code" href="structcJSON.html#ab13084c574681593b12f6e0a3db0dcfc">type</a> == <a class="code" href="cJSON_8h.html#a57cffa126740a8efcdcb7bcef80e8897">cJSON_Array</a>)</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  {</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>  <span class="comment">// Get the first argument of the operation</span></div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  <a class="code" href="structcJSON.html">cJSON</a> *value = obj-><a class="code" href="structcJSON.html#a401b274c2da358dac5c23ab8b2c71f85">child</a>;</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>  args = <a class="code" href="classSVF_1_1ExtAPI.html#a02380d22fd6021ebce1e54723d695c99">ExtAPI::getExtAPI</a>()-><a class="code" href="classSVF_1_1ExtAPI.html#a906a3728bbcfb7a43ac0938ffcb3df23">get_opArgs</a>(value);</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  obj = obj-><a class="code" href="structcJSON.html#ade862b880379b5e2a591f7326401fa8d">next</a>;</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  }</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>  {</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> && <span class="stringliteral">"The function operation format is illegal!"</span>);</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  }</div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span> </div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094">ExtAPI::extf_t</a> opName = <a class="code" href="classSVF_1_1ExtAPI.html#a02380d22fd6021ebce1e54723d695c99">ExtAPI::getExtAPI</a>()-><a class="code" href="classSVF_1_1ExtAPI.html#a6298f765cd73e9d71fc6b3b55fb7e56f">get_opName</a>(op);</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span> </div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  <span class="keywordflow">switch</span> (opName)</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  {</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094aedaa8f975941f17692f993d8a8b6dd30">ExtAPI::EXT_ADDR</a>:</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  {</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>  <span class="keywordflow">if</span> (args.size() == 1)</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>  {</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  <span class="keywordflow">if</span> (!SVFUtil::isa<PointerType>(inst->getType()))</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>  <span class="comment">// e.g. void *realloc(void *ptr, size_t size)</span></div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  <span class="comment">// if ptr is null then we will treat it as a malloc</span></div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>  <span class="comment">// if ptr is not null, then we assume a new data memory will be attached to</span></div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>  <span class="comment">// the tail of old allocated memory block.</span></div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>  <span class="keywordflow">if</span> (SVFUtil::isa<ConstantPointerNull>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(0)))</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>  {</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> val = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[0], cs, inst);</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> obj = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a93f3d13e2b3df126fbc42b1bd09006">getObjectNode</a>(inst);</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a2a0711cb1fdd3c5c90b07ff107aff1ac">addAddrEdge</a>(obj, val);</div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>  }</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>  }</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>  }</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094aaaaeb3443da98c5132ebcf33617962de">ExtAPI::EXT_COPY</a>:</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>  {</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[0], cs, inst);</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[1], cs, inst);</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>  <span class="keywordflow">if</span> (vnS && vnD)</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a140defeb309d895394822f8780deda16">addCopyEdge</a>(vnS, vnD);</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>  }</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094ab21117e18dd413220f4a331629d32bd8">ExtAPI::EXT_LOAD</a>:</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>  {</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[0], cs, inst);</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[1], cs, inst);</div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  <span class="keywordflow">if</span> (vnS && vnD)</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4469ae4c52c162d3fbbd559420045243">addLoadEdge</a>(vnS, vnD);</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>  }</div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094a501a7dadb95aa1a97b8fe111c7838900">ExtAPI::EXT_STORE</a>:</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>  {</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[0], cs, inst);</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[1], cs, inst);</div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>  <span class="keywordflow">if</span> (vnS && vnD)</div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(vnS, vnD);</div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>  }</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094a9b961a2cf28f4ae48e8a120a65721669">ExtAPI::EXT_LOADSTORE</a>:</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>  {</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[0], cs, inst);</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnV = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[1], cs, inst);</div><div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a1ad4f6ac06c1f3523661e7b2a0be09b5">parseNode</a>(args[2], cs, inst);</div><div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>  <span class="keywordflow">if</span> (vnD && vnV && vnS)</div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>  {</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4469ae4c52c162d3fbbd559420045243">addLoadEdge</a>(vnS, vnV);</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(vnV, vnD);</div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>  }</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>  }</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094a16fe812578afb8f018b6dd503c7bad49">ExtAPI::EXT_COPY_N</a>:</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>  {</div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>  <span class="comment">// void *memset(void *str, int c, size_t n)</span></div><div class="line"><a name="l01291"></a><span class="lineno"> 1291</span>  <span class="comment">// this is for memset(void *str, int c, size_t n)</span></div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>  <span class="comment">// which copies the character c (an unsigned char) to the first n characters of the string pointed to, by the argument str</span></div><div class="line"><a name="l01293"></a><span class="lineno"> 1293</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posA = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[0]);</div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posB = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[1]);</div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posC = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[2]);</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>  std::vector<LocationSet> dstFields;</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *dtype = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4cb5ac4a19002023683c4ee47aabb802">getBaseTypeAndFlattenedFields</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posA), dstFields, cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posC));</div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> sz = dstFields.size();</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>  <span class="comment">// For each field (i), add store edge *(arg0 + i) = arg1</span></div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < sz; <a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>++)</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>  {</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *dElementType = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a87ee08e81de307eb9c02889b6ed98dd5">getFlatternedElemType</a>(dtype, dstFields[<a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].accumulateConstantFieldIdx());</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dField = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a74cff1c31f2fd1d23709b34ae988c29a">getGepValVar</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posA), dstFields[<a class="code" href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>], dElementType);</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posB)), dField);</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>  }</div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>(inst->getType()))</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a140defeb309d895394822f8780deda16">addCopyEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posA)), <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(inst));</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>  }</div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094acfb80bb18d5cc826c04a57517b9d723a">ExtAPI::EXT_COPY_MN</a>:</div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>  {</div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posA = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[0]);</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posB = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[1]);</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>  <span class="keywordflow">if</span> (args.size() >= 3)</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>  {</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posC = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[2]);</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad0e9f1dd1cba235a699c2b710a888d06">addComplexConsForExt</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posA), cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posB), cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posC));</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>  }</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad0e9f1dd1cba235a699c2b710a888d06">addComplexConsForExt</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posA), cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posB), <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>  }</div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094ab6db72191d9b7d667fb6f7bd5b200d24">ExtAPI::EXT_FUNPTR</a>:</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>  {</div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg_posA = <a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[0]);</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *src = cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg_posA);</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="SVF-FE_2BasicTypes_8h.html#a255d310b1b573ca5c69fd715d7815d79">GetElementPtrInst</a> *gep = SVFUtil::dyn_cast<GetElementPtrInst>(src))</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>  src = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a07bd47ccfd02c5a2a6db26b537b2184f">stripConstantCasts</a>(gep->getPointerOperand());</div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *glob = SVFUtil::dyn_cast<GlobalVariable>(src))</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>  {</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="SVF-FE_2BasicTypes_8h.html#a7d8006ceeea7c796af22da70c5cb93a0">ConstantDataArray</a> *constarray = SVFUtil::dyn_cast<ConstantDataArray>(glob->getInitializer()))</div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>  {</div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *fun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a6f82e03d880257527bd9cb5978e05604">getProgFunction</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#aa67bbd366b93fb1ec7a540c83566c977">svfMod</a>, constarray->getAsCString().str()))</div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>  {</div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcNode = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(fun->getLLVMFun());</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a140defeb309d895394822f8780deda16">addCopyEdge</a>(srcNode, <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(inst));</div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>  }</div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>  }</div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>  }</div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>  }</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094aa9e95e42adbdc4db3dd5e76785916154">ExtAPI::EXT_COMPLEX</a>:</div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>  {</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>  <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *argA = cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[0]));</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *argB = cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">getArgPos</a>(args[1]));</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span> </div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  <span class="comment">// We have vArg3 points to the entry of _Rb_tree_node_base { color; parent; left; right; }.</span></div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>  <span class="comment">// Now we calculate the offset from base to vArg3</span></div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnB = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(argB);</div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>  <a class="code" href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">s32_t</a> <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acdb0cc97c0a0df00a6bf73cdb5cab5ba">getLocationSetFromBaseNode</a>(vnB).<a class="code" href="classSVF_1_1LocationSet.html#a63c5c8e03b35e0d0cea94137d309c853">accumulateConstantFieldIdx</a>();</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span> </div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>  <span class="comment">// We get all flattened fields of base</span></div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>  vector<LocationSet> fields;</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4cb5ac4a19002023683c4ee47aabb802">getBaseTypeAndFlattenedFields</a>(argB, fields, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(fields.size() >= 4 && <span class="stringliteral">"_Rb_tree_node_base should have at least 4 fields.\n"</span>);</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span> </div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>  <span class="comment">// We summarize the side effects: arg3->parent = arg1, arg3->left = arg1, arg3->right = arg1</span></div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>  <span class="comment">// Note that arg0 is aligned with "offset".</span></div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a9b707002523ece2ac54ca893ee9a2d4e">s32_t</a> i = offset + 1; i <= offset + 3; ++i)</div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>  {</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>  <span class="keywordflow">if</span> ((<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a>)i >= fields.size())</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *elementType = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a87ee08e81de307eb9c02889b6ed98dd5">getFlatternedElemType</a>(type, fields[i].accumulateConstantFieldIdx());</div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a74cff1c31f2fd1d23709b34ae988c29a">getGepValVar</a>(argB, fields[i], elementType);</div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(argA);</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>  <span class="keywordflow">if</span> (vnD && vnS)</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(vnS, vnD);</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  }</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>  }</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>  <span class="comment">// default</span></div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  <span class="comment">// illegal function operation of external function</span></div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094a894fdba1a423fe49fa357f87ea69cf69">ExtAPI::EXT_OTHER</a>:</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  <span class="keywordflow">default</span>:</div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>  {</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> && <span class="stringliteral">"new type of SVFStmt for external calls?"</span>);</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>  }</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>  }</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>  }</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>  }</div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>  <span class="comment">// // The external function doesn't exist in ExtAPI.json</span></div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  {</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> str;</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  <a class="code" href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">raw_string_ostream</a> rawstr(str);</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  rawstr << <span class="stringliteral">"function "</span> << callee-><a class="code" href="classSVF_1_1SVFValue.html#a2409c01221b9a6632655cee43d1b35e4">getName</a>() << <span class="stringliteral">" not in the external function summary ExtAPI.json file"</span>;</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(rawstr.str());</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>  }</div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>  }</div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span> </div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a5c2abeb363081381c3dc939ab511e3f0">isThreadForkCall</a>(inst))</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>  {</div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *forkedFun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#ad98299033577f1e7f4e9bc73dff3b253">getLLVMFunction</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#ac840e43fa58a90099de99a1953f091ac">getForkedFun</a>(inst)))</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>  {</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>  forkedFun = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a142e650415cb81011eb59dadd3cb0637">getDefFunForMultipleModule</a>(forkedFun)-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *actualParm = <a class="code" href="namespaceSVF_1_1SVFUtil.html#aaeeb386d80b51d729322317065606454">getActualParmAtForkSite</a>(inst);</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>((forkedFun->arg_size() <= 2) && <span class="stringliteral">"Size of formal parameter of start routine should be one"</span>);</div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>  <span class="keywordflow">if</span> (forkedFun->arg_size() <= 2 && forkedFun->arg_size() >= 1)</div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>  {</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a58cdfbc4160cae08745b67844ac29801">Argument</a> *formalParm = &(*forkedFun->arg_begin());</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>(actualParm->getType()) && SVFUtil::isa<PointerType>(formalParm->getType()))</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>  {</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *icfgNode = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#adc66b547720b9271e6805edea0b9d01f">getCallICFGNode</a>(inst);</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  <a class="code" href="classSVF_1_1FunEntryICFGNode.html">FunEntryICFGNode</a> *<a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a> = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#a0dca4655c2f6112a5be1f921b8e81076">getFunEntryICFGNode</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFFunction(forkedFun));</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a54636413fd3ed7e634ac7428139966a4">addThreadForkEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(actualParm), <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(formalParm), icfgNode, <a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a>);</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>  }</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>  }</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>  }</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  {</div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>  }</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>  }</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span> </div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a28fbb7cc51eb7e25d88f43e3eb1f30fb">isHareParForCall</a>(inst))</div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>  {</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *taskFunc = <a class="code" href="namespaceSVF_1_1SVFUtil.html#ad98299033577f1e7f4e9bc73dff3b253">getLLVMFunction</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#ab048cbce6e4f5a3d6ff90da3565220ff">getTaskFuncAtHareParForSite</a>(inst)))</div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>  {</div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>((taskFunc->arg_size() == 3) && <span class="stringliteral">"Size of formal parameter of hare_parallel_for's task routine should be 3"</span>);</div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *actualParm = <a class="code" href="namespaceSVF_1_1SVFUtil.html#ad3471260b66bdd7e6b790ad2a94fe7ce">getTaskDataAtHareParForSite</a>(inst);</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a58cdfbc4160cae08745b67844ac29801">Argument</a> *formalParm = &(*taskFunc->arg_begin());</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>(actualParm->getType()) && SVFUtil::isa<PointerType>(formalParm->getType()))</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>  {</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a> *icfgNode = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#adc66b547720b9271e6805edea0b9d01f">getCallICFGNode</a>(inst);</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  <a class="code" href="classSVF_1_1FunEntryICFGNode.html">FunEntryICFGNode</a> *entry = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#a0dca4655c2f6112a5be1f921b8e81076">getFunEntryICFGNode</a>(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFFunction(taskFunc));</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a54636413fd3ed7e634ac7428139966a4">addThreadForkEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(actualParm), <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(formalParm), icfgNode, <a class="code" href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a>);</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>  }</div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>  }</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  {</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>  }</div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>  }</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span> </div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>  }</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span> }</div><div class="ttc" id="classSVF_1_1ExtAPI_html_aaf94c82d98f8ed1514ee49c9881a4094acfb80bb18d5cc826c04a57517b9d723a"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094acfb80bb18d5cc826c04a57517b9d723a">SVF::ExtAPI::EXT_COPY_MN</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00117">ExtAPI.h:117</a></div></div>
|
|
2241
2242
|
<div class="ttc" id="SVF-FE_2BasicTypes_8h_html_a7d8006ceeea7c796af22da70c5cb93a0"><div class="ttname"><a href="SVF-FE_2BasicTypes_8h.html#a7d8006ceeea7c796af22da70c5cb93a0">ConstantDataArray</a></div><div class="ttdeci">llvm::ConstantDataArray ConstantDataArray</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00058">BasicTypes.h:58</a></div></div>
|
|
2242
2243
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_ad98299033577f1e7f4e9bc73dff3b253"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#ad98299033577f1e7f4e9bc73dff3b253">SVF::SVFUtil::getLLVMFunction</a></div><div class="ttdeci">const Function * getLLVMFunction(const Value *val)</div><div class="ttdoc">Return LLVM function if this value is. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00480">SVFUtil.h:480</a></div></div>
|
|
2243
2244
|
<div class="ttc" id="classSVF_1_1SVFIRBuilder_html_ad18daeba9a22328647db3f5cb810edc2"><div class="ttname"><a href="classSVF_1_1SVFIRBuilder.html#ad18daeba9a22328647db3f5cb810edc2">SVF::SVFIRBuilder::getArgPos</a></div><div class="ttdeci">virtual u32_t getArgPos(std::string s)</div><div class="ttdoc">Handle external call. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIRBuilder_8cpp_source.html#l01095">SVFIRBuilder.cpp:1095</a></div></div>
|
|
@@ -2245,6 +2246,7 @@ Private Attributes</h2></td></tr>
|
|
|
2245
2246
|
<div class="ttc" id="cJSON_8cpp_html_a2599f74bdbbc1b3fd1ba8db3789a0be7"><div class="ttname"><a href="cJSON_8cpp.html#a2599f74bdbbc1b3fd1ba8db3789a0be7">next</a></div><div class="ttdeci">item next</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02224">cJSON.cpp:2224</a></div></div>
|
|
2246
2247
|
<div class="ttc" id="SVF-FE_2BasicTypes_8h_html_a255d310b1b573ca5c69fd715d7815d79"><div class="ttname"><a href="SVF-FE_2BasicTypes_8h.html#a255d310b1b573ca5c69fd715d7815d79">GetElementPtrInst</a></div><div class="ttdeci">llvm::GetElementPtrInst GetElementPtrInst</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00076">BasicTypes.h:76</a></div></div>
|
|
2247
2248
|
<div class="ttc" id="classSVF_1_1SVFIR_html_aa7e98cd2fd599aedefa4c2e6fb659da0"><div class="ttname"><a href="classSVF_1_1SVFIR.html#aa7e98cd2fd599aedefa4c2e6fb659da0">SVF::SVFIR::addDummyValNode</a></div><div class="ttdeci">NodeID addDummyValNode()</div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#l00428">SVFIR.h:428</a></div></div>
|
|
2249
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_ab61fbc80acc89e26df2b451cbab81246"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ab61fbc80acc89e26df2b451cbab81246">SVF::ExtAPI::get_FunJson</a></div><div class="ttdeci">cJSON * get_FunJson(const std::string &funName)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00193">ExtAPI.cpp:193</a></div></div>
|
|
2248
2250
|
<div class="ttc" id="classSVF_1_1SVFIRBuilder_html_a2a0711cb1fdd3c5c90b07ff107aff1ac"><div class="ttname"><a href="classSVF_1_1SVFIRBuilder.html#a2a0711cb1fdd3c5c90b07ff107aff1ac">SVF::SVFIRBuilder::addAddrEdge</a></div><div class="ttdeci">AddrStmt * addAddrEdge(NodeID src, NodeID dst)</div><div class="ttdoc">Add Address edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIRBuilder_8h_source.html#l00298">SVFIRBuilder.h:298</a></div></div>
|
|
2249
2251
|
<div class="ttc" id="classSVF_1_1SVFIRBuilder_html_acc69fc638380f34164db649d9bf2a7d6"><div class="ttname"><a href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">SVF::SVFIRBuilder::getValueNode</a></div><div class="ttdeci">NodeID getValueNode(const Value *V)</div><div class="ttdoc">Get different kinds of node. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIRBuilder_8h_source.html#l00087">SVFIRBuilder.h:87</a></div></div>
|
|
2250
2252
|
<div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00019">MTAResultValidator.h:19</a></div></div>
|
|
@@ -2265,6 +2267,7 @@ Private Attributes</h2></td></tr>
|
|
|
2265
2267
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a077caa1b10ab84d101d79fc7ea50db2d"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">SVF::SVFUtil::writeWrnMsg</a></div><div class="ttdeci">void writeWrnMsg(std::string msg)</div><div class="ttdoc">Writes a message run through wrnMsg. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00068">SVFUtil.cpp:68</a></div></div>
|
|
2266
2268
|
<div class="ttc" id="classSVF_1_1IRGraph_html_abffddd41cc308b9b3bd5ad4a7f8f1624"><div class="ttname"><a href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">SVF::IRGraph::getValueNode</a></div><div class="ttdeci">NodeID getValueNode(const Value *V)</div><div class="ttdef"><b>Definition:</b> <a href="IRGraph_8h_source.html#l00124">IRGraph.h:124</a></div></div>
|
|
2267
2269
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a61ed4bb80d88b0f8dbc02535c224fdfb"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a61ed4bb80d88b0f8dbc02535c224fdfb">SVF::SVFUtil::isHeapAllocOrStaticExtCall</a></div><div class="ttdeci">bool isHeapAllocOrStaticExtCall(const CallSite cs)</div><div class="ttdoc">Return true if the call is a static global call. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00580">SVFUtil.h:580</a></div></div>
|
|
2270
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a02380d22fd6021ebce1e54723d695c99"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a02380d22fd6021ebce1e54723d695c99">SVF::ExtAPI::getExtAPI</a></div><div class="ttdeci">static ExtAPI * getExtAPI(const std::string &="")</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00101">ExtAPI.cpp:101</a></div></div>
|
|
2268
2271
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a28fbb7cc51eb7e25d88f43e3eb1f30fb"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a28fbb7cc51eb7e25d88f43e3eb1f30fb">SVF::SVFUtil::isHareParForCall</a></div><div class="ttdeci">bool isHareParForCall(const CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00605">SVFUtil.h:605</a></div></div>
|
|
2269
2272
|
<div class="ttc" id="structcJSON_html"><div class="ttname"><a href="structcJSON.html">cJSON</a></div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00103">cJSON.h:103</a></div></div>
|
|
2270
2273
|
<div class="ttc" id="classSVF_1_1ICFG_html_adc66b547720b9271e6805edea0b9d01f"><div class="ttname"><a href="classSVF_1_1ICFG.html#adc66b547720b9271e6805edea0b9d01f">SVF::ICFG::getCallICFGNode</a></div><div class="ttdeci">CallICFGNode * getCallICFGNode(const Instruction *inst)</div><div class="ttdef"><b>Definition:</b> <a href="ICFG_8cpp_source.html#l00240">ICFG.cpp:240</a></div></div>
|
|
@@ -2285,7 +2288,6 @@ Private Attributes</h2></td></tr>
|
|
|
2285
2288
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_aedfa6e9216c6c788c26aef1967689b76"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#aedfa6e9216c6c788c26aef1967689b76">SVF::SVFUtil::isHeapAllocExtCallViaArg</a></div><div class="ttdeci">bool isHeapAllocExtCallViaArg(const CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00496">SVFUtil.h:496</a></div></div>
|
|
2286
2289
|
<div class="ttc" id="structcJSON_html_ade862b880379b5e2a591f7326401fa8d"><div class="ttname"><a href="structcJSON.html#ade862b880379b5e2a591f7326401fa8d">cJSON::next</a></div><div class="ttdeci">struct cJSON * next</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00106">cJSON.h:106</a></div></div>
|
|
2287
2290
|
<div class="ttc" id="namespaceSVF_html_a58cdfbc4160cae08745b67844ac29801"><div class="ttname"><a href="namespaceSVF.html#a58cdfbc4160cae08745b67844ac29801">SVF::Argument</a></div><div class="ttdeci">llvm::Argument Argument</div><div class="ttdoc">LLVM Aliases and constants. </div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00093">BasicTypes.h:93</a></div></div>
|
|
2288
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a58a764c27354d5f9b70995d30de65f1d"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a58a764c27354d5f9b70995d30de65f1d">SVF::ExtAPI::getExtAPI</a></div><div class="ttdeci">static ExtAPI * getExtAPI()</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00021">ExtAPI.cpp:21</a></div></div>
|
|
2289
2291
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_ab2064cb70c76f399ce115f2621adea35"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#ab2064cb70c76f399ce115f2621adea35">SVF::SVFUtil::isHeapAllocExtCallViaRet</a></div><div class="ttdeci">bool isHeapAllocExtCallViaRet(const CallSite cs)</div><div class="ttdoc">interfaces to be used externally </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00507">SVFUtil.h:507</a></div></div>
|
|
2290
2292
|
<div class="ttc" id="classSVF_1_1LocationSet_html_a63c5c8e03b35e0d0cea94137d309c853"><div class="ttname"><a href="classSVF_1_1LocationSet.html#a63c5c8e03b35e0d0cea94137d309c853">SVF::LocationSet::accumulateConstantFieldIdx</a></div><div class="ttdeci">s32_t accumulateConstantFieldIdx() const</div><div class="ttdoc">Get methods. </div><div class="ttdef"><b>Definition:</b> <a href="LocationSet_8h_source.html#l00090">LocationSet.h:90</a></div></div>
|
|
2291
2293
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_aaeeb386d80b51d729322317065606454"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#aaeeb386d80b51d729322317065606454">SVF::SVFUtil::getActualParmAtForkSite</a></div><div class="ttdeci">const Value * getActualParmAtForkSite(const CallSite cs)</div><div class="ttdoc">Return sole argument of the thread routine. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00677">SVFUtil.h:677</a></div></div>
|
|
@@ -2293,18 +2295,17 @@ Private Attributes</h2></td></tr>
|
|
|
2293
2295
|
<div class="ttc" id="classSVF_1_1SymbolTableInfo_html_a267169023fc4f8dd66b145f7231fec11"><div class="ttname"><a href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SVF::SymbolTableInfo::SymbolInfo</a></div><div class="ttdeci">static SymbolTableInfo * SymbolInfo()</div><div class="ttdoc">Singleton design here to make sure we only have one instance during any analysis. ...</div><div class="ttdef"><b>Definition:</b> <a href="SymbolTableInfo_8cpp_source.html#l00108">SymbolTableInfo.cpp:108</a></div></div>
|
|
2294
2296
|
<div class="ttc" id="classSVF_1_1SymbolTableInfo_html_a87ee08e81de307eb9c02889b6ed98dd5"><div class="ttname"><a href="classSVF_1_1SymbolTableInfo.html#a87ee08e81de307eb9c02889b6ed98dd5">SVF::SymbolTableInfo::getFlatternedElemType</a></div><div class="ttdeci">const Type * getFlatternedElemType(const Type *baseType, u32_t flatten_idx)</div><div class="ttdoc">Return the type of a flattened element given a flattened index. </div><div class="ttdef"><b>Definition:</b> <a href="SymbolTableInfo_8cpp_source.html#l00406">SymbolTableInfo.cpp:406</a></div></div>
|
|
2295
2297
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a5c2abeb363081381c3dc939ab511e3f0"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a5c2abeb363081381c3dc939ab511e3f0">SVF::SVFUtil::isThreadForkCall</a></div><div class="ttdeci">bool isThreadForkCall(const CallSite cs)</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00593">SVFUtil.h:593</a></div></div>
|
|
2296
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a1c95cd414e34e2b8b23c3b11c26e2a04"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a1c95cd414e34e2b8b23c3b11c26e2a04">SVF::ExtAPI::get_FunJson</a></div><div class="ttdeci">cJSON * get_FunJson(const std::string funName)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00122">ExtAPI.cpp:122</a></div></div>
|
|
2297
2298
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a73215bac62f1340a58f6c7f2ba9b0e7b"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a73215bac62f1340a58f6c7f2ba9b0e7b">SVF::SVFUtil::getHeapAllocHoldingArgPosition</a></div><div class="ttdeci">int getHeapAllocHoldingArgPosition(const SVFFunction *fun)</div><div class="ttdoc">Get the position of argument that holds an allocated heap object. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00379">SVFUtil.h:379</a></div></div>
|
|
2298
2299
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_aaf94c82d98f8ed1514ee49c9881a4094aedaa8f975941f17692f993d8a8b6dd30"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094aedaa8f975941f17692f993d8a8b6dd30">SVF::ExtAPI::EXT_ADDR</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00111">ExtAPI.h:111</a></div></div>
|
|
2299
2300
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a6f82e03d880257527bd9cb5978e05604"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a6f82e03d880257527bd9cb5978e05604">SVF::SVFUtil::getProgFunction</a></div><div class="ttdeci">const SVFFunction * getProgFunction(SVFModule *svfModule, const std::string &funName)</div><div class="ttdoc">Get program entry function from module. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00418">SVFUtil.h:418</a></div></div>
|
|
2300
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a6298f765cd73e9d71fc6b3b55fb7e56f"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a6298f765cd73e9d71fc6b3b55fb7e56f">SVF::ExtAPI::get_opName</a></div><div class="ttdeci">extf_t get_opName(std::string s)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
2301
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a6298f765cd73e9d71fc6b3b55fb7e56f"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a6298f765cd73e9d71fc6b3b55fb7e56f">SVF::ExtAPI::get_opName</a></div><div class="ttdeci">extf_t get_opName(std::string s)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00165">ExtAPI.cpp:165</a></div></div>
|
|
2301
2302
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_aaf94c82d98f8ed1514ee49c9881a4094ab6db72191d9b7d667fb6f7bd5b200d24"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094ab6db72191d9b7d667fb6f7bd5b200d24">SVF::ExtAPI::EXT_FUNPTR</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00118">ExtAPI.h:118</a></div></div>
|
|
2302
2303
|
<div class="ttc" id="classSVF_1_1SVFIRBuilder_html_acdb0cc97c0a0df00a6bf73cdb5cab5ba"><div class="ttname"><a href="classSVF_1_1SVFIRBuilder.html#acdb0cc97c0a0df00a6bf73cdb5cab5ba">SVF::SVFIRBuilder::getLocationSetFromBaseNode</a></div><div class="ttdeci">LocationSet getLocationSetFromBaseNode(NodeID nodeId)</div><div class="ttdef"><b>Definition:</b> <a href="SVFIRBuilder_8cpp_source.html#l01671">SVFIRBuilder.cpp:1671</a></div></div>
|
|
2303
2304
|
<div class="ttc" id="classSVF_1_1SVFIRBuilder_html_ad0e9f1dd1cba235a699c2b710a888d06"><div class="ttname"><a href="classSVF_1_1SVFIRBuilder.html#ad0e9f1dd1cba235a699c2b710a888d06">SVF::SVFIRBuilder::addComplexConsForExt</a></div><div class="ttdeci">void addComplexConsForExt(Value *D, Value *S, const Value *sz)</div><div class="ttdef"><b>Definition:</b> <a href="SVFIRBuilder_8cpp_source.html#l01048">SVFIRBuilder.cpp:1048</a></div></div>
|
|
2304
2305
|
<div class="ttc" id="classSVF_1_1SVFIRBuilder_html_aa67bbd366b93fb1ec7a540c83566c977"><div class="ttname"><a href="classSVF_1_1SVFIRBuilder.html#aa67bbd366b93fb1ec7a540c83566c977">SVF::SVFIRBuilder::svfMod</a></div><div class="ttdeci">SVFModule * svfMod</div><div class="ttdef"><b>Definition:</b> <a href="SVFIRBuilder_8h_source.html#l00051">SVFIRBuilder.h:51</a></div></div>
|
|
2305
2306
|
<div class="ttc" id="classSVF_1_1SVFValue_html_a2409c01221b9a6632655cee43d1b35e4"><div class="ttname"><a href="classSVF_1_1SVFValue.html#a2409c01221b9a6632655cee43d1b35e4">SVF::SVFValue::getName</a></div><div class="ttdeci">const std::string getName() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00252">SVFBasicTypes.h:252</a></div></div>
|
|
2306
2307
|
<div class="ttc" id="cJSON_8cpp_html_a95bf816579e97b6f33bdb5e25ed6d5de"><div class="ttname"><a href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a></div><div class="ttdeci">buffer offset</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l01113">cJSON.cpp:1113</a></div></div>
|
|
2307
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_ac3e34227968d6a2835d63b1052da3c1a"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a">SVF::ExtAPI::get_name</a></div><div class="ttdeci">std::string get_name(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
2308
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_ac3e34227968d6a2835d63b1052da3c1a"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#ac3e34227968d6a2835d63b1052da3c1a">SVF::ExtAPI::get_name</a></div><div class="ttdeci">std::string get_name(const SVFFunction *F)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00179">ExtAPI.cpp:179</a></div></div>
|
|
2308
2309
|
<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>
|
|
2309
2310
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_acf40310917909e4234282c0695a43160"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">SVF::LLVMModuleSet::getLLVMModuleSet</a></div><div class="ttdeci">static LLVMModuleSet * getLLVMModuleSet()</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00070">LLVMModule.h:70</a></div></div>
|
|
2310
2311
|
<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#l00142">BasicTypes.h:142</a></div></div>
|
|
@@ -2312,7 +2313,7 @@ Private Attributes</h2></td></tr>
|
|
|
2312
2313
|
<div class="ttc" id="classSVF_1_1ExtAPI_html_aaf94c82d98f8ed1514ee49c9881a4094a9b961a2cf28f4ae48e8a120a65721669"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#aaf94c82d98f8ed1514ee49c9881a4094a9b961a2cf28f4ae48e8a120a65721669">SVF::ExtAPI::EXT_LOADSTORE</a></div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8h_source.html#l00115">ExtAPI.h:115</a></div></div>
|
|
2313
2314
|
<div class="ttc" id="classSVF_1_1ICFG_html_a0dca4655c2f6112a5be1f921b8e81076"><div class="ttname"><a href="classSVF_1_1ICFG.html#a0dca4655c2f6112a5be1f921b8e81076">SVF::ICFG::getFunEntryICFGNode</a></div><div class="ttdeci">FunEntryICFGNode * getFunEntryICFGNode(const SVFFunction *fun)</div><div class="ttdoc">Add a function entry node. </div><div class="ttdef"><b>Definition:</b> <a href="ICFG_8cpp_source.html#l00273">ICFG.cpp:273</a></div></div>
|
|
2314
2315
|
<div class="ttc" id="structcJSON_html_ab13084c574681593b12f6e0a3db0dcfc"><div class="ttname"><a href="structcJSON.html#ab13084c574681593b12f6e0a3db0dcfc">cJSON::type</a></div><div class="ttdeci">int type</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00112">cJSON.h:112</a></div></div>
|
|
2315
|
-
<div class="ttc" id="classSVF_1_1ExtAPI_html_a906a3728bbcfb7a43ac0938ffcb3df23"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a906a3728bbcfb7a43ac0938ffcb3df23">SVF::ExtAPI::get_opArgs</a></div><div class="ttdeci">std::vector< std::string > get_opArgs(const cJSON *value)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#
|
|
2316
|
+
<div class="ttc" id="classSVF_1_1ExtAPI_html_a906a3728bbcfb7a43ac0938ffcb3df23"><div class="ttname"><a href="classSVF_1_1ExtAPI.html#a906a3728bbcfb7a43ac0938ffcb3df23">SVF::ExtAPI::get_opArgs</a></div><div class="ttdeci">std::vector< std::string > get_opArgs(const cJSON *value)</div><div class="ttdef"><b>Definition:</b> <a href="ExtAPI_8cpp_source.html#l00200">ExtAPI.cpp:200</a></div></div>
|
|
2316
2317
|
<div class="ttc" id="cuddInt_8c_html_a936a27e51e66afb57c2b3a12d78a238e"><div class="ttname"><a href="cuddInt_8c.html#a936a27e51e66afb57c2b3a12d78a238e">entry</a></div><div class="ttdeci">static int * entry</div><div class="ttdef"><b>Definition:</b> <a href="cuddInt_8c_source.html#l08422">cuddInt.c:8422</a></div></div>
|
|
2317
2318
|
<div class="ttc" id="classSVF_1_1SVFIRBuilder_html_a4ea94b0a8d6da904ff9a6c1b0341b9cb"><div class="ttname"><a href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">SVF::SVFIRBuilder::pag</a></div><div class="ttdeci">SVFIR * pag</div><div class="ttdef"><b>Definition:</b> <a href="SVFIRBuilder_8h_source.html#l00050">SVFIRBuilder.h:50</a></div></div>
|
|
2318
2319
|
<div class="ttc" id="classSVF_1_1SVFIRBuilder_html_a4cb5ac4a19002023683c4ee47aabb802"><div class="ttname"><a href="classSVF_1_1SVFIRBuilder.html#a4cb5ac4a19002023683c4ee47aabb802">SVF::SVFIRBuilder::getBaseTypeAndFlattenedFields</a></div><div class="ttdeci">const Type * getBaseTypeAndFlattenedFields(const Value *V, std::vector< LocationSet > &fields, const Value *sz)</div><div class="ttdoc">Get the base type and max offset. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIRBuilder_8cpp_source.html#l01017">SVFIRBuilder.cpp:1017</a></div></div>
|
|
@@ -2464,7 +2465,7 @@ Private Attributes</h2></td></tr>
|
|
|
2464
2465
|
<p>src should not point to anything yet </p>
|
|
2465
2466
|
|
|
2466
2467
|
<p class="definition">Definition at line <a class="el" href="SVFIRBuilder_8cpp_source.html#l00453">453</a> of file <a class="el" href="SVFIRBuilder_8cpp_source.html">SVFIRBuilder.cpp</a>.</p>
|
|
2467
|
-
<div class="fragment"><div class="line"><a name="l00455"></a><span class="lineno"> 455</span> {</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"global "</span> << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a7486fd8e5350879ed1cbd835c0d4e191">SVFUtil::value2String</a>(gvar) << <span class="stringliteral">" constant initializer: "</span> << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a7486fd8e5350879ed1cbd835c0d4e191">SVFUtil::value2String</a>(C) << <span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="keywordflow">if</span> (C->getType()->isSingleValueType())</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  {</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(C);</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <span class="comment">// get the field value if it is avaiable, otherwise we create a dummy field node.</span></div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a15105737c91d01ba9daf2161fad220ef">setCurrentLocation</a>(gvar, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> field = <a class="code" href="classSVF_1_1SVFIRBuilder.html#afd86b94574632e927a5764df74f9e555">getGlobalVarField</a>(gvar, <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a>, C->getType());</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span> </div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keywordflow">if</span> (SVFUtil::isa<GlobalVariable>(C) || SVFUtil::isa<Function>(C))</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  {</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a15105737c91d01ba9daf2161fad220ef">setCurrentLocation</a>(C, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(src, field);</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  }</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<ConstantExpr>(C))</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  {</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="comment">// add gep edge of C1 itself is a constant expression</span></div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5adf8baa546292434ba1fec48db2d0a7">processCE</a>(C);</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a15105737c91d01ba9daf2161fad220ef">setCurrentLocation</a>(C, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(src, field);</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  }</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<BlockAddress>(C))</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  {</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <span class="comment">// blockaddress instruction (e.g. i8* blockaddress(@run_vm, %182))</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  <span class="comment">// is treated as constant data object for now, see LLVMUtil.h:397, SymbolTableInfo.cpp:674 and SVFIRBuilder.cpp:183-194</span></div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5adf8baa546292434ba1fec48db2d0a7">processCE</a>(C);</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a15105737c91d01ba9daf2161fad220ef">setCurrentLocation</a>(C, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a2a0711cb1fdd3c5c90b07ff107aff1ac">addAddrEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#ac5da3a0cbe040a45d719b6f6a23aed91">getConstantNode</a>(), src);</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  }</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  {</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a15105737c91d01ba9daf2161fad220ef">setCurrentLocation</a>(C, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(src, field);</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <span class="keywordflow">if</span> (C->getType()->isPtrOrPtrVectorTy() && src != <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#a3de9a2a565c303f68a90c32dc59febd5">getNullPtr</a>())</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a140defeb309d895394822f8780deda16">addCopyEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#a3de9a2a565c303f68a90c32dc59febd5">getNullPtr</a>(), src);</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  }</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  }</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<ConstantArray>(C) || SVFUtil::isa<ConstantStruct>(C))</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  {</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0, e = C->getNumOperands(); i != e; i++)</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  {</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> off = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a8fc42c2b02317621d6aeb3c5f52d3ee8">getFlattenedElemIdx</a>(C->getType(), i);</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ae7fcd2050a57a43bfed2c7fd1c41d250">InitialGlobal</a>(gvar, SVFUtil::cast<Constant>(C->getOperand(i)), <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> + off);</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  }</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  }</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="SVF-FE_2BasicTypes_8h.html#aca8fd472027d8636b36713a7494c88d6">ConstantData</a>* data = SVFUtil::dyn_cast<ConstantData>(C))</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  {</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#a5c051cf6a93a87a07aa1d31e302a2877">Options::ModelConsts</a>)</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  {</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="keywordflow">if</span>(<a class="code" href="SVF-FE_2BasicTypes_8h.html#a66b2dbc1be121511c3b5b264f94558d3">ConstantDataSequential</a>* seq = SVFUtil::dyn_cast<ConstantDataSequential>(data))</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  {</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i < seq->getNumElements(); i++)</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  {</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> off = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a8fc42c2b02317621d6aeb3c5f52d3ee8">getFlattenedElemIdx</a>(C->getType(), i);</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <a class="code" href="SVF-FE_2BasicTypes_8h.html#aaca93e4092f0f73619d730f18b9e65de">Constant</a>* ct = seq->getElementAsConstant(i);</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ae7fcd2050a57a43bfed2c7fd1c41d250">InitialGlobal</a>(gvar, ct, <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> + off);</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  }</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  }</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  {</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(SVFUtil::isa<ConstantAggregateZero>(data) && <span class="stringliteral">"Single value type data should have been handled!"</span>);</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  }</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  }</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  }</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  {</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="comment">//TODO:assert(SVFUtil::isa<ConstantVector>(C),"what else do we have");</span></div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  }</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span> }</div><div class="ttc" id="classSVF_1_1SVFIRBuilder_html_a2a0711cb1fdd3c5c90b07ff107aff1ac"><div class="ttname"><a href="classSVF_1_1SVFIRBuilder.html#a2a0711cb1fdd3c5c90b07ff107aff1ac">SVF::SVFIRBuilder::addAddrEdge</a></div><div class="ttdeci">AddrStmt * addAddrEdge(NodeID src, NodeID dst)</div><div class="ttdoc">Add Address edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIRBuilder_8h_source.html#l00298">SVFIRBuilder.h:298</a></div></div>
|
|
2468
|
+
<div class="fragment"><div class="line"><a name="l00455"></a><span class="lineno"> 455</span> {</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"global "</span> << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a7486fd8e5350879ed1cbd835c0d4e191">SVFUtil::value2String</a>(gvar) << <span class="stringliteral">" constant initializer: "</span> << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a7486fd8e5350879ed1cbd835c0d4e191">SVFUtil::value2String</a>(C) << <span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="keywordflow">if</span> (C->getType()->isSingleValueType())</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  {</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(C);</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <span class="comment">// get the field value if it is avaiable, otherwise we create a dummy field node.</span></div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a15105737c91d01ba9daf2161fad220ef">setCurrentLocation</a>(gvar, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> field = <a class="code" href="classSVF_1_1SVFIRBuilder.html#afd86b94574632e927a5764df74f9e555">getGlobalVarField</a>(gvar, <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a>, C->getType());</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span> </div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keywordflow">if</span> (SVFUtil::isa<GlobalVariable>(C) || SVFUtil::isa<Function>(C))</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  {</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a15105737c91d01ba9daf2161fad220ef">setCurrentLocation</a>(C, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(src, field);</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  }</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<ConstantExpr>(C))</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  {</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="comment">// add gep edge of C1 itself is a constant expression</span></div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5adf8baa546292434ba1fec48db2d0a7">processCE</a>(C);</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a15105737c91d01ba9daf2161fad220ef">setCurrentLocation</a>(C, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(src, field);</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  }</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<BlockAddress>(C))</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  {</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <span class="comment">// blockaddress instruction (e.g. i8* blockaddress(@run_vm, %182))</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  <span class="comment">// is treated as constant data object for now, see LLVMUtil.h:397, SymbolTableInfo.cpp:674 and SVFIRBuilder.cpp:183-194</span></div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5adf8baa546292434ba1fec48db2d0a7">processCE</a>(C);</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a15105737c91d01ba9daf2161fad220ef">setCurrentLocation</a>(C, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a2a0711cb1fdd3c5c90b07ff107aff1ac">addAddrEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#ac5da3a0cbe040a45d719b6f6a23aed91">getConstantNode</a>(), src);</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  }</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  {</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a15105737c91d01ba9daf2161fad220ef">setCurrentLocation</a>(C, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(src, field);</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <span class="keywordflow">if</span> (C->getType()->isPtrOrPtrVectorTy() && src != <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#a3de9a2a565c303f68a90c32dc59febd5">getNullPtr</a>())</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a140defeb309d895394822f8780deda16">addCopyEdge</a>(<a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#a3de9a2a565c303f68a90c32dc59febd5">getNullPtr</a>(), src);</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  }</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  }</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<ConstantArray>(C) || SVFUtil::isa<ConstantStruct>(C))</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  {</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0, e = C->getNumOperands(); i != e; i++)</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  {</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> off = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a8fc42c2b02317621d6aeb3c5f52d3ee8">getFlattenedElemIdx</a>(C->getType(), i);</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ae7fcd2050a57a43bfed2c7fd1c41d250">InitialGlobal</a>(gvar, SVFUtil::cast<Constant>(C->getOperand(i)), <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> + off);</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  }</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  }</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="SVF-FE_2BasicTypes_8h.html#aca8fd472027d8636b36713a7494c88d6">ConstantData</a>* data = SVFUtil::dyn_cast<ConstantData>(C))</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  {</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#a5c051cf6a93a87a07aa1d31e302a2877">Options::ModelConsts</a>)</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  {</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="keywordflow">if</span>(<a class="code" href="SVF-FE_2BasicTypes_8h.html#a66b2dbc1be121511c3b5b264f94558d3">ConstantDataSequential</a>* seq = SVFUtil::dyn_cast<ConstantDataSequential>(data))</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  {</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <span class="keywordflow">for</span>(<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i < seq->getNumElements(); i++)</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  {</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> off = <a class="code" href="classSVF_1_1SymbolTableInfo.html#a267169023fc4f8dd66b145f7231fec11">SymbolTableInfo::SymbolInfo</a>()-><a class="code" href="classSVF_1_1SymbolTableInfo.html#a8fc42c2b02317621d6aeb3c5f52d3ee8">getFlattenedElemIdx</a>(C->getType(), i);</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <a class="code" href="SVF-FE_2BasicTypes_8h.html#aaca93e4092f0f73619d730f18b9e65de">Constant</a>* ct = seq->getElementAsConstant(i);</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#ae7fcd2050a57a43bfed2c7fd1c41d250">InitialGlobal</a>(gvar, ct, <a class="code" href="cJSON_8cpp.html#a95bf816579e97b6f33bdb5e25ed6d5de">offset</a> + off);</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  }</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  }</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  {</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>((SVFUtil::isa<ConstantAggregateZero>(data) || SVFUtil::isa<UndefValue>(data)) && <span class="stringliteral">"Single value type data should have been handled!"</span>);</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  }</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  }</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  }</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  {</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="comment">//TODO:assert(SVFUtil::isa<ConstantVector>(C),"what else do we have");</span></div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  }</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span> }</div><div class="ttc" id="classSVF_1_1SVFIRBuilder_html_a2a0711cb1fdd3c5c90b07ff107aff1ac"><div class="ttname"><a href="classSVF_1_1SVFIRBuilder.html#a2a0711cb1fdd3c5c90b07ff107aff1ac">SVF::SVFIRBuilder::addAddrEdge</a></div><div class="ttdeci">AddrStmt * addAddrEdge(NodeID src, NodeID dst)</div><div class="ttdoc">Add Address edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIRBuilder_8h_source.html#l00298">SVFIRBuilder.h:298</a></div></div>
|
|
2468
2469
|
<div class="ttc" id="classSVF_1_1Options_html_a5c051cf6a93a87a07aa1d31e302a2877"><div class="ttname"><a href="classSVF_1_1Options.html#a5c051cf6a93a87a07aa1d31e302a2877">SVF::Options::ModelConsts</a></div><div class="ttdeci">static const llvm::cl::opt< bool > ModelConsts</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00216">Options.h:216</a></div></div>
|
|
2469
2470
|
<div class="ttc" id="classSVF_1_1SVFIRBuilder_html_acc69fc638380f34164db649d9bf2a7d6"><div class="ttname"><a href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">SVF::SVFIRBuilder::getValueNode</a></div><div class="ttdeci">NodeID getValueNode(const Value *V)</div><div class="ttdoc">Get different kinds of node. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIRBuilder_8h_source.html#l00087">SVFIRBuilder.h:87</a></div></div>
|
|
2470
2471
|
<div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00019">MTAResultValidator.h:19</a></div></div>
|