使用clang插件更改源代码

时间:2015-10-05 05:35:15

标签: c++ clang

我有一个使用libtooling的现有工作源代码修改工具。现在我想将这个工具集成到clang中,这样用户就可以编译修改后的源代码,而无需在某处实际保存它。

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

到目前为止我的进展:

  • 我在cve-dev上找到了一个对话,但没有具体信息如何做到
  • 我还找到clang::ASTUnit::Reparse,但我无法弄清楚如何调用它。在clang资源中没有任何东西使用它,我的每一次尝试都得到了崩溃的回报。
  • StackOverflow中有类似的问题,但没有一个好的答案
  • 有一些插件工具,如traces,它们执行相同的源修改,但它只调用编译器两次。

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

1 个答案:

答案 0 :(得分:0)

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

当您的操作完成后,您可以访问Rewriter类中的缓冲区。您可以复制这些缓冲区,并使用addRemappedFile()将它们添加到PreprocessorOptions中。由于PreprocessorOptions附加到CompilerInstance,因此它们也被您包装的以下EmitObjAction使用。

这意味着EmitObjAction实际上会读取已更改的源文件。

您可以从Clang中FixItRecompile类的使用方式中获得灵感。