svf-tools 1.0.487 → 1.0.490
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/CFGNormalizer_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/CFGNormalizer_8h_source.html +7 -7
- package/SVF-doxygen/html/html/ExtAPI_8cpp.html +5 -5
- package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +16 -16
- package/SVF-doxygen/html/html/ExtAPI_8h_source.html +14 -14
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFUtil_8h_source.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1CFGNormalizer.html +21 -21
- package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +37 -37
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +3 -3
- package/include/Util/ExtAPI.json +6 -6
- package/lib/CFL/CFGNormalizer.cpp +12 -14
- package/lib/SVF-FE/SVFIRBuilder.cpp +2 -2
- package/lib/Util/ExtAPI.cpp +14 -20
- package/package.json +1 -1
|
@@ -2237,7 +2237,7 @@ Private Attributes</h2></td></tr>
|
|
|
2237
2237
|
<p>TODO: inter-procedural <a class="el" href="classSVF_1_1SVFIR.html">SVFIR</a> edges for thread joins </p>
|
|
2238
2238
|
|
|
2239
2239
|
<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> srcNode = <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> dstNode = <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> (srcNode && dstNode)</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a140defeb309d895394822f8780deda16">addCopyEdge</a>(srcNode, dstNode);</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> vnD = <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> vnS = <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> (vnD && vnS)</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> vnD = <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> vnS = <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> arg0 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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> arg1 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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> arg2 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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>(arg0), dstFields, cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg2));</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>(arg0), 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>(arg1)), 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>(arg0)), <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> arg0 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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> arg1 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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> arg2 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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>(arg0), cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg1), cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg2));</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>(arg0), cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg1), <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> arg0 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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>(arg0);</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#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg0 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</a>(args[0]);</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg1 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</a>(args[1]);</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *vArg1 = cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg0);</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *vArg3 = cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg1);</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span> </div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</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="l01351"></a><span class="lineno"> 1351</span>  <span class="comment">// Now we calculate the offset from base to vArg3</span></div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnArg3 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(vArg3);</div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</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>(vnArg3).<a class="code" href="classSVF_1_1LocationSet.html#a63c5c8e03b35e0d0cea94137d309c853">accumulateConstantFieldIdx</a>();</div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span> </div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  <span class="comment">// We get all flattened fields of base</span></div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  vector<LocationSet> fields;</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</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>(vArg3, fields, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</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="l01359"></a><span class="lineno"> 1359</span> </div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</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="l01361"></a><span class="lineno"> 1361</span>  <span class="comment">// Note that arg0 is aligned with "offset".</span></div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</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="l01363"></a><span class="lineno"> 1363</span>  {</div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</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="l01365"></a><span class="lineno"> 1365</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</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="l01367"></a><span class="lineno"> 1367</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a74cff1c31f2fd1d23709b34ae988c29a">getGepValVar</a>(vArg3, fields[i], elementType);</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(vArg1);</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  <span class="keywordflow">if</span> (vnD && vnS)</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(vnS, vnD);</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="keywordflow">break</span>;</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  }</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  <span class="comment">// default</span></div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  <span class="comment">// illegal function operation of external function</span></div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</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="l01377"></a><span class="lineno"> 1377</span>  <span class="keywordflow">default</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>  <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="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>  }</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  }</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  <span class="comment">// // The external function doesn't exist in ExtAPI.json</span></div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  {</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> str;</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  <a class="code" href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">raw_string_ostream</a> rawstr(str);</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</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="l01390"></a><span class="lineno"> 1390</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(rawstr.str());</div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>  }</div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  }</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span> </div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a5c2abeb363081381c3dc939ab511e3f0">isThreadForkCall</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>  <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="l01398"></a><span class="lineno"> 1398</span>  {</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</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="l01400"></a><span class="lineno"> 1400</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="l01403"></a><span class="lineno"> 1403</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="l01404"></a><span class="lineno"> 1404</span>  <span class="keywordflow">if</span> (forkedFun->arg_size() <= 2 && forkedFun->arg_size() >= 1)</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>  {</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</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="l01408"></a><span class="lineno"> 1408</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>(actualParm->getType()) && SVFUtil::isa<PointerType>(formalParm->getType()))</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  {</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</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="l01411"></a><span class="lineno"> 1411</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="l01412"></a><span class="lineno"> 1412</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="l01413"></a><span class="lineno"> 1413</span>  }</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  }</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  }</div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  {</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>  }</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  }</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span> </div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</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="l01430"></a><span class="lineno"> 1430</span>  {</div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</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="l01432"></a><span class="lineno"> 1432</span>  {</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</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="l01435"></a><span class="lineno"> 1435</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="l01436"></a><span class="lineno"> 1436</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="l01438"></a><span class="lineno"> 1438</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>(actualParm->getType()) && SVFUtil::isa<PointerType>(formalParm->getType()))</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  {</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</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="l01441"></a><span class="lineno"> 1441</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="l01442"></a><span class="lineno"> 1442</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="l01443"></a><span class="lineno"> 1443</span>  }</div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  }</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>  {</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>  }</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  }</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span> </div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>  }</div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</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>
|
|
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> srcNode = <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> dstNode = <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> (srcNode && dstNode)</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a140defeb309d895394822f8780deda16">addCopyEdge</a>(srcNode, dstNode);</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> vnD = <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> vnS = <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> (vnD && vnS)</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> arg0 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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> arg1 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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> arg2 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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>(arg0), dstFields, cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg2));</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>(arg0), 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>(arg1)), 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>(arg0)), <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> arg0 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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> arg1 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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> arg2 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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>(arg0), cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg1), cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg2));</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>(arg0), cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg1), <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> arg0 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</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>(arg0);</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#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg0 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</a>(args[0]);</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> arg1 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a5a32ac717149467730240303f526a71e">getArgIndex</a>(args[1]);</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>  <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *vArg1 = cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg0);</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>  <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *vArg3 = cs.<a class="code" href="classSVF_1_1CallSite.html#a26a594d36bbb5b77e7085502812d9ca2">getArgument</a>(arg1);</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span> </div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</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="l01351"></a><span class="lineno"> 1351</span>  <span class="comment">// Now we calculate the offset from base to vArg3</span></div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnArg3 = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a4ea94b0a8d6da904ff9a6c1b0341b9cb">pag</a>-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(vArg3);</div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</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>(vnArg3).<a class="code" href="classSVF_1_1LocationSet.html#a63c5c8e03b35e0d0cea94137d309c853">accumulateConstantFieldIdx</a>();</div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span> </div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>  <span class="comment">// We get all flattened fields of base</span></div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>  vector<LocationSet> fields;</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</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>(vArg3, fields, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</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="l01359"></a><span class="lineno"> 1359</span> </div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</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="l01361"></a><span class="lineno"> 1361</span>  <span class="comment">// Note that arg0 is aligned with "offset".</span></div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</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="l01363"></a><span class="lineno"> 1363</span>  {</div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</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="l01365"></a><span class="lineno"> 1365</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</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="l01367"></a><span class="lineno"> 1367</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnD = <a class="code" href="classSVF_1_1SVFIRBuilder.html#a74cff1c31f2fd1d23709b34ae988c29a">getGepValVar</a>(vArg3, fields[i], elementType);</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnS = <a class="code" href="classSVF_1_1SVFIRBuilder.html#acc69fc638380f34164db649d9bf2a7d6">getValueNode</a>(vArg1);</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>  <span class="keywordflow">if</span> (vnD && vnS)</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>  <a class="code" href="classSVF_1_1SVFIRBuilder.html#a30f043eeca79259d84b97e265110f018">addStoreEdge</a>(vnS, vnD);</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="keywordflow">break</span>;</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>  }</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>  <span class="comment">// default</span></div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>  <span class="comment">// illegal function operation of external function</span></div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</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="l01377"></a><span class="lineno"> 1377</span>  <span class="keywordflow">default</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>  <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="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>  }</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>  }</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>  <span class="comment">// // The external function doesn't exist in ExtAPI.json</span></div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>  {</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> str;</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>  <a class="code" href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">raw_string_ostream</a> rawstr(str);</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</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="l01390"></a><span class="lineno"> 1390</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(rawstr.str());</div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>  }</div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>  }</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span> </div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a5c2abeb363081381c3dc939ab511e3f0">isThreadForkCall</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>  <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="l01398"></a><span class="lineno"> 1398</span>  {</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</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="l01400"></a><span class="lineno"> 1400</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="l01403"></a><span class="lineno"> 1403</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="l01404"></a><span class="lineno"> 1404</span>  <span class="keywordflow">if</span> (forkedFun->arg_size() <= 2 && forkedFun->arg_size() >= 1)</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>  {</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</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="l01408"></a><span class="lineno"> 1408</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>(actualParm->getType()) && SVFUtil::isa<PointerType>(formalParm->getType()))</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>  {</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</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="l01411"></a><span class="lineno"> 1411</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="l01412"></a><span class="lineno"> 1412</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="l01413"></a><span class="lineno"> 1413</span>  }</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>  }</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>  }</div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>  {</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>  }</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>  }</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span> </div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</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="l01430"></a><span class="lineno"> 1430</span>  {</div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</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="l01432"></a><span class="lineno"> 1432</span>  {</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</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="l01435"></a><span class="lineno"> 1435</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="l01436"></a><span class="lineno"> 1436</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="l01438"></a><span class="lineno"> 1438</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>(actualParm->getType()) && SVFUtil::isa<PointerType>(formalParm->getType()))</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>  {</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</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="l01441"></a><span class="lineno"> 1441</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="l01442"></a><span class="lineno"> 1442</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="l01443"></a><span class="lineno"> 1443</span>  }</div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>  }</div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>  {</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>  }</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>  }</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span> </div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>  }</div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</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
2241
|
<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
2242
|
<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
2243
|
<div class="ttc" id="cJSON_8h_html_a750b5d744c39a06bfb13e6eb010e35d0"><div class="ttname"><a href="cJSON_8h.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a></div><div class="ttdeci">int index</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00170">cJSON.h:170</a></div></div>
|
|
@@ -2293,7 +2293,7 @@ Private Attributes</h2></td></tr>
|
|
|
2293
2293
|
<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
2294
|
<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
2295
|
<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#
|
|
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
2297
|
<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
2298
|
<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
2299
|
<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>
|
|
@@ -2312,7 +2312,7 @@ Private Attributes</h2></td></tr>
|
|
|
2312
2312
|
<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
2313
|
<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
2314
|
<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#
|
|
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#l00179">ExtAPI.cpp:179</a></div></div>
|
|
2316
2316
|
<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
2317
|
<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
2318
|
<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>
|
package/include/Util/ExtAPI.json
CHANGED
|
@@ -3194,32 +3194,32 @@
|
|
|
3194
3194
|
"_ZNSsC1EPKcRKSaIcE":{
|
|
3195
3195
|
"type": "CPP_EFT_A0R_A1",
|
|
3196
3196
|
"overwrite_app_function": 0,
|
|
3197
|
-
"store": ["
|
|
3197
|
+
"store": ["A1", "A0"]
|
|
3198
3198
|
},
|
|
3199
3199
|
"_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_":{
|
|
3200
3200
|
"type": "CPP_EFT_A0R_A1",
|
|
3201
3201
|
"overwrite_app_function": 0,
|
|
3202
|
-
"store": ["
|
|
3202
|
+
"store": ["A1", "A0"]
|
|
3203
3203
|
},
|
|
3204
3204
|
"_ZNSsC1EPKcmRKSaIcE":{
|
|
3205
3205
|
"type": "CPP_EFT_A0R_A1",
|
|
3206
3206
|
"overwrite_app_function": 0,
|
|
3207
|
-
"store": ["
|
|
3207
|
+
"store": ["A1", "A0"]
|
|
3208
3208
|
},
|
|
3209
3209
|
"_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcmRKS3_":{
|
|
3210
3210
|
"type": "CPP_EFT_A0R_A1",
|
|
3211
3211
|
"overwrite_app_function": 0,
|
|
3212
|
-
"store": ["
|
|
3212
|
+
"store": ["A1", "A0"]
|
|
3213
3213
|
},
|
|
3214
3214
|
"_ZNSsaSEPKc":{
|
|
3215
3215
|
"type": "CPP_EFT_A0R_A1",
|
|
3216
3216
|
"overwrite_app_function": 0,
|
|
3217
|
-
"store": ["
|
|
3217
|
+
"store": ["A1", "A0"]
|
|
3218
3218
|
},
|
|
3219
3219
|
"_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEPKc":{
|
|
3220
3220
|
"type": "CPP_EFT_A0R_A1",
|
|
3221
3221
|
"overwrite_app_function": 0,
|
|
3222
|
-
"store": ["
|
|
3222
|
+
"store": ["A1", "A0"]
|
|
3223
3223
|
},
|
|
3224
3224
|
"_ZNSsC1ERKSs":{
|
|
3225
3225
|
"type": "CPP_EFT_A0R_A1R",
|
|
@@ -96,10 +96,11 @@ void CFGNormalizer::ebnf_bin(CFLGrammar *grammar)
|
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
auto
|
|
99
|
+
auto rawProductions = grammar->getRawProductions();
|
|
100
100
|
|
|
101
|
-
for(auto
|
|
101
|
+
for(auto itr : rawProductions)
|
|
102
102
|
{
|
|
103
|
+
auto head = *(grammar->getRawProductions().find(itr.first));
|
|
103
104
|
for(auto rule: head.second)
|
|
104
105
|
{
|
|
105
106
|
if (rule.size() < 3) continue;
|
|
@@ -203,20 +204,17 @@ void CFGNormalizer::ebnf_bin(CFLGrammar *grammar)
|
|
|
203
204
|
RHX = tempSym;
|
|
204
205
|
}
|
|
205
206
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
for (auto new_head : new_grammar)
|
|
210
|
+
{
|
|
211
|
+
for (auto prod : new_head.second)
|
|
212
|
+
{
|
|
213
|
+
auto it = grammar->getRawProductions()[new_head.first].find(prod);
|
|
214
|
+
if (it == grammar->getRawProductions()[new_head.first].end())
|
|
209
215
|
{
|
|
210
|
-
|
|
211
|
-
{
|
|
212
|
-
auto it = grammar->getRawProductions()[new_head.first].find(prod);
|
|
213
|
-
if (it == grammar->getRawProductions()[new_head.first].end())
|
|
214
|
-
{
|
|
215
|
-
grammar->getRawProductions()[new_head.first].insert(prod);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
216
|
+
grammar->getRawProductions()[new_head.first].insert(prod);
|
|
218
217
|
}
|
|
219
|
-
|
|
220
218
|
}
|
|
221
219
|
}
|
|
222
220
|
}
|
|
@@ -1275,9 +1275,9 @@ void SVFIRBuilder::handleExtCall(CallSite cs, const SVFFunction *callee)
|
|
|
1275
1275
|
}
|
|
1276
1276
|
case ExtAPI::EXT_LOADSTORE:
|
|
1277
1277
|
{
|
|
1278
|
-
NodeID
|
|
1278
|
+
NodeID vnS = parseNode(args[0], cs, inst);
|
|
1279
1279
|
NodeID vnV = parseNode(args[1], cs, inst);
|
|
1280
|
-
NodeID
|
|
1280
|
+
NodeID vnD = parseNode(args[2], cs, inst);
|
|
1281
1281
|
if (vnD && vnV && vnS)
|
|
1282
1282
|
{
|
|
1283
1283
|
addLoadEdge(vnS, vnV);
|