首页 > 解决方案 > 如何使自定义 llvm 通过更改控制流?

问题描述

我想通过改变控制流。

通行证应该改变if条件。

让我们假设原始代码如下所示。

int main(int argc, char *argv[])
{
  if (atoi(argv[1]) % 2 == 0)
    printf("even\n");
  else
    printf("odd\n");

  return 0;
}

应用我的通行证后,代码应更改为以下。(不是说改变代码,而是真正的IR代码。)

int main(int argc, char *argv[])
{
  if (atoi(argv[1]) % 2 == 1)    //the condition of if statement is changed to 1
    printf("even\n");
  else
    printf("odd\n");

  return 0;
}

这只是我真正想做的一个玩具示例,但我有困难

  1. 寻找合适的指示想要改变
  2. 并改变控制流程。

标签: llvmllvm-clangllvm-ir

解决方案


首先将此代码编译为 LLVM IR,以了解您将要处理的内容:

 # clang -S -emit-llvm -o - main.c

然后你会发现你对icmp指令及其操作数感兴趣。在您的通行证中,遍历 a 中的所有指令Function,搜索ICmpInstusing isa<>or dyn_cast<>,然后使用方法分析其操作数,并将操作数getOperand()替换ConstantInt为与0值相同ConstantInt1值。


推荐阅读