我认为问题的标题已经很明确了,我想把由gcc生成的抽象语法树转储到一个.dot文件中(这些文件由Graphviz生成),因为我想在一个.png文件或类似文件中查看它。有没有办法可以做到这一点?
我认为问题的标题已经很明确了,我想把由gcc生成的抽象语法树转储到一个.dot文件中(这些文件由Graphviz生成),因为我想在一个.png文件或类似文件中查看它。有没有办法可以做到这一点?
有两种方法,每种方法都包括两个步骤:
使用 GCC 内部的 VCG 支持
使用 vcg dumps 编译你的代码(比如 test.c)
gcc -fdump-tree-vcg -g test.c
使用任意第三方工具从 vcg 获取 dot 输出
graph-easy test.c.006t.vcg --as_dot
使用原始转储进行编译,然后使用一些脚本对它们进行预处理以形成 dot 文件(就像这篇有用的文章中所述)
这两种方法各有优缺点——第一种方法可以在 gimple 转换之前真正获得 AST 的一个输出,但很容易。第二种方法可以将任何原始 dump 转换为 dot 格式,但必须支持脚本,这是额外开销。
哪种方法更好,由您自己选择。
更新:时代在变化。GCC 4.8.2 的全新选项使得立即生成 dot 文件成为可能。只需提供:
gcc test.c -fdump-tree-all-graph
而且你将得到大量已经为您格式化的点文件:
test.c.008t.lower.dot
test.c.012t.cfg.dot
test.c.016t.ssa.dot
... etc ...
请务必在使用此选项时使用新版本的GCC。
-fdump-
命令获取此信息。// main.c
int sum(int a, int b) {
return a + b;
}
int main(void) {
if (sum(8, 10) < 20) {
return -1;
}
return 1;
}
针对gcc 7.3.0版本:
gcc -fdump-tree-all-graph main.c -o main
有很多获取必要信息的选项。查看手册以获取此信息。
之后,您将获得许多文件。其中一些具有.dot表示(使用图形选项):
main.c.003t.original
main.c.004t.gimple
main.c.006t.omplower
...
main.c.011t.cfg
main.c.011t.cfg.dot
...
dot -Tpng main.c.011t.cfg.dot -o main.png
cc1: error: unrecognized command line option '-fdump-tree-vcg'
。 - Ali-fdump-tree-XXX
都是SSA IR,而不是AST。是的,-fdump-tree-vcg
已不再可用。 - yugr