Игра с промежуточным GIMPLE форматом gcc - PullRequest
7 голосов
/ 01 февраля 2012

Согласно этой статье gcc использует несколько промежуточных форматов перед генерацией кода. Я читал, что в формате GIMPLE используется трехадресный код, который, кажется, является самым простым промежуточным языком для использования. Но мне нужно больше подробностей, так как мне нужно создать инструмент, который может взять промежуточный код и вставить в него некоторый код перед генерацией окончательного кода.

Для этого мне сначала нужно знать, как я могу даже сгенерировать код формата GIMPLE и сохранить его в файл. Поэтому я ищу некоторые документы и примеры. Кроме того, если кто-то работал с такими вещами, могу ли я знать сложность этой задачи, которая заключается в том, чтобы вставить некоторый код в промежуточный код?

Ответы [ 3 ]

14 голосов
/ 01 февраля 2012

Возможно, вам будет проще написать плагин для GCC, который позволит вам перехватить поколение GIMPLE и изменить его внутри GCC, что должно сократить время сохранения, редактирования и попытки компиляции изДУМАЯ форма. MELT является одним из таких плагинов (хотя он предлагает способ больше, чем просто изменение представлений нижнего уровня).Здесь также есть хороший PDF здесь о плагинах, изменяющих GIMPLE.

Иначе, вы можете посмотреть здесь для информации о том, как работает GIMPLE GCC.С точки зрения выгрузки GIMPLE:

Вы можете запросить вывод C-образного представления формы GIMPLE с флагом -fdump-tree-gimple.

6 голосов
/ 13 июля 2012

Вы можете легко сгенерировать GIMPLE-представление любого файла, используя флаг -fdump-tree-gimple.

Если вы хотите написать плагин, вас может заинтересовать, как проходы работают в GCC. Вы можете увидеть результат каждого прохода с флагами вида:

-fdump-<ir>-<passname>

, где ir может быть:

  • tree: внутрипроцедурные проходы на GIMPLE
  • ipa: межпроцедурные проходы на ПОДАРОК ​​
  • rtl: внутрипроцедурные проходы по RTL

Используйте <passname> = all для просмотра всех дампов, например, -fdump-ipa-all.

0 голосов
/ 18 сентября 2012

Я попробовал флаг -fdump-tree-gimple.Он работает только для языка C / C ++, но не для других языков, таких как Java, Ada, Fortran и Objective-C)

...