Как я могу сбросить абстрактное дерево синтаксиса, сгенерированное gcc, в .dot файл?

Я думаю, что заголовок вопроса является самоочевидным, я хочу сбросить абстрактное синтаксическое дерево, сгенерированное gcc, в .dot файл (те файлы, сгенерированные Graphviz), потому что тогда я хочу просмотреть его в .png файле или аналогичном. Могу ли я это сделать?

Заранее спасибо:)

Ответ 1

Существует два метода, включая два шага

  • Использование внутренней поддержки VCG GCC

    • Скомпилируйте свой код (скажем, test.c) с помощью vcg dumps

      gcc -fdump-tree-vcg -g test.c

    • Используйте любой сторонний инструмент для получения точечного вывода из vcg

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

  • Скомпилируйте с исходными дампами, а затем предварительно обработайте их некоторыми скриптами для создания точечных файлов (например, эта полезная статья)

Оба метода имеют свои хорошие и плохие стороны - сначала вы можете получить только один свалку AST перед gimple translation, но это легко. Во-вторых, вы можете конвертировать любой необработанный дамп в dot-формат, но вы должны поддерживать скрипты, то есть накладные расходы.

Что предпочитает - по вашему выбору.


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 с этой опцией.

Ответ 2

Согласно справочной странице, вы можете получить эту информацию с помощью команды -fdump-.

Давайте посмотрим на фиктивный пример:

// main.c

int sum(int a, int b) {
    return a + b;
}

int main(void) {
    if (sum(8, 10) < 20) {
        return -1;
    }
    return 1;
}

Для gcc 7.3.0:

gcc -fdump-tree-all-graph main.c -o main

Есть много вариантов, чтобы получить необходимую информацию. Проверьте руководство для этой информации.

После этого вы получите много файлов. Некоторые из них с .dot respresentation (используется графическая опция):

main.c.003t.original
main.c.004t.gimple
main.c.006t.omplower
...
main.c.011t.cfg
main.c.011t.cfg.dot
...

С GraphViz мы можем получить довольно распечатанный график для каждой функции:

dot -Tpng main.c.011t.cfg.dot -o main.png

Вы получите что-то вроде этого: main.png

Существует множество опций разработчика, которые могут помочь вам понять, как компилятор обрабатывает ваш файл на низком уровне: GCC Developer Options