2012-04-29 16 views
11

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

+0

Nie będzie mapowania jeden do jednego. Brak skrótów tutaj. –

+0

Zdaję sobie z tego sprawę, po prostu szukam przewodnika, jak emitować podstawowe rzeczy, takie jak rezerwowanie danych, skoki cmp i conditonal itp. – chameco

+0

Dokumentacja LLVM. ma (przynajmniej jeden) samouczek, który przeprowadzi cię przez tworzenie kompilatora dla języka zabawek. – Mat

Odpowiedz

14

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.

+2

Dziękuję! Nigdy nie widziałem tej strony demo, dokładnie tego szukałem. – chameco

+0

@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. –

+0

Mam nieco zmodyfikowaną wersję strony, która pozwala ci spojrzeć na język asemblerowy dla innych celów LLVM: http://ellcc.org/demo –

Powiązane problemy