GCCのGimple内部表現(IR)は、SSA(静的単一代入)フォームの各基本ブロックのデータフロー分析を提供します。GCCで生成されたGimpleファイルを入力として受け取り、基本ブロックのデータフローグラフを生成したいと思います。たとえば、次のコードは、GCCによって生成されたGimple形式の単純な基本ブロックを示しています(を使用-fdump-tree-cfg
)。
...
<bb 3>:
i2 = 0;
goto <bb 5>;
<bb 4>: //the inner-most loop, where real computation happens
i1.0 = i1;
i1.1 = i1;
D.1608 = y[i1.1];
i2.2 = i2;
D.1610 = w[i2.2];
D.1611 = i1 + i2;
D.1612 = x[D.1611];
D.1613 = D.1610 * D.1612;
D.1614 = D.1608 + D.1613;
y[i1.0] = D.1614;
i2 = i2 + 1;
<bb 5>:
if (i2 <= 31)
goto <bb 4>;
else
goto <bb 6>;
...
上記のコードでは、データの依存関係(フロー依存関係のエッジと呼ばれると思います)をで確認できますbb 4
。各基本ブロックのデータフローをデータフローグラフの形式で分析するには、データの依存関係を視覚化する必要があります。データフローグラフとは、グラフ内のノードが加算や乗算などの操作を表し、エッジがノード間のデータ依存性を表すグラフを意味します。1つのオプションは、Gimpleを取得してdot
ファイルを生成するパーサーを作成することです。それを行うようなツールはすでにあるのだろうかと思いました。そのようなパーサーを書くのは難しいことではないようですが、私は多くのコーナーケースを扱うのに行き詰まるかもしれないのではないかと心配しています。
注意:このように見つけたツールは制御フローグラフしか生成しないため、私のグーグル検索はそれほど実り多いものではありませんでした。