gpt4 book ai didi

c++ - 使用 clang 进行源到源转换(最先进的技术)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:56 25 4
gpt4 key购买 nike

使用 clang 进行源到源转换的最新技术水平如何?

我几乎关注了网络上的所有资源,我可以通过 clang 插件实现源代码重写(Rewriter),但最终的二进制文件没有更新(CodeGen 是主要事件,它的编译与我在我的插件中修改了什么,甚至在 AddBeforeMainAction 中使用了 getActionType

我看过一些关于 libTooling 以及如何创建一个使用 clang 作为库的独立程序的文档,但我的目的是创建一个插件( FrontendPluginRegistry::Add<> ,一些“容易”插入非自定义 clang 二进制文件的东西) 并实现源到源的修改(对用户透明,避免覆盖他们的源文件)。

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

必须在 clang 的编译阶段(clang $FLAGS $PLUGIN $ETC -o program source_files...)。

最佳答案

the CodeGen is the main activity, and it is compiled regardless of what I have modified in my plugin

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

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

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

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

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

  clang -cc1 -emit-obj main.c

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

您可以做的是将 EmitObjAction 替换为您自己的分支,它将根据需要进行尽可能多的重新解析。

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

关于c++ - 使用 clang 进行源到源转换(最先进的技术),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46692246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com