【问题标题】:Source-to-Source transformation with clang (state of the art)使用 clang 进行源到源转换(最先进的技术)
【发布时间】: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 看起来不像。还是我错了?

标签: c++ clang


【解决方案1】:

CodeGen 是主要活动,无论我在插件中修改了什么,都会编译它

是的,这是因为 Clang AST 被设计为不可变的。解析后无法更改。

所以 Clang 中最先进的 s2s 转换看起来像这样:

  • 将 C++ 源代码解析为 AST
  • 对原始源代码应用文本替换,生成新的源代码
  • 解析新的源代码以创建新的 AST

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

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

  clang -cc1 -emit-obj main.c

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

您可以做的是用您自己的 fork 替换 EmitObjAction,这将根据需要进行尽可能多的重新解析。

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

【讨论】:

  • 好的,你能给我看一个例子(repo,code)吗?当我使用 Rewriter 时,我正在修改内存中的源代码,但 Clang AST 没有被修改。你能用一个“真实的例子”来详细说明,可以是你想要的基本的,但它必须是一个插件并且一步完成(当用户编译它的源代码时)。
  • 另外,您可以指导我如何在我的插件完成后再次“触发”重新解析。 @随机
  • @user3819881 : 你有没有想过如何触发重新解析?
  • 是的,clang AST 被设计为不可变的,但是如果你足够小心的话,你仍然可以对 AST 进行细微的修改。 CodeGen 可以在对 AST 进行修改后运行,所以这实际上是可行的。
猜你喜欢
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 2013-01-28
  • 2020-04-29
相关资源
最近更新 更多