LLVM程序分析日記之插樁BranchInst


1. splitblockandinsertifthenelse()

一個代碼例子:StackOverflow

2. SplitBlockAndInsertIfThen()

或者僅僅想插樁if then的邏輯,就可以用SplitBlockAndInsertIfThen(),其使用相對簡單些,一個例子如下:

Value* val_c = NULL;
IRBuilder<> IRB(InsertPoint);
Value* cmp = IRB.CreateICmpEQ(val_a, val_b);
BranchInst *BI = cast<BranchInst>(
      SplitBlockAndInsertIfThen(cmp, InsertPoint, false, CallWeights)); 
/* Instrument at new basic block */
IRBuilder<> ThenB(BI);
val_c = ThenB.CreateAdd(val_a, val_b);
val_c = IRB.CreateSub(val_a, val_b);

上述插樁后的代碼實現下面的效果:

...
if (val_a == val_b) {
      val_c = val_a + val_b;
}
val_c = val_a - val_b;

3. The third parameter of SplitBlockAndInsertIfThen() and splitblockandinsertifthenelse()

詳見 https://stackoverflow.com/questions/65308323/llvm-suitable-parameters-for-the-createbranchweights

4. Nested branch instruction

上面所述的SplitBlockAndInsertIfThen()在插入單個分支時非常方便。但當我們需要插樁嵌套分支時,嵌套調用SplitBlockAndInsertIfThen()可能會產生冗余的跳轉基本塊(即,僅包含一條無條件跳轉指令的基本塊),這是由於“split”的操作造成的。為了避免這種情況,我們可以在最外層分支使用SplitBlockAndInsertIfThen(),而對內層分支使用BasicBlock::Create()進行插樁,並通過BranchInst::Create()來鏈接各個基本塊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM