llvm - 如何使自定义 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;
}
这只是我真正想做的一个玩具示例,但我有困难
- 寻找合适的指示想要改变
- 并改变控制流程。
解决方案
首先将此代码编译为 LLVM IR,以了解您将要处理的内容:
# clang -S -emit-llvm -o - main.c
然后你会发现你对icmp
指令及其操作数感兴趣。在您的通行证中,遍历 a 中的所有指令Function
,搜索ICmpInst
using isa<>
or dyn_cast<>
,然后使用方法分析其操作数,并将操作数getOperand()
替换ConstantInt
为与0
值相同ConstantInt
的1
值。
推荐阅读
- assembly - 如何在矩阵(MIPS 程序集)中添加用户选择的行/列的所有元素?
- javascript - 是否可以在 Internet Explorer 11 中使用 ECMAScript 2018?
- c++ - 抽象基类的派生类未正确覆盖基纯虚方法
- dask - dask 数据帧:合并两个数据帧,估算缺失值并写入 csv 仅使用部分 CPU(每个 CPU 中 20%)
- c++ - 为什么从串口读取的字节数限制在一定数量?
- javascript - TensorFlow .js 简单模型预测 2 表多个未显示正确输出?
- angular - 订阅承诺
- sql - 从包文件中提取包名和注释
- flask - 如何在 json 中包含图像文件?
- html - 为什么会在a之后直接换行
元素添加一个空格?