代码之家  ›  专栏  ›  技术社区  ›  funnydman

理解-fdump树输出gcc和graphviz

  •  4
  • funnydman  · 技术社区  · 7 年前

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

    我得到的图像是:

    Graph generated via GraphViz

    我知道gcc不是学习ast表示的最佳方法。但无论如何,理解图像的内容意味着什么是好的。

    尤其是什么 % 在这里签字意味着 FREQ:0 声明?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Florian Weimer    7 年前

    您链接的答案显示了如何获取 Control Flow Graph 从gcc调试转储。所以你的图片并没有显示语法树。

    gcc c前端没有经典意义上的抽象语法树。在解析过程中,许多语法结构被降低,通常是 goto 比如说, 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 转储(在 康德西普 节点打印为C 如果 声明)。但是没有 .dot 从该过程生成的文件。一旦编译过程进入中间端,它就是gimple,gimple(作为ssa变体)不表示使用高级语言构造的控制流,例如 for 如果 所有的陈述。

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