使用clang插件更改源代码
Changing the source code with a clang plugin
我有一个现有的使用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类的使用中得到一些启发。
相关文章:
- 从C++本机插件更新Vector3数组
- 使用CMake创建QML插件
- 在Linux中哪里可以找到互斥、未来等的源代码
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- 难以理解某些人解决IOI问题的源代码
- 使用g++编译hdf5源代码
- 如何使用C++读取另一个程序中的源代码输出
- Poco FindMySql.cmake 无法找到 MySQL 源代码
- clang 插件:在编译过程中修改 AST
- 实现动态插件管理器
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- C++出现控制台错误.我无法识别源代码的问题
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- Agora.io 虚幻引擎插件构建错误
- 使用带有C++对象和标准库容器的插件系统
- 如何编写eclipse插件来格式化C++14源代码
- 使用clang插件更改源代码