我想问题的标题是不言自明的,我想把一个由gcc生成的抽象语法树转储到一个.dot文件(那些由Graphviz生成的文件),因为我想在一个.png文件或类似的文件中查看它。有什么方法可以做到这一点吗?
dvtswwa31#
有两种方法,都包括两个步骤1.使用GCC内部vcg支持1.使用vcg转储编译代码(比如test.c)gcc -fdump-tree-vcg -g test.c1.使用任何第三方工具从vcg获取点输出graph-easy test.c.006t.vcg --as_dot个1.使用原始转储进行编译,然后使用一些脚本对它们进行预处理,以形成点文件(如this useful article)这两种方法各有优缺点--第一种方法在进行简单转换之前只能得到一个AST转储,但这很容易。第二种方法可以将任何原始转储转换为点格式,但必须支持脚本,这是开销。喜欢什么--是你自己的选择。UPD:时代在变。gcc 4.8.2的全新选项使立即生成点文件成为可能。只需提供:
gcc -fdump-tree-vcg -g test.c
graph-easy test.c.006t.vcg --as_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的新版本。
qojgxg4l2#
根据手册页,您可以通过-fdump-命令获取此信息。让我们看一个虚拟示例:
-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 respresentation(使用了graph选项):
main.c.003t.original main.c.004t.gimple main.c.006t.omplower ... main.c.011t.cfg main.c.011t.cfg.dot ...
使用GraphViz,我们可以为每个函数检索一个打印得很漂亮的图形:
dot -Tpng main.c.011t.cfg.dot -o main.png
您将得到如下所示的结果:main.png有很多开发人员选项可以帮助您了解编译器如何在低级别处理文件:GCC Developer Options
2条答案
按热度按时间dvtswwa31#
有两种方法,都包括两个步骤
1.使用GCC内部vcg支持
1.使用vcg转储编译代码(比如test.c)
gcc -fdump-tree-vcg -g test.c
1.使用任何第三方工具从vcg获取点输出
graph-easy test.c.006t.vcg --as_dot
个1.使用原始转储进行编译,然后使用一些脚本对它们进行预处理,以形成点文件(如this useful article)
这两种方法各有优缺点--第一种方法在进行简单转换之前只能得到一个AST转储,但这很容易。第二种方法可以将任何原始转储转换为点格式,但必须支持脚本,这是开销。
喜欢什么--是你自己的选择。
UPD:时代在变。gcc 4.8.2的全新选项使立即生成点文件成为可能。只需提供:
您将获得大量已格式化的点文件:
请确保使用此选项的GCC的新版本。
qojgxg4l2#
根据手册页,您可以通过
-fdump-
命令获取此信息。让我们看一个虚拟示例:
对于gcc 7.3.0:
有很多选项可以获得必要的信息。请查看手册了解这些信息。
之后,你会得到很多文件。其中一些文件带有.dot respresentation(使用了graph选项):
使用GraphViz,我们可以为每个函数检索一个打印得很漂亮的图形:
您将得到如下所示的结果:main.png
有很多开发人员选项可以帮助您了解编译器如何在低级别处理文件:GCC Developer Options