20

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

提前致谢 :)

4

2 回答 2

32

有两种方法,都包括两个步骤

  1. 使用 GCC 内部 vcg 支持

    1. 用 vcg 转储编译你的代码(比如 test.c)

      gcc -fdump-tree-vcg -g test.c

    2. 使用任何第三方工具从 vcg 获取点输出

      graph-easy test.c.006t.vcg --as_dot

  2. 使用原始转储进行编译,然后使用一些脚本对其进行预处理以形成点文件(就像在这篇有用的文章中一样)

这两种方法都有其优点和缺点——首先,在 gimple 翻译之前,你实际上只能得到一个 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。

于 2013-04-04T06:29:03.867 回答
8

根据手册页,您可以通过-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(使用图形选项):

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 开发人员选项

于 2019-01-06T08:05:21.143 回答