没有 IR 构建器的 LLVM 检测

LLVM instrumentation without IR builder

我需要使用 LLVM pass 进行大量检测。我想避免使用 IR Builder,因为它有点复杂,而且代码看起来真的很乱。没有更方便的方法来创建 LLVM IR 吗?我想到了一种方法,我可以使用 C/C++ 来创建检测代码。

我的 instrumentation 没有使用 IR Builder。大多数检测都是通过两个步骤完成的:

  1. LLVM 通道识别感兴趣的指令并将函数调用插入到必要的检测例程中。
  2. 检测例程用 C 文件编写并编译并 linked 到最终程序中。使用 link 时间优化 (LTO),此方法通过删除函数调用并直接插入库检测例程的机器代码来实现良好的性能。

因此,大部分检测都是 C 代码,clang 编译成必要的 IR。

其他仪器必须动态制作,因此 IR 是通过调用适当的 XYZInst::Create 调用来构建的,其中 XYZ 是特定指令。

第一种方法更接近你想要的;但是,它需要编写一个单独的脚本来充当编译器驱动程序并管理 Makefile、库等。