GNAT コンパイラをカスタム コード分析/変更ツールと統合する最善の方法を探しています。カスタム ツールを使用して、さまざまなコード メトリック (実行時間、テスト カバレッジなど) を実行し、コードの難読化も行っています。たとえば、コードの実行時間を測定するには、各関数/プロシージャに 2 つのプロシージャ コールを挿入する必要があります (関数が開始する最初の呼び出しと、関数の終了ごとにもう 1 つ)。これら 2 つの手順のコードは、別の変換単位で実装されます。シンプルさとパフォーマンスの観点から、GNAT コンパイラを使用してこれらのコード計測 (コードの挿入/変更) を行う最良の方法は何ですか? これらのいくつかの方法を考えることができます:
- GNAT コンパイラは、あらゆる種類のコード生成プラグインをサポートしていますか? そうではないようですが、グーグルで調べているときに何かを見逃したのかもしれません。メタプログラミングのトリック (Nimrod や D などの最新のプログラミング言語のように) を使用してそれを行う方法があるかもしれませんが、Ada がメタプログラミングをまったくサポートしているかどうかはわかりませんでした。
- ASIS ライブラリが役立つように見えますが、別のツールを作成するために作成されています。ASIS ベースのツールを GNAT と統合することは可能ですか? たとえば、コンパイル中に GNAT によってロードされ、AST (AST) が GIMPLE に変換される前に AST 内のノードを変更するツールを作成する場合などです。ASIS ベースのツールを個別に使用する (たとえば、各ソース ファイルをコンパイラに渡す前に前処理する) と、ソース コードを (ツールとコンパイラによって) 2 回解析し、ファイルに保存/ロードする必要があるため、コンパイル時間が短縮される場合があります。 /ディスク上の一時的な場所から。
- GIMPLE を GNAT コンパイラから取得し、変更して GCC に渡すことは可能ですか? GCC 内で動作する GIMPLE フロントエンドがあるかどうかはわかりませんでしたが、GIMPLE は内部でのみ使用されているようです。GCC コンパイラでダンプできますが、後で変更した GIMPLE を再コンパイルすることはできません (GCC 用の GIMPLE フロントエンドはないようです)。