叮当声源代码转换(现代技术)

问题描述:

铿锵声源代码转换中的艺术状态如何?叮当声源代码转换(现代技术)

我跟踪了网上几乎所有的资源,我可以通过clang插件实现源代码重写(Rewriter),但最终的二进制文件没有更新(CodeGen是主要的活动,并且它被编译而不管什么我在我的插件中进行了修改,即使在getActionType中使用AddBeforeMainAction)。

我所看到的关于libTooling以及如何创建使用铛作为库中的一个独立的程序的一些文件,但我的目的是创建一个插件(FrontendPluginRegistry::Add<>,一些“易”堵塞到非定制铛二进制)并实现源到源的修改(对用户透明,避免覆盖源文件)。

编辑:如果不清楚: 我需要类似“插件”的东西来以简单的方式扩展clang。我需要在编译过程中“集成”的东西。为什么?因为我需要在编译阶段修改源代码,注入新代码,一步修改用户的源代码(我不想创建一个工具来解析用户源代码,然后编译输出文件) 。另外,我想分发我的代码(插件)以允许用户自己使用它。

它是强制性的,它在铛的编译阶段(clang $FLAGS $PLUGIN $ETC -o program source_files...)。

+0

最后二进制是什么?铛?该程序正在修改?为什么这是一个问题? –

+0

我编辑问题。我希望你现在明白我需要什么。 – user3819881

+0

我明白了。你需要一个运行时插件来Clang在编译时实现源到源的转换。好的我明白了。我期望这很难做到,因为Clang转换机制主要是在Clang类中调用编译方法,并且肯定“你”会想要编写某种源代码来实现在运行时解释的转换。谁将介于您编写的源文本和编译后的Clang代码之间? “编译时强制”似乎是一个XY问题......你为什么坚持这样做? –

的CodeGen将是主要的活动,也不管我在我的插件

是的,这是因为Clang的AST被设计为不可变的已经修改了它编译。解析后无法更改。

所以在Clang的艺术S2S改造的状态看起来像这样:

  • 解析C++源代码,AST
  • 应用文本替换原来的源代码,生成新的源代码
  • 解析新源代码来创建新的AST

您可以执行“内存”中的所有步骤,因此最终用户不会注意到。

更新: 我从来没有写过clang插件。但这里是我注意到: 如果运行Clang的门前实际生成的目标代码:

clang -cc1 -emit-obj main.c 

它将运行EmitObjAction。 EmitObjAction是一个FrontEnd Action,所以它将解析输入源并运行codegen。因此,如果您并行运行其他FrontEnd操作,它们将不会影响EmitObjAction。因为每个FrontEnd操作都会分析原始输入源代码。

你能做什么,就是用你自己的fork来代替EmitObjAction,它将尽可能多地重新解析你想要的东西。

如果将PluginASTAction :: ActionType设置为ReplaceAction,它应该替换由您自己的插件提供的内置Codegen操作。

+0

好的,你能告诉我一个这样做的例子(回购,代码)吗?当我使用重写器时,我正在修改内存中的源代码,但未修改Clang AST。 你可以用一个“真实的例子”来阐述,可以像你想的那样基本,但它必须是一个插件,并且一步完成(当用户编译它的源代码时)。 – user3819881

+0

另外,您可以指导我如何在插件完成后“触发”重新分析。 @随机 – user3819881