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

我已经创建了一个树转储,如下所述:
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;
}

我得到的形象:

《理解-fdump-tree使用GraphViz输出gcc》

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

特别是这里的%符号和FREQ:0声明是什么?

最佳答案 您链接的答案显示了如何从GCC调试转储中获取
Control Flow Graph.所以你的图像实际上并没有显示语法树.

GCC C前端在经典意义上没有抽象语法树.在解析过程中会降低很多语法结构,通常是一堆getos.例如,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变体)并不代表使用高级语言结构的控制流,例如for和if语句.

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

点赞