我正在寻找将GNAT编译器与我们的自定义代码分析/修改工具集成的最佳方法。我们使用自定义工具来执行不同的代码度量(如执行时间,测试覆盖率等)甚至做一些代码混淆。因此,例如,为了测量代码执行时间,我需要在每个函数/过程中插入2个过程调用(函数启动的第一个,每个函数退出的另一个)。这两个程序的代码在一个单独的翻译单元中实现。在简单性和性能方面,使用GNAT编译器执行这些代码检测(插入/修改代码)的最佳方法是什么?我可以想到以下几种方式:
- GNAT编译器是否支持任何类型的代码生成插件?似乎它没有,但也许我在谷歌搜索时错过了一些东西。也许有一种方法可以使用一些元编程技巧(比如像Nimrod和D这样的现代编程语言),但我找不到Ada是否支持元编程。
- 看起来ASIS库可以帮助我,但它是为创建单独的工具而设计的。是否可以将基于ASIS的工具与GNAT集成?因此,例如编写一个将在编译期间由GNAT加载的工具,并在它(AST)即将转换为GIMPLE之前修改AST中的节点。单独使用基于ASIS的工具(例如通过在将每个源文件传递给编译器之前对其进行预处理)可能会缩短编译时间,因为源代码需要解析两次(由工具和编译器完成)并保存/加载到/来自磁盘上的一些临时位置。
- 是否有可能从GNAT编译器获取GIMPLE,修改并将其传递给GCC?我无法找到GCC内部是否有可用的GIMPLE前端,但似乎GIMPLE仅在内部使用。我可以使用GCC编译器转储它,但之后我无法重新编译修改后的GIMPLE(似乎GCC没有GIMPLE前端)。
醇>