Jak napisać własny backend generatora kodu dla gcc?

Stworzyłem własny (bardzo prosty) język kodu bajtowego i maszynę wirtualną do jego wykonania. To działa dobrze, ale teraz chciałbym użyć gcc (lub innego swobodnie dostępnego kompilatora)do generowania kodu bajtowego dla tej maszyny z normalnego programu C. Więc pytanie brzmi, jak zmodyfikować lub rozszerzyć gcc tak, że może wyprowadzić mój własny kod bajtowy? Zauważ, że nie chcę kompilować kodu bajtowego do kodu maszynowego, chcę "skompilować" kod c do (własnego) kodu bajtowego.

Zdaję sobie sprawę że jest to potencjalnie duże pytanie i jest możliwe, że najlepszą odpowiedzią jest "idź spojrzeć na kod źródłowy gcc". Potrzebuję tylko pomocy, jak zacząć. Domyślam się, że muszą być jakieś artykuły lub książki na ten temat, które mogłyby opisać proces dodawania niestandardowego generatora do gcc, ale nie znalazłem nic przez googlowanie.

Author: Mats Ekberg, 2012-05-16

3 answers

To ciężka praca.

Na przykład projektuję własną "architekturę" z własnym kodem bajtowym i chciałem wygenerować dla niego kod C/c++ z GCC. Tak to robię:

  1. na początku powinieneś przeczytać wszystko o portowaniu w instrukcji GCC.
  2. nie zapomnij również przeczytać GCC wewnętrzne .
  3. przeczytaj wiele rzeczy o kompilatorach.
  4. Spójrz również na to pytanie i odpowiedzi tutaj.
  5. Google dla więcej informacji.
  6. Zadaj sobie pytanie, czy jesteś naprawdę gotowy. Upewnij się, że masz bardzo dobrą maszynę do kawiarni... będziesz go potrzebował.
  7. zacznij dodawać pliki zależne od Maszyny do gcc.
  8. skompilować gcc w sposób krzyżowy host-cel.
  9. Sprawdź wyniki kodu W Hex-Editorze.
  10. Zrób więcej testów.
  11. teraz baw się z własną architekturą: d

Po zakończeniu możesz używać c lub c++ tylko bez bibliotek os-dependet (aktualnie nie masz uruchamianie systemu operacyjnego na Twojej architekturze) i powinieneś teraz (jeśli potrzebujesz) skompilować wiele innych bibliotek za pomocą kompilatora krzyżowego, aby mieć dobry framework.

PS: LLVM (Clang ) jest łatwiejszy do portu... może chcesz zacząć od tego?

 11
Author: pearcoding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:32

Jestem zajęty portowaniem gcc na 8-bitowy procesor, który zaprojektowaliśmy wcześniej. I jest rodzajem trudnym zadaniem dla naszej maszyny, ponieważ jest 8-bitowy i mamy tylko jeden akumulator, ale jeśli masz więcej zasobów może stać się łatwe. W ten sposób staramy się zarządzać nim za pomocą gcc 4.9 i za pomocą Cygwina: {]}

  1. Pobierz gcc 4.9 źródło
  2. Dodaj swoją nazwę architektury do config.sub wokół linii 250 poszukaj # Decode aliases for certain CPU-COMPANY combinations. na tej liście dodaj | my_processor \
  3. w tym samym pliku poszukaj # Recognize the basic CPU types with company name. Dodaj siebie do listy: | my_processor-* \
  4. Wyszukaj plik gcc/config.gcc, w pliku poszukaj case ${target} jest to około linii 880, dodaj się w następujący sposób:

      ;;
    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"
      ;;
    
  5. Utwórz folder gcc-4.9.0\gcc\config\my_processor
  6. skopiuj pliki z istniejącego projektu i po prostu go Edytuj lub stwórz swój własny od zera. W naszym projekcie skopiowaliśmy wszystkie pliki z projektu msp430 i edytowaliśmy je wszystkie
  7. powinieneś mieć następujące pliki (nie wszystkie pliki są obowiązkowe):
    • 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
  8. Utwórz ścieżkę gcc-4.9.0/build/object
  9. run ../../configure --target=my_processor --prefix=path for my compiler --enable-languages="c"
  10. make
  11. make install
  12. wykonaj wiele badań i debugowania.
  13. Baw się dobrze.
 29
Author: Tanyong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-30 10:17:52

To nie jest takie trudne. Jeśli twoja maszyna docelowa jest rozsądnie podobna do innej, weź jej RTL (?) definicje jako punkt wyjścia i je zmienić, a następnie {[0] } przez etapy bootstrap; płukać i powtarzać, aż zadziała. Prawdopodobnie nie musisz pisać żadnego rzeczywistego kodu, tylko szablony definicji maszyny.

 3
Author: user207421,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-17 05:23:14