如何将gcc生成的抽象语法树转储到.dot文件中?

5uzkadbs  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(181)

我想问题的标题是不言自明的,我想把一个由gcc生成的抽象语法树转储到一个.dot文件(那些由Graphviz生成的文件),因为我想在一个.png文件或类似的文件中查看它。有什么方法可以做到这一点吗?

dvtswwa3

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 test.c -fdump-tree-all-graph

您将获得大量已格式化的点文件:

test.c.008t.lower.dot
test.c.012t.cfg.dot
test.c.016t.ssa.dot
... etc ...

请确保使用此选项的GCC的新版本。

qojgxg4l

qojgxg4l2#

根据手册页,您可以通过-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

相关问题