【发布时间】:2017-10-11 15:31:49
【问题描述】:
使用 clang 进行源到源转换的最新技术如何?
我几乎关注了 Web 上的所有资源,并且我可以通过 clang 插件实现源代码重写 (Rewriter),但最终的二进制文件没有更新(CodeGen 是主要活动,它被编译不管我在插件中修改的内容,甚至在getActionType 中使用了AddBeforeMainAction)。
我看过一些关于 libTooling 以及如何创建一个使用 clang 作为库的独立程序的文档,但我的目的是创建一个插件(FrontendPluginRegistry::Add<>,一些“容易”插入非自定义 clang 二进制文件的东西) 并实现源到源的修改(对用户透明,避免覆盖他们的源文件)。
编辑:如果不清楚: 我需要像“插件”这样的东西来以一种简单的方式扩展clang。我需要在编译过程中“集成”的东西。为什么?因为我需要在编译阶段修改源代码,注入新代码,一步一步修改来自用户的源代码(我不想创建一个工具来解析用户源代码然后编译输出文件) .另外,我想分发我的代码(插件)以允许用户自己使用它。
必须在clang的编译阶段(clang $FLAGS $PLUGIN $ETC -o program source_files...)。
【问题讨论】:
-
什么的最终二进制文件?铛?程序被修改?为什么这是一个问题?
-
我编辑问题。我希望你现在明白我需要什么。
-
我明白了。您希望 Clang 的运行时插件在编译时实现源到源的转换。好的我明白了。我希望这很难做到,因为 Clang 转换机制主要是调用 Clang 类中的编译方法,当然“你”会想要编写某种源代码来实现在运行时解释的转换.谁将在您编写的源文本和编译的 Clang 代码之间进行中介? “编译期间强制”似乎是一个XY问题......你为什么坚持这样做?
-
.... FWIW,DMS 的重写规则 在读取时被解释,因此您可以当场发明新规则。
-
我需要一些完全开源的、为社区所熟知的东西。 DMS 看起来不像。还是我错了?