svf-tools 1.0.861 → 1.0.862

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.
@@ -411,225 +411,227 @@ $(function() {
411
411
  <div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="keywordflow">if</span> (canUpdate)</div>
412
412
  <div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; {</div>
413
413
  <div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const Type *&gt;</a> types;</div>
414
- <div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; std::transform(infersites.begin(), infersites.end(), std::inserter(types, types.begin()),</div>
415
- <div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#a19b8626948c43f4ce19dbc69742d309e">infersiteToType</a>);</div>
416
- <div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; _valueToInferSites[curValue] = infersites;</div>
417
- <div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; _valueToType[curValue] = selectLargestType(types);</div>
418
- <div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; }</div>
419
- <div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; }</div>
420
- <div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = _valueToType[startValue];</div>
421
- <div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> == <span class="keyword">nullptr</span>)</div>
422
- <div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; {</div>
423
- <div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = defaultType(startValue);</div>
424
- <div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#ac48ef12f2a6f605d6fa5d31e7623a826">WARN_MSG</a>(<span class="stringliteral">&quot;Using default type, trace ID is &quot;</span> + std::to_string(traceId) + <span class="stringliteral">&quot;:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(startValue));</div>
425
- <div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; }</div>
426
- <div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#a7165377d2fbd76a86ed0ec5218712c78">ABORT_IFNOT</a>(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>, <span class="stringliteral">&quot;type cannot be a null ptr&quot;</span>);</div>
427
- <div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="keywordflow">return</span> <a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>;</div>
428
- <div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160;}</div>
429
- <div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; </div>
430
- <div class="line"><a name="l00376"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#a707f0575f3d70e62a78f08c961ec7dae"> 376</a></span>&#160;<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const Value *&gt;</a> <a class="code" href="classSVF_1_1ObjTypeInference.html#a707f0575f3d70e62a78f08c961ec7dae">ObjTypeInference::bwfindAllocations</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *startValue)</div>
431
- <div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160;{</div>
432
- <div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; </div>
433
- <div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="comment">// consult cache</span></div>
434
- <div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; <span class="keyword">auto</span> tIt = _valueToAllocs.find(startValue);</div>
435
- <div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="keywordflow">if</span> (tIt != _valueToAllocs.end())</div>
436
- <div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; {</div>
437
- <div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#a482b3cc567fd28e9a30e7594c100149f">WARN_IFNOT</a>(!tIt-&gt;second.empty(), <span class="stringliteral">&quot;empty type:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(startValue));</div>
438
- <div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; <span class="keywordflow">return</span> !tIt-&gt;second.empty() ? tIt-&gt;second : <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const Value *&gt;</a>({startValue});</div>
439
- <div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; }</div>
440
- <div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; </div>
441
- <div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; <span class="comment">// simulate the call stack, the second element indicates whether we should update sources for current value</span></div>
442
- <div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; <a class="code" href="classSVF_1_1FILOWorkList.html">FILOWorkList&lt;ValueBoolPair&gt;</a> workList;</div>
443
- <div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;ValueBoolPair&gt;</a> visited;</div>
444
- <div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; workList.<a class="code" href="classSVF_1_1FILOWorkList.html#afcf3fcda18e8d3e2bad70a51376c0ce1">push</a>({startValue, <span class="keyword">false</span>});</div>
445
- <div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="keywordflow">while</span> (!workList.<a class="code" href="classSVF_1_1FILOWorkList.html#a071a624c91def82a4bbbf3806c7b7eea">empty</a>())</div>
446
- <div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; {</div>
447
- <div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="keyword">auto</span> curPair = workList.<a class="code" href="classSVF_1_1FILOWorkList.html#a3fd9acb6d09fd142bfd402fdf8cac93b">pop</a>();</div>
448
- <div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="keywordflow">if</span> (visited.count(curPair)) <span class="keywordflow">continue</span>;</div>
449
- <div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; visited.insert(curPair);</div>
450
- <div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *curValue = curPair.first;</div>
451
- <div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; <span class="keywordtype">bool</span> canUpdate = curPair.second;</div>
452
- <div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; </div>
453
- <div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const Value *&gt;</a> sources;</div>
454
- <div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="keyword">auto</span> insertAllocs = [&amp;sources, &amp;canUpdate](<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *source)</div>
455
- <div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; {</div>
456
- <div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="keywordflow">if</span> (canUpdate) sources.insert(source);</div>
457
- <div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; };</div>
458
- <div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="keyword">auto</span> insertAllocsOrPushWorklist = [<span class="keyword">this</span>, &amp;sources, &amp;workList, &amp;canUpdate](<span class="keyword">const</span> <span class="keyword">auto</span> &amp;pUser)</div>
459
- <div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; {</div>
460
- <div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="keyword">auto</span> vIt = _valueToAllocs.find(pUser);</div>
461
- <div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keywordflow">if</span> (canUpdate)</div>
462
- <div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; {</div>
463
- <div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="keywordflow">if</span> (vIt != _valueToAllocs.end() &amp;&amp; !vIt-&gt;second.empty())</div>
464
- <div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; {</div>
465
- <div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; sources.insert(vIt-&gt;second.begin(), vIt-&gt;second.end());</div>
466
- <div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; }</div>
467
- <div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; }</div>
468
- <div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="keywordflow">else</span></div>
469
- <div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; {</div>
470
- <div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <span class="keywordflow">if</span> (vIt == _valueToAllocs.end()) workList.push({pUser, <span class="keyword">false</span>});</div>
471
- <div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; }</div>
472
- <div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; };</div>
473
- <div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; </div>
474
- <div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keywordflow">if</span> (!canUpdate &amp;&amp; !_valueToAllocs.count(curValue))</div>
475
- <div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; {</div>
476
- <div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; workList.<a class="code" href="classSVF_1_1FILOWorkList.html#afcf3fcda18e8d3e2bad70a51376c0ce1">push</a>({curValue, <span class="keyword">true</span>});</div>
477
- <div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; }</div>
478
- <div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; </div>
479
- <div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; <span class="keywordflow">if</span> (isAllocation(curValue))</div>
480
- <div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; {</div>
481
- <div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; insertAllocs(curValue);</div>
482
- <div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; }</div>
483
- <div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#afc50da46a6ea7c2cf61683bbec4d7c8d">BitCastInst</a> *bitCastInst = SVFUtil::dyn_cast&lt;BitCastInst&gt;(curValue))</div>
484
- <div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; {</div>
485
- <div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *prevVal = bitCastInst-&gt;getOperand(0);</div>
486
- <div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; insertAllocsOrPushWorklist(prevVal);</div>
487
- <div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; }</div>
488
- <div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ac8d4990439af7a2ecca7e15383119674">PHINode</a> *phiNode = SVFUtil::dyn_cast&lt;PHINode&gt;(curValue))</div>
489
- <div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; {</div>
490
- <div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i &lt; phiNode-&gt;getNumOperands(); ++i)</div>
491
- <div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; {</div>
492
- <div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; insertAllocsOrPushWorklist(phiNode-&gt;getOperand(i));</div>
493
- <div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; }</div>
494
- <div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; }</div>
495
- <div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5a6e8ab900d5cd17ef72661006a7fbe0">LoadInst</a> *loadInst = SVFUtil::dyn_cast&lt;LoadInst&gt;(curValue))</div>
496
- <div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; {</div>
497
- <div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &amp;use: loadInst-&gt;getPointerOperand()-&gt;uses())</div>
498
- <div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; {</div>
499
- <div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab696aab940eb187dc81217efe8649af5">StoreInst</a> *storeInst = SVFUtil::dyn_cast&lt;StoreInst&gt;(use.getUser()))</div>
500
- <div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; {</div>
501
- <div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="keywordflow">if</span> (storeInst-&gt;getPointerOperand() == loadInst-&gt;getPointerOperand())</div>
502
- <div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; {</div>
503
- <div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; insertAllocsOrPushWorklist(storeInst-&gt;getValueOperand());</div>
504
- <div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; }</div>
505
- <div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; }</div>
506
- <div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; }</div>
507
- <div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; }</div>
508
- <div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a58cdfbc4160cae08745b67844ac29801">Argument</a> *argument = SVFUtil::dyn_cast&lt;Argument&gt;(curValue))</div>
509
- <div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; {</div>
510
- <div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &amp;use: argument-&gt;getParent()-&gt;uses())</div>
511
- <div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; {</div>
512
- <div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a> *callBase = SVFUtil::dyn_cast&lt;CallBase&gt;(use.getUser()))</div>
513
- <div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; {</div>
514
- <div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="comment">// skip function as parameter</span></div>
515
- <div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="comment">// e.g., call void @foo(%struct.ssl_ctx_st* %9, i32 (i8*, i32, i32, i8*)* @passwd_callback)</span></div>
516
- <div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="keywordflow">if</span> (callBase-&gt;getCalledFunction() != argument-&gt;getParent()) <span class="keywordflow">continue</span>;</div>
517
- <div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> pos = argument-&gt;getParent()-&gt;isVarArg() ? 0 : argument-&gt;getArgNo();</div>
518
- <div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; insertAllocsOrPushWorklist(callBase-&gt;getArgOperand(pos));</div>
519
- <div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; }</div>
520
- <div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; }</div>
521
- <div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; }</div>
522
- <div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a> *callBase = SVFUtil::dyn_cast&lt;CallBase&gt;(curValue))</div>
523
- <div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; {</div>
524
- <div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#a7165377d2fbd76a86ed0ec5218712c78">ABORT_IFNOT</a>(!callBase-&gt;doesNotReturn(), <span class="stringliteral">&quot;callbase does not return:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(callBase));</div>
525
- <div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *callee = callBase-&gt;getCalledFunction())</div>
526
- <div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; {</div>
527
- <div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="keywordflow">if</span> (!callee-&gt;isDeclaration())</div>
528
- <div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; {</div>
529
- <div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *svfFunc = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;<a class="code" href="classSVF_1_1LLVMModuleSet.html#a50fc24901350df9db890ba16a9b87e33">getSVFFunction</a>(callee);</div>
530
- <div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *pValue = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;<a class="code" href="classSVF_1_1LLVMModuleSet.html#aaf9b679407f12b93afc53c157d37b444">getLLVMValue</a>(svfFunc-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4c28c8d205d354f3a982119f29f2aac">getExitBB</a>()-&gt;<a class="code" href="classSVF_1_1SVFBasicBlock.html#ad05f85ce931d4479f71d1947a25599dc">back</a>());</div>
531
- <div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ac7dcc6103dee3a0bbc2fd2e02716a154">ReturnInst</a> *retInst = SVFUtil::dyn_cast&lt;ReturnInst&gt;(pValue);</div>
532
- <div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#a7165377d2fbd76a86ed0ec5218712c78">ABORT_IFNOT</a>(retInst &amp;&amp; retInst-&gt;getReturnValue(), <span class="stringliteral">&quot;not return inst?&quot;</span>);</div>
533
- <div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; insertAllocsOrPushWorklist(retInst-&gt;getReturnValue());</div>
534
- <div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; }</div>
535
- <div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; }</div>
536
- <div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; }</div>
537
- <div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <span class="keywordflow">if</span> (canUpdate)</div>
538
- <div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; {</div>
539
- <div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; _valueToAllocs[curValue] = sources;</div>
540
- <div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; }</div>
541
- <div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; }</div>
542
- <div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const Value *&gt;</a> srcs = _valueToAllocs[startValue];</div>
543
- <div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <span class="keywordflow">if</span> (srcs.empty())</div>
544
- <div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; {</div>
545
- <div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; srcs = {startValue};</div>
546
- <div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#ac48ef12f2a6f605d6fa5d31e7623a826">WARN_MSG</a>(<span class="stringliteral">&quot;Using default type, trace ID is &quot;</span> + std::to_string(traceId) + <span class="stringliteral">&quot;:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(startValue));</div>
547
- <div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; }</div>
548
- <div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#a7165377d2fbd76a86ed0ec5218712c78">ABORT_IFNOT</a>(!srcs.empty(), <span class="stringliteral">&quot;sources cannot be empty&quot;</span>);</div>
549
- <div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; <span class="keywordflow">return</span> srcs;</div>
550
- <div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160;}</div>
551
- <div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; </div>
552
- <div class="line"><a name="l00498"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#af8113e432377917c1a0de9ab100aaafe"> 498</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ObjTypeInference.html#af8113e432377917c1a0de9ab100aaafe">ObjTypeInference::isAllocation</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">SVF::Value</a> *val)</div>
553
- <div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160;{</div>
554
- <div class="line"><a name="l00500"></a><span class="lineno"> 500</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceSVF_1_1LLVMUtil.html#aca11801ed6ef6ff8d2a1e85bc0fc5794">LLVMUtil::isObject</a>(val);</div>
555
- <div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160;}</div>
556
- <div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; </div>
557
- <div class="line"><a name="l00507"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#afe926ee3427bb329d189e0c40bb1cd60"> 507</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1ObjTypeInference.html#afe926ee3427bb329d189e0c40bb1cd60">ObjTypeInference::validateTypeCheck</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a> *cs)</div>
558
- <div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160;{</div>
559
- <div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *func = cs-&gt;getCalledFunction())</div>
560
- <div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; {</div>
561
- <div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="keywordflow">if</span> (func-&gt;getName().find(<a class="code" href="ObjTypeInference_8cpp.html#a5f334de99eb942058f27a1025c346f70">TYPEMALLOC</a>) != std::string::npos)</div>
562
- <div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; {</div>
563
- <div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *objType = fwInferObjType(cs);</div>
564
- <div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a> *pInt =</div>
565
- <div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; SVFUtil::dyn_cast&lt;llvm::ConstantInt&gt;(cs-&gt;getOperand(1));</div>
566
- <div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; assert(pInt &amp;&amp; <span class="stringliteral">&quot;the second argument is a integer&quot;</span>);</div>
567
- <div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> iTyNum = objTyToNumFields(objType);</div>
568
- <div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keywordflow">if</span> (iTyNum &gt;= pInt-&gt;getZExtValue())</div>
569
- <div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a05dc00b2bd9a8176aae31b6cfffe725d">SVFUtil::sucMsg</a>(<span class="stringliteral">&quot;\t SUCCESS :&quot;</span>) &lt;&lt; <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(cs)</div>
570
- <div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a4550f2fb815882edfb666ac818792064">SVFUtil::pasMsg</a>(<span class="stringliteral">&quot; TYPE: &quot;</span>)</div>
571
- <div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; &lt;&lt; <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a6e8682537cf5bed808df439bd7e1add9">dumpType</a>(objType) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div>
572
- <div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <span class="keywordflow">else</span></div>
573
- <div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; {</div>
574
- <div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a7655b13bbfe720ca2b8a25e0a72528e6">SVFUtil::errMsg</a>(<span class="stringliteral">&quot;\t FAILURE :&quot;</span>) &lt;&lt; <span class="stringliteral">&quot;:&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(cs) &lt;&lt; <span class="stringliteral">&quot; TYPE: &quot;</span></div>
575
- <div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; &lt;&lt; <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a6e8682537cf5bed808df439bd7e1add9">dumpType</a>(objType) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div>
576
- <div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; abort();</div>
577
- <div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; }</div>
578
- <div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; }</div>
579
- <div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; }</div>
580
- <div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160;}</div>
581
- <div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; </div>
582
- <div class="line"><a name="l00532"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#a99eaaef89f214fc8587349361600b44d"> 532</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1ObjTypeInference.html#a99eaaef89f214fc8587349361600b44d">ObjTypeInference::typeSizeDiffTest</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aa962cc1d782cc46553251e96b64a754b">PointerType</a> *oPTy, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *iTy, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *val)</div>
583
- <div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160;{</div>
584
- <div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160;<span class="preprocessor">#if TYPE_DEBUG</span></div>
585
- <div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160; <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *oTy = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#abba4111230f6009bbf50518ee36a9870">getPtrElementType</a>(oPTy);</div>
586
- <div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> iTyNum = objTyToNumFields(iTy);</div>
587
- <div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1LLVMUtil.html#ab5b55fce942ab6d7995541f3fe0503f8">getNumOfElements</a>(oTy) &gt; iTyNum)</div>
588
- <div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; {</div>
589
- <div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#aa73dde570491da218d3ef11359f16955">ERR_MSG</a>(<span class="stringliteral">&quot;original type is:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a6e8682537cf5bed808df439bd7e1add9">dumpType</a>(oTy));</div>
590
- <div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#aa73dde570491da218d3ef11359f16955">ERR_MSG</a>(<span class="stringliteral">&quot;infered type is:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a6e8682537cf5bed808df439bd7e1add9">dumpType</a>(iTy));</div>
591
- <div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#a54176d0866e198769367b0dc65e049b5">ABORT_MSG</a>(<span class="stringliteral">&quot;wrong type, trace ID is &quot;</span> + std::to_string(traceId) + <span class="stringliteral">&quot;:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(val));</div>
592
- <div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; }</div>
593
- <div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160;<span class="preprocessor">#endif</span></div>
594
- <div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160;}</div>
595
- <div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; </div>
596
- <div class="line"><a name="l00546"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#a72da2d7f06e8fee67dc5b3c451fa5dee"> 546</a></span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1ObjTypeInference.html#a72da2d7f06e8fee67dc5b3c451fa5dee">ObjTypeInference::getArgPosInCall</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a> *callBase, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *arg)</div>
597
- <div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160;{</div>
598
- <div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; assert(callBase-&gt;hasArgument(arg) &amp;&amp; <span class="stringliteral">&quot;callInst does not have argument arg?&quot;</span>);</div>
599
- <div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keyword">auto</span> it = std::find(callBase-&gt;arg_begin(), callBase-&gt;arg_end(), arg);</div>
600
- <div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; assert(it != callBase-&gt;arg_end() &amp;&amp; <span class="stringliteral">&quot;Didn&#39;t find argument?&quot;</span>);</div>
601
- <div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keywordflow">return</span> std::distance(callBase-&gt;arg_begin(), it);</div>
602
- <div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160;}</div>
603
- <div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; </div>
604
- <div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; </div>
605
- <div class="line"><a name="l00555"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#aff3be73b7348c0e4dece6a9b5b1bd1f1"> 555</a></span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *<a class="code" href="classSVF_1_1ObjTypeInference.html#aff3be73b7348c0e4dece6a9b5b1bd1f1">ObjTypeInference::selectLargestType</a>(<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const Type *&gt;</a> &amp;objTys)</div>
606
- <div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160;{</div>
607
- <div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <span class="keywordflow">if</span> (objTys.empty()) <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
608
- <div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="comment">// map type size to types from with key in descending order</span></div>
609
- <div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <a class="code" href="namespaceSVF.html#aedf0d6718ca176e0b9e17ab4b30729c6">OrderedMap&lt;u32_t, Set&lt;const Type *&gt;</a>, std::greater&lt;int&gt;&gt; typeSzToTypes;</div>
610
- <div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *ty: objTys)</div>
611
- <div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; {</div>
612
- <div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; typeSzToTypes[objTyToNumFields(ty)].insert(ty);</div>
613
- <div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; }</div>
614
- <div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; assert(!typeSzToTypes.empty() &amp;&amp; <span class="stringliteral">&quot;typeSzToTypes cannot be empty&quot;</span>);</div>
615
- <div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const Type *&gt;</a> largestTypes;</div>
616
- <div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; std::tie(std::ignore, largestTypes) = *typeSzToTypes.begin();</div>
617
- <div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; assert(!largestTypes.empty() &amp;&amp; <span class="stringliteral">&quot;largest element cannot be empty&quot;</span>);</div>
618
- <div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <span class="keywordflow">return</span> *largestTypes.begin();</div>
619
- <div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160;}</div>
620
- <div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; </div>
621
- <div class="line"><a name="l00571"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#a5eae038a7bffb0549ca75cd9c850ff1e"> 571</a></span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1ObjTypeInference.html#a5eae038a7bffb0549ca75cd9c850ff1e">ObjTypeInference::objTyToNumFields</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *objTy)</div>
622
- <div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160;{</div>
623
- <div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> num = <a class="code" href="classSVF_1_1Options.html#aaab923c093730b1670a54f09340b1bd5">Options::MaxFieldLimit</a>();</div>
624
- <div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;ArrayType&gt;(objTy))</div>
625
- <div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; num = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#ab5b55fce942ab6d7995541f3fe0503f8">getNumOfElements</a>(objTy);</div>
626
- <div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2bf58575ac7d068e0f1a4cf953b9e6cb">StructType</a> *st = SVFUtil::dyn_cast&lt;StructType&gt;(objTy))</div>
627
- <div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; {</div>
628
- <div class="line"><a name="l00580"></a><span class="lineno"> 580</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceSVF_1_1cppUtil.html#a4e1785295e2695fae72758d8bbe4f7ac">classTyHasVTable</a>(st))</div>
629
- <div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160; num = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#ab5b55fce942ab6d7995541f3fe0503f8">getNumOfElements</a>(st);</div>
630
- <div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; }</div>
631
- <div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <span class="keywordflow">return</span> num;</div>
632
- <div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160;}</div>
414
+ <div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &amp;infersite: infersites)</div>
415
+ <div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; {</div>
416
+ <div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; types.insert(<a class="code" href="ObjTypeInference_8cpp.html#a19b8626948c43f4ce19dbc69742d309e">infersiteToType</a>(infersite));</div>
417
+ <div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; }</div>
418
+ <div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; _valueToInferSites[curValue] = infersites;</div>
419
+ <div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; _valueToType[curValue] = selectLargestType(types);</div>
420
+ <div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; }</div>
421
+ <div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; }</div>
422
+ <div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = _valueToType[startValue];</div>
423
+ <div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> == <span class="keyword">nullptr</span>)</div>
424
+ <div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; {</div>
425
+ <div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = defaultType(startValue);</div>
426
+ <div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#ac48ef12f2a6f605d6fa5d31e7623a826">WARN_MSG</a>(<span class="stringliteral">&quot;Using default type, trace ID is &quot;</span> + std::to_string(traceId) + <span class="stringliteral">&quot;:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(startValue));</div>
427
+ <div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; }</div>
428
+ <div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#a7165377d2fbd76a86ed0ec5218712c78">ABORT_IFNOT</a>(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>, <span class="stringliteral">&quot;type cannot be a null ptr&quot;</span>);</div>
429
+ <div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="keywordflow">return</span> <a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>;</div>
430
+ <div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160;}</div>
431
+ <div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; </div>
432
+ <div class="line"><a name="l00378"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#a707f0575f3d70e62a78f08c961ec7dae"> 378</a></span>&#160;<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const Value *&gt;</a> <a class="code" href="classSVF_1_1ObjTypeInference.html#a707f0575f3d70e62a78f08c961ec7dae">ObjTypeInference::bwfindAllocations</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *startValue)</div>
433
+ <div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160;{</div>
434
+ <div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; </div>
435
+ <div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="comment">// consult cache</span></div>
436
+ <div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; <span class="keyword">auto</span> tIt = _valueToAllocs.find(startValue);</div>
437
+ <div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160; <span class="keywordflow">if</span> (tIt != _valueToAllocs.end())</div>
438
+ <div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; {</div>
439
+ <div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#a482b3cc567fd28e9a30e7594c100149f">WARN_IFNOT</a>(!tIt-&gt;second.empty(), <span class="stringliteral">&quot;empty type:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(startValue));</div>
440
+ <div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <span class="keywordflow">return</span> !tIt-&gt;second.empty() ? tIt-&gt;second : <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const Value *&gt;</a>({startValue});</div>
441
+ <div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; }</div>
442
+ <div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; </div>
443
+ <div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; <span class="comment">// simulate the call stack, the second element indicates whether we should update sources for current value</span></div>
444
+ <div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <a class="code" href="classSVF_1_1FILOWorkList.html">FILOWorkList&lt;ValueBoolPair&gt;</a> workList;</div>
445
+ <div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;ValueBoolPair&gt;</a> visited;</div>
446
+ <div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; workList.<a class="code" href="classSVF_1_1FILOWorkList.html#afcf3fcda18e8d3e2bad70a51376c0ce1">push</a>({startValue, <span class="keyword">false</span>});</div>
447
+ <div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="keywordflow">while</span> (!workList.<a class="code" href="classSVF_1_1FILOWorkList.html#a071a624c91def82a4bbbf3806c7b7eea">empty</a>())</div>
448
+ <div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; {</div>
449
+ <div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="keyword">auto</span> curPair = workList.<a class="code" href="classSVF_1_1FILOWorkList.html#a3fd9acb6d09fd142bfd402fdf8cac93b">pop</a>();</div>
450
+ <div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keywordflow">if</span> (visited.count(curPair)) <span class="keywordflow">continue</span>;</div>
451
+ <div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; visited.insert(curPair);</div>
452
+ <div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *curValue = curPair.first;</div>
453
+ <div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="keywordtype">bool</span> canUpdate = curPair.second;</div>
454
+ <div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; </div>
455
+ <div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const Value *&gt;</a> sources;</div>
456
+ <div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; <span class="keyword">auto</span> insertAllocs = [&amp;sources, &amp;canUpdate](<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *source)</div>
457
+ <div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; {</div>
458
+ <div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; <span class="keywordflow">if</span> (canUpdate) sources.insert(source);</div>
459
+ <div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; };</div>
460
+ <div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="keyword">auto</span> insertAllocsOrPushWorklist = [<span class="keyword">this</span>, &amp;sources, &amp;workList, &amp;canUpdate](<span class="keyword">const</span> <span class="keyword">auto</span> &amp;pUser)</div>
461
+ <div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; {</div>
462
+ <div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="keyword">auto</span> vIt = _valueToAllocs.find(pUser);</div>
463
+ <div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; <span class="keywordflow">if</span> (canUpdate)</div>
464
+ <div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; {</div>
465
+ <div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; <span class="keywordflow">if</span> (vIt != _valueToAllocs.end() &amp;&amp; !vIt-&gt;second.empty())</div>
466
+ <div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; {</div>
467
+ <div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; sources.insert(vIt-&gt;second.begin(), vIt-&gt;second.end());</div>
468
+ <div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; }</div>
469
+ <div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; }</div>
470
+ <div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <span class="keywordflow">else</span></div>
471
+ <div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; {</div>
472
+ <div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; <span class="keywordflow">if</span> (vIt == _valueToAllocs.end()) workList.push({pUser, <span class="keyword">false</span>});</div>
473
+ <div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; }</div>
474
+ <div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; };</div>
475
+ <div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; </div>
476
+ <div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; <span class="keywordflow">if</span> (!canUpdate &amp;&amp; !_valueToAllocs.count(curValue))</div>
477
+ <div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; {</div>
478
+ <div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; workList.<a class="code" href="classSVF_1_1FILOWorkList.html#afcf3fcda18e8d3e2bad70a51376c0ce1">push</a>({curValue, <span class="keyword">true</span>});</div>
479
+ <div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; }</div>
480
+ <div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; </div>
481
+ <div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordflow">if</span> (isAllocation(curValue))</div>
482
+ <div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; {</div>
483
+ <div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; insertAllocs(curValue);</div>
484
+ <div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; }</div>
485
+ <div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#afc50da46a6ea7c2cf61683bbec4d7c8d">BitCastInst</a> *bitCastInst = SVFUtil::dyn_cast&lt;BitCastInst&gt;(curValue))</div>
486
+ <div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; {</div>
487
+ <div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *prevVal = bitCastInst-&gt;getOperand(0);</div>
488
+ <div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; insertAllocsOrPushWorklist(prevVal);</div>
489
+ <div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; }</div>
490
+ <div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ac8d4990439af7a2ecca7e15383119674">PHINode</a> *phiNode = SVFUtil::dyn_cast&lt;PHINode&gt;(curValue))</div>
491
+ <div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; {</div>
492
+ <div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> i = 0; i &lt; phiNode-&gt;getNumOperands(); ++i)</div>
493
+ <div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; {</div>
494
+ <div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; insertAllocsOrPushWorklist(phiNode-&gt;getOperand(i));</div>
495
+ <div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160; }</div>
496
+ <div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; }</div>
497
+ <div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5a6e8ab900d5cd17ef72661006a7fbe0">LoadInst</a> *loadInst = SVFUtil::dyn_cast&lt;LoadInst&gt;(curValue))</div>
498
+ <div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; {</div>
499
+ <div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &amp;use: loadInst-&gt;getPointerOperand()-&gt;uses())</div>
500
+ <div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; {</div>
501
+ <div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab696aab940eb187dc81217efe8649af5">StoreInst</a> *storeInst = SVFUtil::dyn_cast&lt;StoreInst&gt;(use.getUser()))</div>
502
+ <div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; {</div>
503
+ <div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keywordflow">if</span> (storeInst-&gt;getPointerOperand() == loadInst-&gt;getPointerOperand())</div>
504
+ <div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; {</div>
505
+ <div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; insertAllocsOrPushWorklist(storeInst-&gt;getValueOperand());</div>
506
+ <div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; }</div>
507
+ <div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; }</div>
508
+ <div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; }</div>
509
+ <div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160; }</div>
510
+ <div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a58cdfbc4160cae08745b67844ac29801">Argument</a> *argument = SVFUtil::dyn_cast&lt;Argument&gt;(curValue))</div>
511
+ <div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; {</div>
512
+ <div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &amp;use: argument-&gt;getParent()-&gt;uses())</div>
513
+ <div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; {</div>
514
+ <div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a> *callBase = SVFUtil::dyn_cast&lt;CallBase&gt;(use.getUser()))</div>
515
+ <div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; {</div>
516
+ <div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="comment">// skip function as parameter</span></div>
517
+ <div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="comment">// e.g., call void @foo(%struct.ssl_ctx_st* %9, i32 (i8*, i32, i32, i8*)* @passwd_callback)</span></div>
518
+ <div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="keywordflow">if</span> (callBase-&gt;getCalledFunction() != argument-&gt;getParent()) <span class="keywordflow">continue</span>;</div>
519
+ <div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> pos = argument-&gt;getParent()-&gt;isVarArg() ? 0 : argument-&gt;getArgNo();</div>
520
+ <div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; insertAllocsOrPushWorklist(callBase-&gt;getArgOperand(pos));</div>
521
+ <div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; }</div>
522
+ <div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; }</div>
523
+ <div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; }</div>
524
+ <div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a> *callBase = SVFUtil::dyn_cast&lt;CallBase&gt;(curValue))</div>
525
+ <div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; {</div>
526
+ <div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#a7165377d2fbd76a86ed0ec5218712c78">ABORT_IFNOT</a>(!callBase-&gt;doesNotReturn(), <span class="stringliteral">&quot;callbase does not return:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(callBase));</div>
527
+ <div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *callee = callBase-&gt;getCalledFunction())</div>
528
+ <div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; {</div>
529
+ <div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <span class="keywordflow">if</span> (!callee-&gt;isDeclaration())</div>
530
+ <div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; {</div>
531
+ <div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *svfFunc = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;<a class="code" href="classSVF_1_1LLVMModuleSet.html#a50fc24901350df9db890ba16a9b87e33">getSVFFunction</a>(callee);</div>
532
+ <div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *pValue = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-&gt;<a class="code" href="classSVF_1_1LLVMModuleSet.html#aaf9b679407f12b93afc53c157d37b444">getLLVMValue</a>(svfFunc-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4c28c8d205d354f3a982119f29f2aac">getExitBB</a>()-&gt;<a class="code" href="classSVF_1_1SVFBasicBlock.html#ad05f85ce931d4479f71d1947a25599dc">back</a>());</div>
533
+ <div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ac7dcc6103dee3a0bbc2fd2e02716a154">ReturnInst</a> *retInst = SVFUtil::dyn_cast&lt;ReturnInst&gt;(pValue);</div>
534
+ <div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#a7165377d2fbd76a86ed0ec5218712c78">ABORT_IFNOT</a>(retInst &amp;&amp; retInst-&gt;getReturnValue(), <span class="stringliteral">&quot;not return inst?&quot;</span>);</div>
535
+ <div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; insertAllocsOrPushWorklist(retInst-&gt;getReturnValue());</div>
536
+ <div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; }</div>
537
+ <div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; }</div>
538
+ <div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; }</div>
539
+ <div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordflow">if</span> (canUpdate)</div>
540
+ <div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; {</div>
541
+ <div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; _valueToAllocs[curValue] = sources;</div>
542
+ <div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; }</div>
543
+ <div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; }</div>
544
+ <div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const Value *&gt;</a> srcs = _valueToAllocs[startValue];</div>
545
+ <div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; <span class="keywordflow">if</span> (srcs.empty())</div>
546
+ <div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; {</div>
547
+ <div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; srcs = {startValue};</div>
548
+ <div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#ac48ef12f2a6f605d6fa5d31e7623a826">WARN_MSG</a>(<span class="stringliteral">&quot;Using default type, trace ID is &quot;</span> + std::to_string(traceId) + <span class="stringliteral">&quot;:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(startValue));</div>
549
+ <div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; }</div>
550
+ <div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#a7165377d2fbd76a86ed0ec5218712c78">ABORT_IFNOT</a>(!srcs.empty(), <span class="stringliteral">&quot;sources cannot be empty&quot;</span>);</div>
551
+ <div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160; <span class="keywordflow">return</span> srcs;</div>
552
+ <div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160;}</div>
553
+ <div class="line"><a name="l00499"></a><span class="lineno"> 499</span>&#160; </div>
554
+ <div class="line"><a name="l00500"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#af8113e432377917c1a0de9ab100aaafe"> 500</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ObjTypeInference.html#af8113e432377917c1a0de9ab100aaafe">ObjTypeInference::isAllocation</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">SVF::Value</a> *val)</div>
555
+ <div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160;{</div>
556
+ <div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespaceSVF_1_1LLVMUtil.html#aca11801ed6ef6ff8d2a1e85bc0fc5794">LLVMUtil::isObject</a>(val);</div>
557
+ <div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160;}</div>
558
+ <div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; </div>
559
+ <div class="line"><a name="l00509"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#afe926ee3427bb329d189e0c40bb1cd60"> 509</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1ObjTypeInference.html#afe926ee3427bb329d189e0c40bb1cd60">ObjTypeInference::validateTypeCheck</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a> *cs)</div>
560
+ <div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160;{</div>
561
+ <div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a> *func = cs-&gt;getCalledFunction())</div>
562
+ <div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; {</div>
563
+ <div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160; <span class="keywordflow">if</span> (func-&gt;getName().find(<a class="code" href="ObjTypeInference_8cpp.html#a5f334de99eb942058f27a1025c346f70">TYPEMALLOC</a>) != std::string::npos)</div>
564
+ <div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160; {</div>
565
+ <div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *objType = fwInferObjType(cs);</div>
566
+ <div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a> *pInt =</div>
567
+ <div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; SVFUtil::dyn_cast&lt;llvm::ConstantInt&gt;(cs-&gt;getOperand(1));</div>
568
+ <div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; assert(pInt &amp;&amp; <span class="stringliteral">&quot;the second argument is a integer&quot;</span>);</div>
569
+ <div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> iTyNum = objTyToNumFields(objType);</div>
570
+ <div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="keywordflow">if</span> (iTyNum &gt;= pInt-&gt;getZExtValue())</div>
571
+ <div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a05dc00b2bd9a8176aae31b6cfffe725d">SVFUtil::sucMsg</a>(<span class="stringliteral">&quot;\t SUCCESS :&quot;</span>) &lt;&lt; <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(cs)</div>
572
+ <div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a4550f2fb815882edfb666ac818792064">SVFUtil::pasMsg</a>(<span class="stringliteral">&quot; TYPE: &quot;</span>)</div>
573
+ <div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; &lt;&lt; <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a6e8682537cf5bed808df439bd7e1add9">dumpType</a>(objType) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div>
574
+ <div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; <span class="keywordflow">else</span></div>
575
+ <div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160; {</div>
576
+ <div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#ab65033f068bfbeb0a1c52dcec3beb6bc">SVFUtil::errs</a>() &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a7655b13bbfe720ca2b8a25e0a72528e6">SVFUtil::errMsg</a>(<span class="stringliteral">&quot;\t FAILURE :&quot;</span>) &lt;&lt; <span class="stringliteral">&quot;:&quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(cs) &lt;&lt; <span class="stringliteral">&quot; TYPE: &quot;</span></div>
577
+ <div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; &lt;&lt; <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a6e8682537cf5bed808df439bd7e1add9">dumpType</a>(objType) &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div>
578
+ <div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; abort();</div>
579
+ <div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; }</div>
580
+ <div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; }</div>
581
+ <div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; }</div>
582
+ <div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160;}</div>
583
+ <div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160; </div>
584
+ <div class="line"><a name="l00534"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#a99eaaef89f214fc8587349361600b44d"> 534</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1ObjTypeInference.html#a99eaaef89f214fc8587349361600b44d">ObjTypeInference::typeSizeDiffTest</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aa962cc1d782cc46553251e96b64a754b">PointerType</a> *oPTy, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *iTy, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *val)</div>
585
+ <div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160;{</div>
586
+ <div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160;<span class="preprocessor">#if TYPE_DEBUG</span></div>
587
+ <div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *oTy = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#abba4111230f6009bbf50518ee36a9870">getPtrElementType</a>(oPTy);</div>
588
+ <div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> iTyNum = objTyToNumFields(iTy);</div>
589
+ <div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1LLVMUtil.html#ab5b55fce942ab6d7995541f3fe0503f8">getNumOfElements</a>(oTy) &gt; iTyNum)</div>
590
+ <div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; {</div>
591
+ <div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#aa73dde570491da218d3ef11359f16955">ERR_MSG</a>(<span class="stringliteral">&quot;original type is:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a6e8682537cf5bed808df439bd7e1add9">dumpType</a>(oTy));</div>
592
+ <div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#aa73dde570491da218d3ef11359f16955">ERR_MSG</a>(<span class="stringliteral">&quot;infered type is:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a6e8682537cf5bed808df439bd7e1add9">dumpType</a>(iTy));</div>
593
+ <div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <a class="code" href="ObjTypeInference_8cpp.html#a54176d0866e198769367b0dc65e049b5">ABORT_MSG</a>(<span class="stringliteral">&quot;wrong type, trace ID is &quot;</span> + std::to_string(traceId) + <span class="stringliteral">&quot;:&quot;</span> + <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a86c0a0cb4ada72bd4f42c77558e6a350">dumpValueAndDbgInfo</a>(val));</div>
594
+ <div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; }</div>
595
+ <div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160;<span class="preprocessor">#endif</span></div>
596
+ <div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160;}</div>
597
+ <div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; </div>
598
+ <div class="line"><a name="l00548"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#a72da2d7f06e8fee67dc5b3c451fa5dee"> 548</a></span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1ObjTypeInference.html#a72da2d7f06e8fee67dc5b3c451fa5dee">ObjTypeInference::getArgPosInCall</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1f4624771922dc8c2447ad7433588c73">CallBase</a> *callBase, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *arg)</div>
599
+ <div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160;{</div>
600
+ <div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; assert(callBase-&gt;hasArgument(arg) &amp;&amp; <span class="stringliteral">&quot;callInst does not have argument arg?&quot;</span>);</div>
601
+ <div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keyword">auto</span> it = std::find(callBase-&gt;arg_begin(), callBase-&gt;arg_end(), arg);</div>
602
+ <div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; assert(it != callBase-&gt;arg_end() &amp;&amp; <span class="stringliteral">&quot;Didn&#39;t find argument?&quot;</span>);</div>
603
+ <div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; <span class="keywordflow">return</span> std::distance(callBase-&gt;arg_begin(), it);</div>
604
+ <div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160;}</div>
605
+ <div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; </div>
606
+ <div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; </div>
607
+ <div class="line"><a name="l00557"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#aff3be73b7348c0e4dece6a9b5b1bd1f1"> 557</a></span>&#160;<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *<a class="code" href="classSVF_1_1ObjTypeInference.html#aff3be73b7348c0e4dece6a9b5b1bd1f1">ObjTypeInference::selectLargestType</a>(<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const Type *&gt;</a> &amp;objTys)</div>
608
+ <div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160;{</div>
609
+ <div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <span class="keywordflow">if</span> (objTys.empty()) <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
610
+ <div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="comment">// map type size to types from with key in descending order</span></div>
611
+ <div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; <a class="code" href="namespaceSVF.html#aedf0d6718ca176e0b9e17ab4b30729c6">OrderedMap&lt;u32_t, Set&lt;const Type *&gt;</a>, std::greater&lt;int&gt;&gt; typeSzToTypes;</div>
612
+ <div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *ty: objTys)</div>
613
+ <div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; {</div>
614
+ <div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; typeSzToTypes[objTyToNumFields(ty)].insert(ty);</div>
615
+ <div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; }</div>
616
+ <div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; assert(!typeSzToTypes.empty() &amp;&amp; <span class="stringliteral">&quot;typeSzToTypes cannot be empty&quot;</span>);</div>
617
+ <div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set&lt;const Type *&gt;</a> largestTypes;</div>
618
+ <div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; std::tie(std::ignore, largestTypes) = *typeSzToTypes.begin();</div>
619
+ <div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; assert(!largestTypes.empty() &amp;&amp; <span class="stringliteral">&quot;largest element cannot be empty&quot;</span>);</div>
620
+ <div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <span class="keywordflow">return</span> *largestTypes.begin();</div>
621
+ <div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160;}</div>
622
+ <div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; </div>
623
+ <div class="line"><a name="l00573"></a><span class="lineno"><a class="line" href="classSVF_1_1ObjTypeInference.html#a5eae038a7bffb0549ca75cd9c850ff1e"> 573</a></span>&#160;<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1ObjTypeInference.html#a5eae038a7bffb0549ca75cd9c850ff1e">ObjTypeInference::objTyToNumFields</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a1d008c0666c145622b81d427be64c52d">Type</a> *objTy)</div>
624
+ <div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160;{</div>
625
+ <div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> num = <a class="code" href="classSVF_1_1Options.html#aaab923c093730b1670a54f09340b1bd5">Options::MaxFieldLimit</a>();</div>
626
+ <div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;ArrayType&gt;(objTy))</div>
627
+ <div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; num = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#ab5b55fce942ab6d7995541f3fe0503f8">getNumOfElements</a>(objTy);</div>
628
+ <div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2bf58575ac7d068e0f1a4cf953b9e6cb">StructType</a> *st = SVFUtil::dyn_cast&lt;StructType&gt;(objTy))</div>
629
+ <div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160; {</div>
630
+ <div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="namespaceSVF_1_1cppUtil.html#a4e1785295e2695fae72758d8bbe4f7ac">classTyHasVTable</a>(st))</div>
631
+ <div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; num = <a class="code" href="namespaceSVF_1_1LLVMUtil.html#ab5b55fce942ab6d7995541f3fe0503f8">getNumOfElements</a>(st);</div>
632
+ <div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; }</div>
633
+ <div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <span class="keywordflow">return</span> num;</div>
634
+ <div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160;}</div>
633
635
  </div><!-- fragment --></div><!-- contents -->
634
636
  <div class="ttc" id="aObjTypeInference_8cpp_html_a482b3cc567fd28e9a30e7594c100149f"><div class="ttname"><a href="ObjTypeInference_8cpp.html#a482b3cc567fd28e9a30e7594c100149f">WARN_IFNOT</a></div><div class="ttdeci">#define WARN_IFNOT(condition, msg)</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00070">ObjTypeInference.cpp:70</a></div></div>
635
637
  <div class="ttc" id="aclassSVF_1_1LLVMModuleSet_html_acf40310917909e4234282c0695a43160"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">SVF::LLVMModuleSet::getLLVMModuleSet</a></div><div class="ttdeci">static LLVMModuleSet * getLLVMModuleSet()</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00102">LLVMModule.h:102</a></div></div>
@@ -658,28 +660,28 @@ $(function() {
658
660
  <div class="ttc" id="anamespaceSVF_1_1LLVMUtil_html_a6e8682537cf5bed808df439bd7e1add9"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#a6e8682537cf5bed808df439bd7e1add9">SVF::LLVMUtil::dumpType</a></div><div class="ttdeci">std::string dumpType(const Type *type)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8cpp_source.html#l00923">LLVMUtil.cpp:923</a></div></div>
659
661
  <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_abf0978f7128506f7d19996f184fe8154"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#abf0978f7128506f7d19996f184fe8154">SVF::ObjTypeInference::fwInferObjType</a></div><div class="ttdeci">const Type * fwInferObjType(const Value *startValue)</div><div class="ttdoc">Forward collect all possible infer sites starting from a value.</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00152">ObjTypeInference.cpp:152</a></div></div>
660
662
  <div class="ttc" id="aclassSVF_1_1SVFBasicBlock_html_ad05f85ce931d4479f71d1947a25599dc"><div class="ttname"><a href="classSVF_1_1SVFBasicBlock.html#ad05f85ce931d4479f71d1947a25599dc">SVF::SVFBasicBlock::back</a></div><div class="ttdeci">const SVFInstruction * back() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00598">SVFValue.h:598</a></div></div>
661
- <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_a99eaaef89f214fc8587349361600b44d"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#a99eaaef89f214fc8587349361600b44d">SVF::ObjTypeInference::typeSizeDiffTest</a></div><div class="ttdeci">void typeSizeDiffTest(const PointerType *oPTy, const Type *iTy, const Value *val)</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00532">ObjTypeInference.cpp:532</a></div></div>
663
+ <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_a99eaaef89f214fc8587349361600b44d"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#a99eaaef89f214fc8587349361600b44d">SVF::ObjTypeInference::typeSizeDiffTest</a></div><div class="ttdeci">void typeSizeDiffTest(const PointerType *oPTy, const Type *iTy, const Value *val)</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00534">ObjTypeInference.cpp:534</a></div></div>
662
664
  <div class="ttc" id="aclassSVF_1_1LLVMModuleSet_html_ac1a9d20d62066ec4e181fad223669e32"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#ac1a9d20d62066ec4e181fad223669e32">SVF::LLVMModuleSet::getContext</a></div><div class="ttdeci">LLVMContext &amp; getContext() const</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00332">LLVMModule.h:332</a></div></div>
663
665
  <div class="ttc" id="aCppUtil_8h_html"><div class="ttname"><a href="CppUtil_8h.html">CppUtil.h</a></div></div>
664
666
  <div class="ttc" id="acJSON_8h_html_ad4c68ea99a26b0a98ad9a79982960458"><div class="ttname"><a href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">string</a></div><div class="ttdeci">const char *const string</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00172">cJSON.h:172</a></div></div>
665
667
  <div class="ttc" id="acJSON_8cpp_html_a3f9a0d3265a6254722587175dac3e4dc"><div class="ttname"><a href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a></div><div class="ttdeci">newitem type</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02739">cJSON.cpp:2739</a></div></div>
666
668
  <div class="ttc" id="anamespaceSVF_html_ac8d4990439af7a2ecca7e15383119674"><div class="ttname"><a href="namespaceSVF.html#ac8d4990439af7a2ecca7e15383119674">SVF::PHINode</a></div><div class="ttdeci">llvm::PHINode PHINode</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00163">BasicTypes.h:163</a></div></div>
667
- <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_a5eae038a7bffb0549ca75cd9c850ff1e"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#a5eae038a7bffb0549ca75cd9c850ff1e">SVF::ObjTypeInference::objTyToNumFields</a></div><div class="ttdeci">u32_t objTyToNumFields(const Type *objTy)</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00571">ObjTypeInference.cpp:571</a></div></div>
669
+ <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_a5eae038a7bffb0549ca75cd9c850ff1e"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#a5eae038a7bffb0549ca75cd9c850ff1e">SVF::ObjTypeInference::objTyToNumFields</a></div><div class="ttdeci">u32_t objTyToNumFields(const Type *objTy)</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00573">ObjTypeInference.cpp:573</a></div></div>
668
670
  <div class="ttc" id="anamespaceSVF_html_a2bf58575ac7d068e0f1a4cf953b9e6cb"><div class="ttname"><a href="namespaceSVF.html#a2bf58575ac7d068e0f1a4cf953b9e6cb">SVF::StructType</a></div><div class="ttdeci">llvm::StructType StructType</div><div class="ttdoc">LLVM types.</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00092">BasicTypes.h:92</a></div></div>
669
671
  <div class="ttc" id="aclassSVF_1_1SVFFunction_html"><div class="ttname"><a href="classSVF_1_1SVFFunction.html">SVF::SVFFunction</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8h_source.html#l00297">SVFValue.h:297</a></div></div>
670
672
  <div class="ttc" id="aclassSVF_1_1FILOWorkList_html_afcf3fcda18e8d3e2bad70a51376c0ce1"><div class="ttname"><a href="classSVF_1_1FILOWorkList.html#afcf3fcda18e8d3e2bad70a51376c0ce1">SVF::FILOWorkList::push</a></div><div class="ttdeci">bool push(const Data &amp;data)</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00257">WorkList.h:257</a></div></div>
671
673
  <div class="ttc" id="anamespaceSVF_html_a3bacb4f95c73e6d794901d01c6b65a83"><div class="ttname"><a href="namespaceSVF.html#a3bacb4f95c73e6d794901d01c6b65a83">SVF::AllocaInst</a></div><div class="ttdeci">llvm::AllocaInst AllocaInst</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00148">BasicTypes.h:148</a></div></div>
672
- <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_af8113e432377917c1a0de9ab100aaafe"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#af8113e432377917c1a0de9ab100aaafe">SVF::ObjTypeInference::isAllocation</a></div><div class="ttdeci">bool isAllocation(const Value *val)</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00498">ObjTypeInference.cpp:498</a></div></div>
673
- <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_aff3be73b7348c0e4dece6a9b5b1bd1f1"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#aff3be73b7348c0e4dece6a9b5b1bd1f1">SVF::ObjTypeInference::selectLargestType</a></div><div class="ttdeci">const Type * selectLargestType(Set&lt; const Type * &gt; &amp;objTys)</div><div class="ttdoc">Select the largest (conservative) type from all types.</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00555">ObjTypeInference.cpp:555</a></div></div>
674
+ <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_af8113e432377917c1a0de9ab100aaafe"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#af8113e432377917c1a0de9ab100aaafe">SVF::ObjTypeInference::isAllocation</a></div><div class="ttdeci">bool isAllocation(const Value *val)</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00500">ObjTypeInference.cpp:500</a></div></div>
675
+ <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_aff3be73b7348c0e4dece6a9b5b1bd1f1"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#aff3be73b7348c0e4dece6a9b5b1bd1f1">SVF::ObjTypeInference::selectLargestType</a></div><div class="ttdeci">const Type * selectLargestType(Set&lt; const Type * &gt; &amp;objTys)</div><div class="ttdoc">Select the largest (conservative) type from all types.</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00557">ObjTypeInference.cpp:557</a></div></div>
674
676
  <div class="ttc" id="anamespaceSVF_html_ac4e93e1fec646ff222940a663843921b"><div class="ttname"><a href="namespaceSVF.html#ac4e93e1fec646ff222940a663843921b">SVF::GetElementPtrInst</a></div><div class="ttdeci">llvm::GetElementPtrInst GetElementPtrInst</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00160">BasicTypes.h:160</a></div></div>
675
677
  <div class="ttc" id="aclassSVF_1_1SVFFunction_html_ac4c28c8d205d354f3a982119f29f2aac"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#ac4c28c8d205d354f3a982119f29f2aac">SVF::SVFFunction::getExitBB</a></div><div class="ttdeci">const SVFBasicBlock * getExitBB() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFValue_8cpp_source.html#l00193">SVFValue.cpp:193</a></div></div>
676
678
  <div class="ttc" id="anamespaceSVF_html_adefcb50414ea999d70cea5ccdbcb98d7"><div class="ttname"><a href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">SVF::ConstantInt</a></div><div class="ttdeci">llvm::ConstantInt ConstantInt</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00123">BasicTypes.h:123</a></div></div>
677
679
  <div class="ttc" id="aLLVMModule_8h_html"><div class="ttname"><a href="LLVMModule_8h.html">LLVMModule.h</a></div></div>
678
680
  <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_aee4383a13cda421acb034ea147e33a6d"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#aee4383a13cda421acb034ea147e33a6d">SVF::ObjTypeInference::defaultType</a></div><div class="ttdeci">const Type * defaultType(const Value *val)</div><div class="ttdoc">Default type.</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00112">ObjTypeInference.cpp:112</a></div></div>
679
681
  <div class="ttc" id="anamespaceSVF_html_afc50da46a6ea7c2cf61683bbec4d7c8d"><div class="ttname"><a href="namespaceSVF.html#afc50da46a6ea7c2cf61683bbec4d7c8d">SVF::BitCastInst</a></div><div class="ttdeci">llvm::BitCastInst BitCastInst</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00151">BasicTypes.h:151</a></div></div>
680
- <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_a707f0575f3d70e62a78f08c961ec7dae"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#a707f0575f3d70e62a78f08c961ec7dae">SVF::ObjTypeInference::bwfindAllocations</a></div><div class="ttdeci">Set&lt; const Value * &gt; bwfindAllocations(const Value *startValue)</div><div class="ttdoc">Backward collect all possible allocation sites (stack, static, heap) starting from a value.</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00376">ObjTypeInference.cpp:376</a></div></div>
682
+ <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_a707f0575f3d70e62a78f08c961ec7dae"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#a707f0575f3d70e62a78f08c961ec7dae">SVF::ObjTypeInference::bwfindAllocations</a></div><div class="ttdeci">Set&lt; const Value * &gt; bwfindAllocations(const Value *startValue)</div><div class="ttdoc">Backward collect all possible allocation sites (stack, static, heap) starting from a value.</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00378">ObjTypeInference.cpp:378</a></div></div>
681
683
  <div class="ttc" id="anamespaceSVF_1_1SVFUtil_html_aed0b0b9f035057552a6a82154fd88e61"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVF::SVFUtil::outs</a></div><div class="ttdeci">std::ostream &amp; outs()</div><div class="ttdoc">Overwrite llvm::outs()</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00050">SVFUtil.h:50</a></div></div>
682
- <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_afe926ee3427bb329d189e0c40bb1cd60"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#afe926ee3427bb329d189e0c40bb1cd60">SVF::ObjTypeInference::validateTypeCheck</a></div><div class="ttdeci">void validateTypeCheck(const CallBase *cs)</div><div class="ttdoc">Validate type inference.</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00507">ObjTypeInference.cpp:507</a></div></div>
684
+ <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_afe926ee3427bb329d189e0c40bb1cd60"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#afe926ee3427bb329d189e0c40bb1cd60">SVF::ObjTypeInference::validateTypeCheck</a></div><div class="ttdeci">void validateTypeCheck(const CallBase *cs)</div><div class="ttdoc">Validate type inference.</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00509">ObjTypeInference.cpp:509</a></div></div>
683
685
  <div class="ttc" id="anamespaceSVF_1_1SVFUtil_html_a05dc00b2bd9a8176aae31b6cfffe725d"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a05dc00b2bd9a8176aae31b6cfffe725d">SVF::SVFUtil::sucMsg</a></div><div class="ttdeci">std::string sucMsg(const std::string &amp;msg)</div><div class="ttdoc">Returns successful message by converting a string into green string output.</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00053">SVFUtil.cpp:53</a></div></div>
684
686
  <div class="ttc" id="aObjTypeInference_8cpp_html_a5f334de99eb942058f27a1025c346f70"><div class="ttname"><a href="ObjTypeInference_8cpp.html#a5f334de99eb942058f27a1025c346f70">TYPEMALLOC</a></div><div class="ttdeci">const std::string TYPEMALLOC</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00079">ObjTypeInference.cpp:79</a></div></div>
685
687
  <div class="ttc" id="aclassSVF_1_1FILOWorkList_html_a071a624c91def82a4bbbf3806c7b7eea"><div class="ttname"><a href="classSVF_1_1FILOWorkList.html#a071a624c91def82a4bbbf3806c7b7eea">SVF::FILOWorkList::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00238">WorkList.h:238</a></div></div>
@@ -691,7 +693,7 @@ $(function() {
691
693
  <div class="ttc" id="aclassSVF_1_1FILOWorkList_html_a3fd9acb6d09fd142bfd402fdf8cac93b"><div class="ttname"><a href="classSVF_1_1FILOWorkList.html#a3fd9acb6d09fd142bfd402fdf8cac93b">SVF::FILOWorkList::pop</a></div><div class="ttdeci">Data pop()</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00272">WorkList.h:272</a></div></div>
692
694
  <div class="ttc" id="aclassSVF_1_1FILOWorkList_html"><div class="ttname"><a href="classSVF_1_1FILOWorkList.html">SVF::FILOWorkList</a></div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00229">WorkList.h:229</a></div></div>
693
695
  <div class="ttc" id="aclassSVF_1_1Options_html_aaab923c093730b1670a54f09340b1bd5"><div class="ttname"><a href="classSVF_1_1Options.html#aaab923c093730b1670a54f09340b1bd5">SVF::Options::MaxFieldLimit</a></div><div class="ttdeci">static const Option&lt; u32_t &gt; MaxFieldLimit</div><div class="ttdoc">Maximum number of field derivations for an object.</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00038">Options.h:38</a></div></div>
694
- <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_a72da2d7f06e8fee67dc5b3c451fa5dee"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#a72da2d7f06e8fee67dc5b3c451fa5dee">SVF::ObjTypeInference::getArgPosInCall</a></div><div class="ttdeci">u32_t getArgPosInCall(const CallBase *callBase, const Value *arg)</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00546">ObjTypeInference.cpp:546</a></div></div>
696
+ <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_a72da2d7f06e8fee67dc5b3c451fa5dee"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#a72da2d7f06e8fee67dc5b3c451fa5dee">SVF::ObjTypeInference::getArgPosInCall</a></div><div class="ttdeci">u32_t getArgPosInCall(const CallBase *callBase, const Value *arg)</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00548">ObjTypeInference.cpp:548</a></div></div>
695
697
  <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_a172f97ff9c9a7c90dbec6329c89775ad"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#a172f97ff9c9a7c90dbec6329c89775ad">SVF::ObjTypeInference::getLLVMCtx</a></div><div class="ttdeci">LLVMContext &amp; getLLVMCtx()</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00123">ObjTypeInference.cpp:123</a></div></div>
696
698
  <div class="ttc" id="aclassSVF_1_1ObjTypeInference_html_a506a18c240f14d1e81fbeb31f8db1760"><div class="ttname"><a href="classSVF_1_1ObjTypeInference.html#a506a18c240f14d1e81fbeb31f8db1760">SVF::ObjTypeInference::inferObjType</a></div><div class="ttdeci">const Type * inferObjType(const Value *startValue)</div><div class="ttdoc">get or infer the type of a value</div><div class="ttdef"><b>Definition:</b> <a href="ObjTypeInference_8cpp_source.html#l00134">ObjTypeInference.cpp:134</a></div></div>
697
699
  <div class="ttc" id="anamespaceSVF_1_1LLVMUtil_html_abba4111230f6009bbf50518ee36a9870"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#abba4111230f6009bbf50518ee36a9870">SVF::LLVMUtil::getPtrElementType</a></div><div class="ttdeci">static Type * getPtrElementType(const PointerType *pty)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8h_source.html#l00099">LLVMUtil.h:99</a></div></div>