如何使自定义 llvm 通过更改控制流?

How to make custom llvm pass for changing control flow?

我想通过更改控制流。

传球应该改变 if 条件。

假设原始代码如下所示。

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

  return 0;
}

应用我的通行证后,代码应更改为以下内容。 (并不是说改变 source 代码,而是真正的 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. 并更改控制流。

从将此代码编译为 LLVM IR 开始,了解您将要处理的内容:

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

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