Понимание -fdump-дерева вывода gcc с GraphViz - PullRequest
0 голосов
/ 12 января 2019

Я создал дамп дерева, как описано здесь: Как я могу вывести абстрактное синтаксическое дерево, сгенерированное gcc, в файл .dot? для этого фиктивного скрипта:

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 Ответ

0 голосов
/ 13 января 2019

Ответ, который вы связываете, показывает, как получить График потока управления из дампов отладки 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 (где узел COND_EXPR печатается как оператор C if). Но нет файла .dot, сгенерированного из этого прохода. Как только процесс компиляции переходит в средний конец, он становится GIMPLE, а GIMPLE (как вариант SSA) вообще не представляет поток управления, используя языковые конструкции высокого уровня, такие как операторы for и if.

Clang имеет более традиционный AST, напечатанный clang -Xclang -ast-dump. Это все еще не подходит для Graphviz, но, по крайней мере, данные есть. Если ваша цель - понять GCC, взгляните на интерфейс C ++, который сохраняет более богатую структуру в синтаксическом анализаторе.

...