LLVM Clang C 代码注入



我在LLVM Clang中实现代码注入功能有些困惑。我基本上想在源代码中创建变量或指针之前添加功能。示例:

#include <iostream>
int main() {
  int a;
  return 0;
}

to

#include <iostream>
int main() {
  foo();
  int a;
  return 0;
}

我阅读了LLVM文档以找到答案,但不能。请帮我。预先感谢您。

第一步是决定是否要在Clang还是LLVM中执行此操作。尽管它们是"连接"的,但它们不是同一回事。在Clang,您可以在AST级别进行操作,在这种情况下,您需要编写递归AST -Visiter,然后从该递归中识别要仪器的函数定义 - 插入AST以调用foo函数。这仅适用于编译器实施的功能。

有有关如何在此处编写这样的访问者的信息:https://clang.llvm.org/docs/ravfrontendaction.html

在llvm中,您可以编写一个函数 - 将代码插入每个函数。这显然适用于任何功能,无论语言如何。

如何编写LLVM通行证:http://llvm.org/docs/writinganllvmpass.html

但是,尽管一开始这似乎很重要,但仍有一些有趣的怪癖。在LLVM函数中,alloca指令应首先是,因此您必须"跳过"这些功能。可能会有"不应该仪器"的功能 - 例如,如果您的功能foo使用cout << something;打印某些内容,则将foo插入operator<<(ostream&, ...)类型功能是相当可怕的想法...想要仪器foo本身或其调用的任何功能。

clang中有一些方法可以确定源是"主文件"还是某些标头文件 - 尽管在您的情况下可能还不够。在llvm中确定"哪个函数"要困难得多。

最新更新