Подтвердить что ты не робот

Как написать собственный код генератора для gcc?

Я создал свой собственный (очень простой) байт-код и виртуальную машину для его выполнения. Он отлично работает, но теперь я хотел бы использовать gcc (или любой другой свободно доступный компилятор) для генерации байтового кода для этого аппарата из обычной программы c. Итак, вопрос в том, как мне изменить или расширить gcc, чтобы он мог выводить мой собственный байтовый код? Обратите внимание, что я НЕ хочу компилировать мой байтовый код в машинный код, я хочу "скомпилировать" c-код для (моего собственного) байтового кода.

Я понимаю, что это потенциально большой вопрос, и вполне возможно, что лучший ответ - "взгляните на исходный код gcc". Мне просто нужна помощь в том, как начать с этого. Я полагаю, что на эту тему должны быть какие-то статьи или книги, которые могли бы описать процесс добавления настраиваемого генератора в gcc, но я ничего не нашел при работе с googling.

4b9b3361

Ответ 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
  • Проведите много исследований и отладки.
  • Удачи.

Ответ 4

Это не так сложно, как все это. Если ваша целевая машина достаточно похожа на другую, возьмите ее RTL (?) Определения как отправную точку и измените их, затем make compile test через стадии начальной загрузки; промыть и повторить до тех пор, пока он не будет работать. Вам, вероятно, не нужно писать какой-либо фактический код, просто шаблоны определения машины.