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

时间:2019-01-17 03:17:20

标签: llvm llvm-clang llvm-ir

我想通过改变控制流程。

通行证应更改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. 并更改控制流。

1 个答案:

答案 0 :(得分:2)

首先将此代码编译为LLVM IR,以了解您要进行的工作:

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

然后您将看到您对icmp指令及其操作数感兴趣。通过时,遍历Function中的所有指令,使用ICmpInstisa<>搜索dyn_cast<>,然后使用getOperand()方法分析其操作数并替换{值ConstantInt的{​​1}}操作数与值0相同的ConstantInt