clang的源到源转换(最新技术)
Source-to-Source transformation with clang (state of the art)
使用clang进行源代码到源代码转换的最新技术如何?
我跟踪了Web上几乎所有的资源,我可以通过clang插件实现源代码重写(Rewriter
),但最终的二进制文件没有更新(CodeGen是主要活动,无论我在插件中修改了什么,它都会被编译,甚至在getActionType
中使用AddBeforeMainAction
)。
我看过一些关于libTooling以及如何创建一个使用clang作为库的独立程序的文档,但我的目的是创建一个插件(FrontendPluginRegistry::Add<>
,一种"容易"插入非自定义clang二进制文件的东西),并实现源代码到源代码的修改(对用户透明,避免覆盖他们的源文件)。
编辑:如果不清楚:我需要一个类似"插件"的东西来以一种简单的方式扩展clang。我需要一些在编译过程中"集成"的东西。为什么?因为我需要在编译阶段修改源代码,注入新代码,一步修改用户的源代码(我不想创建一个工具来解析用户源代码,然后编译输出文件)。此外,我想分发我的代码(插件),让用户自己使用它。
它是强制性的,在clang(clang $FLAGS $PLUGIN $ETC -o program source_files...
)的编译阶段。
CodeGen是主要活动,无论我在插件中修改了什么,它都会被编译
是的,这是因为Clang AST被设计为不可变的。解析后无法更改它。
因此,Clang的最先进的s2s转换看起来是这样的:
- 将C++源代码解析为AST
- 将文本替换应用于原始源代码,生成新的源代码
- 解析新的源代码以创建新的AST
您可以"在内存中"执行所有步骤,这样最终用户就不会注意到。
更新:我自己从来没有写过clang插件。但我注意到:如果您运行Clang-fronted来实际生成目标代码:
clang -cc1 -emit-obj main.c
它将运行EmitObjAction。EmitObjAction是一个前端操作,因此它将解析输入源并运行codegen。因此,如果并行运行其他前端操作,它们将不会对EmitObjAction产生影响。因为每个前端操作都解析原始输入源代码。
您所能做的是用您自己的fork替换EmitObjAction,该fork将根据您的需要进行尽可能多的重新解析。
如果您将PluginASTAction::ActionType设置为ReplaceAction,它应该用您自己提供的插件来替换内置的Codegen操作。
- 我写的 ASCII 到二进制转换器C++向后显示二进制,如何使其正确显示?
- 十进制到二进制转换器 c++
- 编译时间文本到数字转换 (atoi)
- 字符到int8_t转换会产生意想不到的结果?
- C++:二进制到十进制w/转换过程的外观
- 十六进制到十进制转换的未清理答案
- 浮点到整数转换出错(即使浮点数已经是整数)
- 输入 1024 后十进制到二进制转换的输出错误?
- CMake:将文件从构建目录复制到源直接
- Arduino 十六进制到十进制转换
- 为什么延迟太高,即使只是 RGB 到灰色转换 (Vivado HLS)?
- 使用 opencv 凸胡尔 获取给定点的面积. - 点到垫子转换期间发生错误
- 英里到千克转换器练习的小语法错误
- 问题基于从源到目的地的最短最远距离
- 提升 BGL BFS 查找从源到目标的所有唯一路径
- clang的源到源转换(最新技术)
- 增量构建:Eclipse CDT没有注意到源已更改
- 在图形中移除连接到源顶点的边时获取额外的边
- Dijktra's-如何在从源到目标的最短路径中跟踪节点
- GDB 看不到源