В своем проекте последнего года я изучаю методы компиляции, и в настоящее время я пытаюсь поэкспериментировать с промежуточным представлением GCC (необработанный GIMPLE) и получить графы потока управления. из разных исходных файлов (C, Cpp и Java) с помощью GCC-5.4.
Пока я могу генерировать *.004t.gimple
и *.011t.cfg
необработанные файлы, используя -fdump-tree-all-graph-raw
, но позже я хочу лучше понять язык GIMPLE, поэтому я поискал его грамматику и нашел следующее:
- GIMPLE WIKI
- ПРОСТО
- GENERIC и GIMPLE
- последний документ GIMPLE (без грамматики !!!)
- GCC FE
- грамматика для gcc-4.3.6
- грамматика для gcc-4.2.1
- GIMPLE Doc для gcc-5.4.0 (имеет грамматики тоже нет !!!)
Таким образом, кажется, что язык постоянно меняется и имеет несколько форматов (GIMPLE высокого уровня, GIMPLE низкого_уровня, SSA GIMPLE, tree </ strong >), а также грамматика, кажется, продолжает меняться между версиями, но я не могу найти грамматику GIMPLE для последних версий, особенно ту, которая используется в GCC-5.4, и я не могу понять различные форматы .
Вопросы по грамматике:
- где я могу найти грамматику GIMPLE, используемую в GCC-5.4 и более поздних версиях?
- как это написано? (в BNF или EBNF или …)
- Как GCC реализует эту грамматику для создания, анализа и понимания файлов Gimple, которые он генерирует, а затем преобразования их в RTL?
- Могу ли я написать небольшое подмножество грамматики GIMPLE в Xtext из примеров
*.004t.gimple
файлов, которые я генерирую?
Вопросы по форматам:
- В чем разница между форматами 3 Gimple? (я не могу найти подробную документацию по каждому из них в вики)
- какой формат используется в необработанных файлах
*.c.004t.gimple
и*.c.011t.cfg
? (Высокий или низкий, …) - какой из них лучше представляет поток управления из исходного исходного кода без оптимизации?
Спасибо,
где я могу найти грамматику GIMPLE … Не думаю, что такое определение существует. Очень простой обзор дан в Удая Хедекера. слайды на странице 33. — person user7724084 schedule 19.07.2019
Как GCC реализует эту грамматику для генерации, анализа и понимания файлов Gimple, которые он генерирует … GCC обычно не выводит gimple в файлы (вы можете потребовать дамп, например, -fdump-tree-all
, но это подразумевается для хакеров компиляторов и не нужны для работы); Структуры gimple генерируются внешним интерфейсом языка (и gimplifier), и они хранятся и обрабатываются в памяти, из которых позже создается rtl. Недавно был добавлен интерфейс GIMPLE (в 7.2, IIRC), но он ни в коем случае не завершен (и, опять же, его цель — сделать возможным написание модульных тестов для компилятора). — person user7724084 schedule 19.07.2019
О, еще я нашел грубую грамматику GIMPLE в статье Джейсона Меррилла GENERIC и GIMPLE: новое представление дерева для всех функций — person user7724084 schedule 19.07.2019
@VladislavIvanishin, спасибо за слайды, я знаю, что есть грубая грамматика GIMPLE из первой статьи и в GCC-4.3.6 и GCC-4.2.1, как вы можете найти в моих ссылках, но я ищу более свежий — person user7724084 schedule 19.07.2019
или, может быть, они удалили грамматику из документов, потому что они больше не используют ее? !! так как это теперь работает? !! как они создают файлы дампа из структур в памяти и представляют ли дампы исходные файлы полностью? — person user7724084 schedule 19.07.2019
как они создают файлы дампа из структур в памяти — ну, они просто ходят по деревьям gimple. Я думаю, что функция dump_function_to_file()
— хорошая точка входа (оттуда можно читать / отлаживать). и представляют ли дампы исходные файлы полностью — я думаю, нет никакой гарантии, потому что, как я уже сказал, эти дампы в основном используются для отладки и тестирования. Кроме того, чтобы быть педантичным, некоторая информация об исходных файлах всегда теряется во время компиляции (но, конечно, сохраняется достаточно, чтобы правильно отражать семантику входной программы). — person user7724084 schedule 19.07.2019
@VladislavIvanishin, похоже, что раньше в GIMPLE была грамматика, но позже она претерпела столько изменений, что грамматика не успевала. и да, он не представляет исходный код должным образом (объяснено в этих примечаниях (nkavvadias.com/ hercules / gimple-notes.html). Также, читая исходный код, похоже, невозможно создать что-то, что понимает (анализирует) GIMPLE в его сгенерированном текстовом формате, поскольку он, похоже, не имеет фиксированная структура (или грамматика), но мне все еще нужно это делать, потому что кажется, что она содержит достаточно информации для того, что я хочу сделать. — person user7724084 schedule 07.08.2019
Похоже, вы только начали изучать GIMPLE и даже не читали документы, которые разместили выше. Я уже некоторое время копаюсь в GCC и постараюсь ответить на ваши вопросы.
В любом случае вам нужно прочитать
gccint
документ, который находится здесь: https://gcc.gnu.org/onlinedocs/gccint.pdf помогает ответить на некоторые вопросы и дает некоторую информацию о GIMPLE, и это единственный документ, где GIMPLE описан хоть как-то. Лучшее описание в источниках, печально но как есть. Смотрите также здесь, https://www.netgull.com/gcc/summit/2003/GENERIC%20and%20GIMPLE.pdf, этот документ основан наgccint
и состоит из некоторых выдержек из.Нет никакой «грамматики GIMPLE», описанной ясно, как язык C, просто посмотрите в источниках, может быть, некоторые плохие примеры в Интернете.
Я думаю, что он генерируется из древовидной грамматики (TAG), основанной на SIMPLE IL, используемой проектом компилятора McCAT в Университете Макгилла [SIMPLE].
Как GCC реализовать и понять? И снова вам нужно заглянуть вглубь GCC,
gimple.h
,basic-block.h
,tree-pass.h
, например, все это лежит в$src/gcc/
. Некоторая часть функций описана вgccint
в разделеGIMPLE
. Ссылкаgccint
не совсем точна, она состоит из некоторых устаревших функций и ссылок, вы должны помнить об этом (например, FOR_EACH_BB, не рекомендуется в 2013 году).Что касается Xtext, я никогда не использовал его, и я не понимаю необходимости писать GIMPLE самостоятельно, который является промежуточным языком
IL
вы можете создать плагин для оптимизации потока кода, но я не вижу необходимости использовать GIMPLE отдельно.О формате.
Существует один формат GIMPLE, но он может иметь две формы, AFAIK.
GIMPLE HIGH
это просто GIMPLE, который не полностью опущен и состоит из IL перед переваломpass_lower_cf
.High GIMPLE
содержит некоторые операторы контейнера, такие как лексические области (представленныеGIMPLE_BIND
) и вложенные выражения (например,GIMPLE_TRY
).Low GIMPLE
предоставляет все неявные переходы для выражений управления и исключений непосредственно в деревьях областейIL
иEH
(EH
означаетException Handling
). Также естьRAW
представление, это своего рода полированная нотация, насколько я понимаю, ИМО, оно более полезно, чем обычное представление, вы можете получить его, например, с-fdump-tree-all-all-raw
.*.c.004t.gimple
— это первый шаг появления GIMPLE,*.c.011t.cfg
— первая попытка графа потока управления (cfg
). Внутреннее имя GIMPLE lower — «lower
«, вы можете увидеть их вgimple-low.c
в разделеВы можете воспользоваться поиском и обнаружить, что этот проход
*.c.007t.lower
Ответ выше, я думаю, я использую представление RAW, это более информативно IMO.
Это немного, но я надеюсь, что это поможет вам в исследовании GCC, и извините за мой плохой «английский язык».
Итак, после просмотра исходных файлов я лучше понимаю, как создаются файлы GIMPLE, но все же это не помогает мне читать (анализировать) эти файлы, так как я пытаюсь извлечь некоторую информацию, которая существует в файлах, и, возможно, даже перевести их на другой язык как в этом. (nkavvadias.com/hercules/#gimple2nac) — person user7724084; 08.08.2019
попробуйте прочитать о GIMPLE и CFG в gccint, и в то же время попытайтесь изучить проходы gimple, сгенерированные -fdump-tree-all-lneno-raw, это мой метод, и на данный момент я просто добавил проход, который обрабатывает ситуация мне нужна. Попробуйте спросить конкретнее. — person user7724084; 14.08.2019