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()
来链接各个基本块。