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

asd*_*van 14 gcc dot abstract-syntax-tree graphviz

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

提前致谢 :)

Kon*_*rov 20

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

  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
Run Code Online (Sandbox Code Playgroud)

并且你将获得大量已经格式化的点文件:

test.c.008t.lower.dot
test.c.012t.cfg.dot
test.c.016t.ssa.dot
... etc ...
Run Code Online (Sandbox Code Playgroud)

请务必使用此选项使用新版本的GCC.

  • 请更新或检查你的答案:GCC 4.8.2说`cc1:错误:无法识别的命令行选项'-fdump-tree-vcg'`. (2认同)
  • 严格来说,除了第一个之外的所有“-fdump-tree-XXX”都是 SSA IR,而不是 AST。是的,“-fdump-tree-vcg”不再可用。 (2认同)

fun*_*man 5

根据手册页,您可以通过-fdump-命令获取此信息。

让我们看一个虚拟示例:

// main.c

int sum(int a, int b) {
    return a + b;
}

int main(void) {
    if (sum(8, 10) < 20) {
        return -1;
    }
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

对于 gcc 7.3.0:

gcc -fdump-tree-all-graph main.c -o main
Run Code Online (Sandbox Code Playgroud)

有很多选项可以获取必要的信息。查看手册以获取此信息。

之后,你会得到很多文件。其中一些带有 .dot 表示(使用图形选项):

main.c.003t.original
main.c.004t.gimple
main.c.006t.omplower
...
main.c.011t.cfg
main.c.011t.cfg.dot
...
Run Code Online (Sandbox Code Playgroud)

使用 GraphViz,我们可以为每个函数检索一个漂亮的打印图:

dot -Tpng main.c.011t.cfg.dot -o main.png
Run Code Online (Sandbox Code Playgroud)

你会得到这样的东西: main.png

有很多开发人员选项可以帮助您了解编译器如何在低级别处理您的文件:GCC 开发人员选项