Как я могу сбросить абстрактное дерево синтаксиса, сгенерированное 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