我该如何将gcc生成的抽象语法树导出到.dot文件中?

23

我认为问题的标题已经很明确了,我想把由gcc生成的抽象语法树转储到一个.dot文件中(这些文件由Graphviz生成),因为我想在一个.png文件或类似文件中查看它。有没有办法可以做到这一点?

2个回答

36

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

  1. 使用 GCC 内部的 VCG 支持

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

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

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

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

  2. 使用原始转储进行编译,然后使用一些脚本对它们进行预处理以形成 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。


4
请更新或检查您的回答:GCC 4.8.2显示 cc1: error: unrecognized command line option '-fdump-tree-vcg' - Ali
感谢您的注意,已更新答案。新版本的GCC使事情变得更加容易。 - Konstantin Vladimirov
2
严格来说,除了第一个之外的所有-fdump-tree-XXX都是SSA IR,而不是AST。是的, -fdump-tree-vcg已不再可用。 - yugr

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

使用GraphViz,我们可以为每个函数检索一个漂亮的打印图表:
dot -Tpng main.c.011t.cfg.dot -o main.png

你会得到类似于这样的东西: main.png 有许多开发者选项可以帮助你了解编译器在低级别上处理文件的方式:GCC 开发者选项

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接