Niedawno, próbując doskonalić swoje umiejętności związane z montażem, napisałem bardzo prosty kompilator dla języka zabawkowego w C++. Działa on w trybie pojedynczego przejścia i bezpośrednio emituje kod podczas fazy analizy do kilku strumieni strunowych, z których każdy reprezentuje część kodu (to znaczy reprezentuje section .bss
, podczas gdy inne reprezentują .data
i .text
). Następnie te strumienie ciągów są zapisywane do pliku i używam NASM i gcc do ich łączenia i łączenia. Wiem, że to podejście jednoprzebiegowe jest okropnie nieefektywne, ale znowu było to raczej ćwiczenie w rozumieniu etapu generowania kodu niż cokolwiek innego. W każdym razie, chciałbym zmodyfikować mój kod, by bezpośrednio emitować LLVM IL zamiast surowego montażu, ponownie jako ćwiczenie uczenia się. Czy istnieje przewodnik wprowadzający do LLVM IL? Lub, jeszcze lepiej, narzędzie do ustalenia równoważnego kodu IL dla linii złożenia? Spojrzałem i znalazłem tylko pełną specyfikację, która jest DROGĄ więcej informacji, niż potrzebuję.Przenoszenie kompilatora z zestawu x86 do LLVM
Odpowiedz
Numer referencyjny LLVM IR to available here. Zwróć uwagę, że jest to szczegółowa strona referencyjna, a nie samouczek. Nie ma bezpośredniej zależności 1-do-1 między montażem x86 a LLVM IR, chociaż ponieważ LLVM IR jest wyższym poziomem i bardziej ogólnym niż montaż x86, nie powinno być zbyt trudno dostosować kompilator do emitowania x86 do emitowania LLVM IR.
Oficjalna dokumentacja LLVM jest dostarczana z detailed tutorial, która jest absolutnie najlepszym miejscem dla ciebie - przechodzi przez tworzenie kompilatora zabawek od uproszczonego języka programowania wysokiego poziomu do LLVM IR. Pracując nad nim, nauczysz się wielu kluczowych pojęć LLVM, a następnie będziesz mógł efektywnie korzystać z wyżej wspomnianego języka odniesienia.
Jeśli napotkasz jakieś problemy z tutorialem, zgłoś je do śledzenia błędów LLVM lub listy mailingowej. Samouczek powinien działać poprawnie, a każdy zgłoszony problem zostanie naprawiony.
Innym dobrym źródłem początkowym do zrozumienia LLVM IR jest online demo page. To pozwala na kompilację fragmentów kodu C do LLVM IR online (bez instalowania czegokolwiek) i powinno być bardzo pomocne w zrozumieniu, jak podstawowe konstrukcje programistyczne mogą być reprezentowane w LLVM IR.
Dziękuję! Nigdy nie widziałem tej strony demo, dokładnie tego szukałem. – chameco
@chameco: Strona demonstracyjna jest bardzo przydatna, osobiście często używam jej do sprawdzenia, jaką optymalizację może wykonać Clang (lub nie). Naprawdę pomaga sprawić, by ludzie zobaczyli światło i uniknęli, by ich kod był zbyt niski. –
Mam nieco zmodyfikowaną wersję strony, która pozwala ci spojrzeć na język asemblerowy dla innych celów LLVM: http://ellcc.org/demo –
- 1. Przenoszenie z systemu Android x86, niemożliwe do wykonania.
- 2. Język dla kompilatora opartego na LLVM
- 3. Wybór odpowiedniego asemblera do kompilatora
- 4. Program do debugowania systemu DOS dla 32-bitowego zestawu x86
- 5. Przenoszenie mojego zestawu gemów RVM do innego poziomu patchlevel
- 6. Co się dzieje w zestawie Apple LLVM-gcc x86?
- 7. Czy mogę użyć składni Intel zestawu x86 z GCC?
- 8. Uzyskaj zestaw subset zestawu za pomocą kompilatora
- 9. Zmiana kompilatora LLVM-brzękiem na istniejące iPhone Projekt
- 10. Jak sprawdzić wersję kompilatora LLVM, której używa Xcode?
- 11. Wiązanie Qt do LLVM
- 12. LLVM dla GHC
- 13. Jak działa C-- w porównaniu do LLVM?
- 14. Jak emitować LLVM-IR z Cargo
- 15. llvm na xb barebone?
- 16. Błąd llvm: Przenoszenie nie jest jeszcze zaimplementowane! przy uruchomieniu RxCpp w orcjit lub lli
- 17. Dlaczego llvm i gcc używają różnych prologów funkcji na x86 64?
- 18. Tłumaczenie wbudowanego zestawu do obsługi x64
- 19. Przenoszenie plików do katalogu
- 20. przenoszenie linii z jednego okna do drugiego
- 21. Przenoszenie obiektów z kodu do Inspektora obiektów
- 22. Przenoszenie kluczy z unordered_map
- 23. Błąd optymalizacji pętli LLVM?
- 24. Przenoszenie jądra do innej architektury?
- 25. LTO z LLVM i CMake
- 26. Przenoszenie javascript audio do jquery
- 27. Przenoszenie aktywności Bluetooth do usługi
- 28. Przenoszenie pliku do Kosza (PHP)
- 29. Przenoszenie C++ do C# - szablony
- 30. Który z LLVM odpowiada za optymalizacje zmiennoprzecinkowe?
Nie będzie mapowania jeden do jednego. Brak skrótów tutaj. –
Zdaję sobie z tego sprawę, po prostu szukam przewodnika, jak emitować podstawowe rzeczy, takie jak rezerwowanie danych, skoki cmp i conditonal itp. – chameco
Dokumentacja LLVM. ma (przynajmniej jeden) samouczek, który przeprowadzi cię przez tworzenie kompilatora dla języka zabawek. – Mat