GCC的Gimple内部表示(IR)为SSA(静态单一分配)表单中的每个基本块提供了一些数据流分析。我想将GCC生成的Gimple文件作为输入,并为基本块生成数据流图。例如,下面的代码显示了由GCC生成的简单基本块(使用-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
中看到数据依赖关系(我认为称为流依赖边)。我需要可视化数据依赖性,以便以数据流图的形式分析每个基本块中的数据流。通过数据流图,我指的是图中的节点表示加法和乘法等操作的图,边表示节点之间的数据依赖性。一种选择是编写一个解析器,它接受Gimple并生成一个dot
文件。我想知道是否有这样的工具可以做到这一点。编写这样的解析器似乎并不困难,但我担心我可能会遇到很多极端情况。
请注意: 我的谷歌搜索并不富有成效,因为我找到的工具this只生成控制流图。