Поиск последней грамматики GCC GIMPLE

В своем проекте последнего года я изучаю методы компиляции, и в настоящее время я пытаюсь поэкспериментировать с промежуточным представлением GCC (необработанный GIMPLE) и получить графы потока управления. из разных исходных файлов (C, Cpp и Java) с помощью GCC-5.4.

Пока я могу генерировать *.004t.gimple и *.011t.cfg необработанные файлы, используя -fdump-tree-all-graph-raw, но позже я хочу лучше понять язык GIMPLE, поэтому я поискал его грамматику и нашел следующее:

Таким образом, кажется, что язык постоянно меняется и имеет несколько форматов (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? (Высокий или низкий, …)
  • какой из них лучше представляет поток управления из исходного исходного кода без оптимизации?
См. также:  Препроцессор GCC не работает? Время компиляции больших файлов с комментариями или без них

Спасибо,

где я могу найти грамматику 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

См. также:  Возникли проблемы с перемещением объекта на экране в Python с помощью pygame

@VladislavIvanishin, похоже, что раньше в GIMPLE была грамматика, но позже она претерпела столько изменений, что грамматика не успевала. и да, он не представляет исходный код должным образом (объяснено в этих примечаниях (nkavvadias.com/ hercules / gimple-notes.html). Также, читая исходный код, похоже, невозможно создать что-то, что понимает (анализирует) GIMPLE в его сгенерированном текстовом формате, поскольку он, похоже, не имеет фиксированная структура (или грамматика), но мне все еще нужно это делать, потому что кажется, что она содержит достаточно информации для того, что я хочу сделать.   —  person user7724084    schedule 07.08.2019

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. user7724084

    Похоже, вы только начали изучать GIMPLE и даже не читали документы, которые разместили выше. Я уже некоторое время копаюсь в GCC и постараюсь ответить на ваши вопросы.

    1. В любом случае вам нужно прочитать gccint документ, который находится здесь: https://gcc.gnu.org/onlinedocs/gccint.pdf помогает ответить на некоторые вопросы и дает некоторую информацию о GIMPLE, и это единственный документ, где GIMPLE описан хоть как-то. Лучшее описание в источниках, печально но как есть. Смотрите также здесь, https://www.netgull.com/gcc/summit/2003/GENERIC%20and%20GIMPLE.pdf, этот документ основан на gccint и состоит из некоторых выдержек из.

    2. Нет никакой «грамматики GIMPLE», описанной ясно, как язык C, просто посмотрите в источниках, может быть, некоторые плохие примеры в Интернете.

    3. Я думаю, что он генерируется из древовидной грамматики (TAG), основанной на SIMPLE IL, используемой проектом компилятора McCAT в Университете Макгилла [SIMPLE].

    4. Как GCC реализовать и понять? И снова вам нужно заглянуть вглубь GCC, gimple.h, basic-block.h, tree-pass.h, например, все это лежит в $src/gcc/. Некоторая часть функций описана в gccint в разделе GIMPLE. Ссылка gccint не совсем точна, она состоит из некоторых устаревших функций и ссылок, вы должны помнить об этом (например, FOR_EACH_BB, не рекомендуется в 2013 году).

    5. Что касается Xtext, я никогда не использовал его, и я не понимаю необходимости писать GIMPLE самостоятельно, который является промежуточным языком IL вы можете создать плагин для оптимизации потока кода, но я не вижу необходимости использовать GIMPLE отдельно.

    О формате.

    1. Существует один формат 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.

    2. *.c.004t.gimple — это первый шаг появления GIMPLE, *.c.011t.cfg — первая попытка графа потока управления (cfg). Внутреннее имя GIMPLE lower — «lower«, вы можете увидеть их в gimple-low.c в разделе

      const pass_data pass_data_lower_cf =
      {
        GIMPLE_PASS, /* type */
        "lower", /* name */
        OPTGROUP_NONE, /* optinfo_flags */
        TV_NONE, /* tv_id */
        PROP_gimple_any, /* properties_required */
        PROP_gimple_lcf, /* properties_provided */
        0, /* properties_destroyed */
        0, /* todo_flags_start */
        0, /* todo_flags_finish */
      };
      

      Вы можете воспользоваться поиском и обнаружить, что этот проход *.c.007t.lower

    3. Ответ выше, я думаю, я использую представление 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

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: