%n
to wirtualne rejestry, które zostaną rozwiązane do rzeczywistych rejestrów podczas generowania kodu dla maszyny docelowej.
Numer i32
zawiera informacje o typie. W oryginalnym kodzie był to int
, który kompilator przyjmuje jako 32-bitową liczbę całkowitą.
służy do przydzielania miejsca na stosie. W tym przykładzie jest to i32
(32-bitowa liczba całkowita), więc można załadować wartość 0 dla wartości zwracanej. align 4
podaje to przyrównanie 4 bajtowe, tj. Wskaźnik stosu będzie na 4-bajtowym adresie wyrównanym.
Nie jest to najskuteczniejsza reprezentacja, ale nie jest to celem, jeśli IR. IR powinien być przenośny dla różnych architektur. Następnie do zaplecza jest produkowany wydajny kod maszynowy.
LLVM Language Reference Manual
Dlaczego alloca
i store
to jest do zrobienia z tym jest funkcja main
. Gdybyś nazwał tę funkcję czymś innym, IR po prostu zawierałby ret
zgodnie z oczekiwaniami. Od sprawdzenia złożenia wyprodukowanego dla głównego wydaje się być powiązany ze wskaźnikiem bazowym stosu , ale nie do końca rozumiem, dlaczego tak się stało. Czas na wyciągnięcie normy C, jak sądzę.
Aktualizacja: Nie mogę znaleźć niczego w standardzie C, ale wygląda na to, że robi to dla każdej głównej funkcji. Nie znam podstawy kodu klangu na tyle dobrze, by ją wyśledzić.
Aktualizacja: Zobacz komentarze z Billem Lynchem poniżej. Te instrukcja obslugi istnieją:
do ewentualnego niejawny return 0
że główne funkcje mają
Wyrównanie wskazuje, że operacja pamięci powinna zostać wyrównana do 4 bajtów. Nie jestem pewien co do reszty. – MariusSiuram