GCC 的 Gimple internal representation (IR) 为 SSA(Static Single Assignment)形式的每个基本块提供了一些数据流分析。我想将 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
. 我需要可视化数据依赖关系,以便以数据流图的形式分析每个基本块中的数据流。数据流图是指图中的节点表示加法和乘法等操作,边表示节点之间的数据依赖关系的图。一种选择是编写一个解析器,它接受 Gimple 并生成一个dot
文件。我想知道是否已经有这样的工具可以做到这一点。编写这样一个解析器似乎并不难,但我担心我可能会在处理很多极端情况时陷入困境。
请注意:我的谷歌搜索并没有那么富有成效,因为我发现这样的工具只生成控制流图。