使用 GraphViz 了解 -fdump-tree 输出 gcc

Understanding -fdump-tree output gcc with GraphViz

我已经按照此处所述创建了一个树转储:How can I dump an abstract syntax tree generated by gcc into a .dot file? 用于此虚拟脚本:

int fact(int n) {
    if (n<=1) {
        return 1;
    }
    return n * fact(n-1);
}

int main(void) {
    int a = 4;
    int res = fact(a);
    return res;
}

以及我得到的图像:

据我所知,gcc 并不是学习 AST 表示的最佳方式。但无论如何,了解图像内容的含义会很好。

特别是这里的 % 符号和 FREQ:0 语句是什么意思?

您 link 的回答显示了如何从 GCC 调试转储中获取 Control Flow Graph。所以你的图片实际上并没有显示语法树。

GCC C 前端没有传统意义上的抽象语法树。很多句法结构在解析过程中被降低,通常是一堆 gotos。例如,c_finish_loop 有这个:

  /* If we have an exit condition, then we build an IF with gotos either
     out of the loop, or to the top of it.  If there's no exit condition,
     then we just build a jump back to the top.  */
  exit = build_and_jump (&LABEL_EXPR_LABEL (top));

if 个语句变成 COND_EXPR 个节点。您可以在 .original 转储中看到这一点(其中 COND_EXPR 节点像 C if 语句一样打印)。但是没有从该遍生成 .dot 文件。一旦编译过程进入中端,就是 GIMPLE,而 GIMPLE(作为 SSA 的变体)根本不代表使用 forif 语句等高级语言结构的控制流。

Clang 有一个更传统的 AST,由 clang -Xclang -ast-dump 打印。它仍然不适合 Graphviz 的输入,但至少数据在那里。如果您的目标是了解 GCC,请查看 C++ 前端,它在解析器中保留了更丰富的结构。