0

我正在寻找一种将 GNAT 编译器与我们的自定义代码分析/修改工具集成的最佳方法。我们正在使用自定义工具来执行不同的代码指标(如执行时间、测试覆盖率等),甚至进行一些代码混淆。因此,例如,为了测量代码执行时间,我需要在每个函数/过程中插入 2 个过程调用(第一个是函数开始的地方,另一个是每个函数退出的地方)。这两个过程的代码在单独的翻译单元中实现。就简单性和性能而言,使用 GNAT 编译器执行这些代码检测(插入/修改代码)的最佳方法是什么?我可以想到这几种方法:

  1. GNAT 编译器是否支持任何类型的代码生成插件?似乎它没有,但也许我在谷歌搜索时错过了一些东西。也许有一种方法可以使用一些元编程技巧(比如在 Nimrod 和 D 等一些现代编程语言中),但我找不到 Ada 是否支持元编程。
  2. 看起来 ASIS 库可以帮助我,但它是为创建单独的工具而设计的。是否可以将基于 ASIS 的工具与 GNAT 集成?因此,例如编写一个在编译期间将由 GNAT 加载的工具,并在它(AST)即将转换为 GIMPLE 之前修改 AST 中的节点。单独使用基于 ASIS 的工具(例如通过在将每个源文件传递给编译器之前对其进行预处理)可以减少编译时间,因为源代码需要被解析两次(由工具和编译器)并保存/加载到/来自磁盘上的某个临时位置。
  3. 是否可以从 GNAT 编译器中获取 GIMPLE,对其进行修改并将其传递给 GCC?我找不到 GCC 内部是否有工作的 GIMPLE 前端,但似乎 GIMPLE 仅在内部使用。我可以用 GCC 编译器转储它,但之后我无法重新编译修改后的 GIMPLE(似乎没有 GCC 的 GIMPLE 前端)。
4

0 回答 0