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

时间:2013-04-03 23:50:48

标签: gcc graphviz dot abstract-syntax-tree

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

提前致谢:)

2 个答案:

答案 0 :(得分: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. 使用原始转储进行编译,然后使用一些脚本对其进行预处理以形成点文件(如this useful article中所示)

  3. 这两种方法都有各自的优点和缺点 - 首先你可以在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。

答案 1 :(得分:1)

根据手册页,您可以通过-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表示形式(使用了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