使用clang插件更改源代码

Changing the source code with a clang plugin

本文关键字:源代码 插件 clang 使用      更新时间:2023-10-16

我有一个现有的使用libtool的源代码到源代码修改工具。现在我想把这个工具集成到clang中,这样用户就可以编译修改后的源代码,而不必把它保存在某个地方。

修改部分没有问题,Matchers + Rewriters的工作方式与clang相同,我的问题是如何告诉编译器在我更改后重新解析源代码。

My progress so far:

  • 我发现了一个关于cve-dev的对话,但没有具体的信息如何做到这一点
  • 我还找到了clang::ASTUnit::Reparse,但我不知道如何调用它。在clang源中没有使用它,我的每一次尝试都以崩溃作为奖励。
  • 有一个类似的问题在StackOverflow,但没有一个很好的答案
  • 有一些插件工具,如跟踪,做同样的源代码修改,但它只是调用编译器两次。

我希望基于前两个最终我找到一个工作的解决方案,但也许有人知道答案已经,可以帮助我一个例子,或者至少更具体的说明如何实现它?

您可以使用WrapperFrontendAction包装生成对象文件的EmitObjAction。在包装器操作中,您可以覆盖BeginInvocation()函数。在这个函数中,您可以创建自己的ASTFrontendAction,它遍历AST并使用Rewriter类执行文本更改。

当您的操作完成时,您可以访问Rewriter类中的缓冲区。您可以复制这些缓冲区,并使用addRemappedFile()将它们添加到PreprocessorOptions中。因为PreprocessorOptions是附加到CompilerInstance上的,所以它们也被下面的EmitObjAction使用,也就是你包装的那个。

这意味着EmitObjAction将实际读取更改后的源文件。

你可以从Clang中FixItRecompile类的使用中得到一些启发。