如何使自定义 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;
}
这只是我真正想做的事情的一个玩具示例,但我对
有困难
- 寻找合适的说明想改变
- 并更改控制流。
从将此代码编译为 LLVM IR 开始,了解您将要处理的内容:
# clang -S -emit-llvm -o - main.c
然后您会发现您对 icmp
指令及其操作数感兴趣。在您的传递中,遍历 Function
中的所有指令,使用 isa<>
或 dyn_cast<>
搜索 ICmpInst
,然后使用 getOperand()
方法分析其操作数并替换 ConstantInt
操作数与 0
值相同 ConstantInt
与 1
值。
我想通过更改控制流。
传球应该改变 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;
}
这只是我真正想做的事情的一个玩具示例,但我对
有困难- 寻找合适的说明想改变
- 并更改控制流。
从将此代码编译为 LLVM IR 开始,了解您将要处理的内容:
# clang -S -emit-llvm -o - main.c
然后您会发现您对 icmp
指令及其操作数感兴趣。在您的传递中,遍历 Function
中的所有指令,使用 isa<>
或 dyn_cast<>
搜索 ICmpInst
,然后使用 getOperand()
方法分析其操作数并替换 ConstantInt
操作数与 0
值相同 ConstantInt
与 1
值。