【问题标题】:How to make custom llvm pass for changing control flow?如何使自定义 llvm 通过更改控制流?
【发布时间】:2019-01-17 03:17:19
【问题描述】:

我想通过改变控制流。

pass 应该改变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 llvm-clang llvm-ir


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢您的回答!更好地理解 pass。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多