Игра с промежуточным форматом gcc
Согласно этой статье, gcc использует несколько промежуточных форматов перед генерацией кода. Я читал, что в формате GIMPLE используется трехадресный код, который, кажется, является самым простым промежуточным языком для использования. Но мне нужно больше подробностей, так как мне нужно создать инструмент, который может взять промежуточный код и вставить в него некоторый код перед генерацией окончательного кода.
Для этого мне сначала нужно узнать, как я могу даже сгенерировать код формата GIMPLE и сохранить его в файле. Поэтому я ищу некоторые документы и примеры. Кроме того, если кто-то работал с такими вещами, могу ли я знать сложность этой задачи, которая заключается в том, чтобы вставить некоторый код в промежуточный код?
3 ответа
Возможно, вам будет проще написать плагин для GCC, который позволит вам подключить поколение GIMPLE и изменить его внутри GCC, что должно сократить время сохранения, редактирования и попытки компиляции из формы GIMPLE. MELT является одним из таких плагинов (хотя он предлагает гораздо больше, чем просто изменение представлений нижнего уровня). Здесь также есть хороший PDF-файл о сменных плагинах GIMPLE.
Иначе, вы можете посмотреть здесь информацию о том, как работает GIMPLE GCC. С точки зрения демпинга GIMPLE из:
Вы можете запросить вывод C-подобного представления формы GIMPLE с флагом -fdump-tree-gimple.
Вы можете легко сгенерировать GIMPLE представление любого файла, используя флаг -fdump-tree-gimple
,
Если вы хотите написать плагин, то вам может быть интересно, как проходы работают в GCC. Вы можете увидеть результат каждого прохода с флагами вида:
-fdump-<ir>-<passname>
где ir
может быть:
tree
: Внутрипроцедурные проходы на ПОДАРОКipa
: Межпроцедурные пасы на GIMPLErtl
: Внутрипроцедурные проходы по RTL
использование <passname> = all
чтобы увидеть все свалки, например -fdump-ipa-all
,
Я попробовал флаг -fdump-tree-gimple
, Он работает только для языка C/C++, но не для других языков, таких как Java, Ada, Fortran и Objective-C)