Компиляция объектного файла из промежуточного файла gcc - PullRequest
5 голосов
/ 02 февраля 2012

Используя флаг -fdump-tree - *, можно вывести некоторый файл промежуточного формата во время компиляции файла исходного кода.Мой вопрос заключается в том, можно ли использовать этот промежуточный файл в качестве входных данных для gcc, чтобы получить конечный объектный файл.

Я спрашиваю об этом, потому что хочу добавить некоторый код в промежуточный файл gimple (полученный с использованием флага -fdump-tree-gimple )формат.Конечно, я могу использовать хуки и добавить свой проход, но пока не хочу доходить до такого уровня сложности.Я просто хочу дать gcc мой измененный промежуточный файл, чтобы он мог начать его компиляцию и дать мне окончательный объектный файл.Есть идеи как этого добиться?

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

GIMPLE был двоичным внутренним форматом, который трудно полностью выгрузить и перезагрузить обратно. По сравнению с LLVM, LLVM IR был спроектирован , чтобы его можно было выгружать и загружать в обычный файл (текстовый и двоичный формат таких файлов полностью конвертируемы друг в друга). Вы можете запустить Clang для запуска LLVMIR, затем запустить программу opt с некоторыми оптимизациями, затем с другими, и между фазами будут файлы битового кода IR LLVM. И тогда вы можете запустить генерацию кода из ИК-битового кода в собственный код (даже теоретически для не той же платформы, см. Проект PNaCl).

Есть несколько проектов сброса / перезагрузки внутреннего представления GCC. Я знаю, что такой проект был создан для интеграции gcc с коммерческим инструментом компилятора. Автор не может просто связать коммерческий код с gcc, потому что gcc - это VIRAL (он заразит любой связанный код антикоммерческим GPL). Итак, автор написал GPL-дампер / загрузчик GIMPLE в некотором внешнем (xml) формате; проприетарный инструмент смог прочитать и перевести этот XML в другой XML того же формата, а затем он был перезагружен обратно с помощью инструмента GPL.

В более новом gcc у вас есть возможность написать плагин, который является ВИРУСНЫМ (23.2.1) в терминах GPL. Плагин будет работать с представлением программы в памяти, и не будет проблем с выгрузкой / перезагрузкой GIMPLE через внешний файл. Есть некоторые плагины, которые могут быть настроены / могут использовать предоставленную пользователем программу, например, MELT (Lisp) и GCC Python (Python). Некоторый список плагинов gcc есть

1 голос
/ 02 февраля 2012

Нет встроенного средства для перевода текстового представления GIMPLE обратно в исходное внутреннее представление GIMPLE.

Вам понадобится пользовательский интерфейс (например, GIMPLE FE ), чтобы понять, что такое GIMPLE.

...