Как написать собственный код генератора для gcc?
Я создал свой собственный (очень простой) байт-код и виртуальную машину для его выполнения. Он отлично работает, но теперь я хотел бы использовать gcc (или любой другой свободно доступный компилятор) для генерации байтового кода для этого аппарата из обычной программы c. Итак, вопрос в том, как мне изменить или расширить gcc, чтобы он мог выводить мой собственный байтовый код? Обратите внимание, что я НЕ хочу компилировать мой байтовый код в машинный код, я хочу "скомпилировать" c-код для (моего собственного) байтового кода.
Я понимаю, что это потенциально большой вопрос, и вполне возможно, что лучший ответ - "взгляните на исходный код gcc". Мне просто нужна помощь в том, как начать с этого. Я полагаю, что на эту тему должны быть какие-то статьи или книги, которые могли бы описать процесс добавления настраиваемого генератора в gcc, но я ничего не нашел при работе с googling.
Ответы
Ответ 1
Это тяжелая работа.
Например, я также создаю свою собственную "архитектуру" с моим собственным байтовым кодом и хотел бы сгенерировать код C/С++ с GCC для него. Вот как я это делаю:
- Сначала вы должны прочитать все о портировании в руководстве GCC.
- Также не забывайте, что прочитайте GCC Internals.
- Читайте много о компиляторах.
- Также посмотрите на question и ответы здесь.
- Google для получения дополнительной информации.
- Спросите себя, действительно ли вы готовы.
- Будьте уверены, что у вас очень хорошая машина для кафе... вам это понадобится.
- Начать добавлять файлы зависимостей машин в gcc.
- Скомпилируйте gcc в режиме перекрестного хоста.
- Проверьте результат кода в Hex-редакторе.
- Сделайте больше тестов.
- Теперь получайте удовольствие от своей собственной архитектуры: D
Когда вы закончите, вы можете использовать c или С++ только без библиотек os-dependet (у вас в настоящее время нет операционной системы на вашей архитектуре), и теперь вы должны (если вам это нужно) скомпилировать многие другие библиотеки с вашим кросс-компилятором, чтобы иметь хорошая структура.
PS: LLVM (Clang) проще переносить... возможно, вы хотите начать там?
Ответ 2
Я занят переносом gcc на 8-битный процессор, который мы разрабатываем ранее. Я считаю себя сложной задачей для нашей машины, потому что она 8-битная, и у нас есть только один накопитель, но если у вас есть больше ресурсов, это может стать легко. Вот как мы пытаемся управлять им с помощью gcc 4.9 и с помощью cygwin:
- Загрузите источник gcc 4.9
- Добавьте название вашей архитектуры в
config.sub
вокруг строки 250 ищите # Decode aliases for certain CPU-COMPANY combinations.
В этом списке добавьте | my_processor \
- В этом же файле найдите
# Recognize the basic CPU types with company name.
добавьте себя в список: | my_processor-* \
-
Найдите файл gcc/config.gcc
, в файле найдите case ${target}, он находится вокруг строки 880, добавьте себя следующим образом:
;;
my_processor*-*-*)
c_target_objs="my_processor-c.o"
cxx_target_objs="my_processor-c.o"
target_has_targetm_common=no
tmake_file="${tmake_file} my_processor/t-my_processor"
;;
- Создать папку
gcc-4.9.0\gcc\config\my_processor
- Скопируйте файлы из существующего проекта и просто отредактируйте его или создайте свой собственный с нуля. В нашем проекте мы скопировали все файлы из проекта msp430 и отредактировали все это
- У вас должны быть следующие файлы (не все файлы обязательны):
-
my_processor.c
-
my_processor.h
-
my_processor.md
-
my_processor.opt
-
my_processor-c.c
-
my_processor.def
-
my_processor-protos.h
-
constraints.md
-
predicates.md
-
README.txt
-
t-my_processor
- создать путь
gcc-4.9.0/build/object
- run
../../configure --target=my_processor --prefix=path for my compiler --enable-languages="c"
- сделать
- make install
- Проведите много исследований и отладки.
- Удачи.
Ответ 3
Смотрите ссылки, размещенные в ответах в теме, начиная с http://gcc.gnu.org/ml/gcc/2012-05/msg00010.html
Ответ 4
Это не так сложно, как все это. Если ваша целевая машина достаточно похожа на другую, возьмите ее RTL (?) Определения как отправную точку и измените их, затем make compile test
через стадии начальной загрузки; промыть и повторить до тех пор, пока он не будет работать. Вам, вероятно, не нужно писать какой-либо фактический код, просто шаблоны определения машины.