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

如何将gcc生成的抽象语法树转储到.dot文件中?,gcc,graphviz,dot,abstract-syntax-tree,Gcc,Graphviz,Dot,Abstract Syntax Tree,我认为问题的标题是不言自明的,我想将gcc生成的抽象语法树转储到.dot文件(那些由Graphviz生成的文件)中,因为我想在.png文件或类似文件中查看它。我有办法做到吗 提前感谢:)有两种方法,都包括两个步骤 使用GCC内部vcg支持 使用vcg转储编译代码(比如test.c) gcc-fdump树vcg-g test.c 使用任何第三方工具从vcg获取点输出 graph easy test.c.006t.vcg--as_dot 使用原始转储进行编译,然后使用一些脚本对其进行预处理以形成点

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


提前感谢:)

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

  • 使用GCC内部vcg支持

  • 使用vcg转储编译代码(比如test.c)

    gcc-fdump树vcg-g test.c

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

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

  • 使用原始转储进行编译,然后使用一些脚本对其进行预处理以形成点文件(如中)

  • 这两种方法都有各自的优点和缺点——使用first,在gimple翻译之前,您实际上只能获得一次AST转储,但这很容易。使用second,您可以将任何原始转储转换为点格式,但必须支持脚本,这是开销

    喜欢什么--由你自己选择


    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与此选项一起使用。

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

    让我们看一个虚拟示例:

    // main.c
    
    int sum(int a, int b) {
        return a + b;
    }
    
    int main(void) {
        if (sum(8, 10) < 20) {
            return -1;
        }
        return 1;
    }
    
    有很多选择可以获得必要的信息。有关此信息,请参阅手册

    之后,您将获得许多文件。其中一些带有.dot respresentation(使用图形选项):

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

    dot -Tpng main.c.011t.cfg.dot -o main.png
    
    你会得到这样的结果:


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

    这很有帮助:)谢谢。请更新或检查您的答案:GCC 4.8.2说
    cc1:错误:无法识别的命令行选项“-fdump tree vcg”
    。感谢您的通知,更新了答案。较新版本的GCC使事情变得更加简单。严格来说,除了第一个之外,所有的
    -fdump tree XXX
    都是SSA IR,而不是AST。是
    -fdump tree vcg
    不再可用。
    main.c.003t.original
    main.c.004t.gimple
    main.c.006t.omplower
    ...
    main.c.011t.cfg
    main.c.011t.cfg.dot
    ...
    
    dot -Tpng main.c.011t.cfg.dot -o main.png