От последния път добавих в src/compiler/arm/params.lisp още един enum, който дефинира константите, използвани за разграничаване на различните софтуерни прекъсвания. За какво става въпрос: понякога се налага в lisp кода да се генерира прекъсване, което да бъде обработено от C runtime-а. Такива са например ситуациите, в които се генерира грешка, breakpoint, halt на виртуалната машина и т.н. Като гледам останалите платформи това се реализира чрез инструкция, която да доведе до генериране на SIGILL или SIGTRAP от страна на ОС и този сигнал се прихваща и обработва от специална функция в C runtime-а. Е, за да може да разбере тази функция какъв точно е повода за прекъсването, е необходимо това да бъде записано около (а най-добре във) инструкцията. Ще му мислим за това като му дойде времето, засега копираме списъка с trap-ове от някоя друга платформа.
Оказва се, че следващият платформено-зависим файл, src/compiler/arm/backend-params.lisp е продължение на params, разделено от основния файл по някое време в далечното минало, понеже е съдържало зависимости от конкретна структура, наречена BACKEND, която се е компилирала след params. Тази структура отдавна вече не съществува, така че разделението вече е само по исторически причини. Биха могли нещата да се merge-нат обратно в params, но някой друг път (трябва да се направи за всички платформи и да се махне backend-params изобщо). Тук се дефинират неща като:
- *backend-byte-order*, което показва дали архитектурата е little endian или big endian (в нашия случай -- :little-endian);
- *backend-page-size*, което е размера на страниците в паметта (засега слагаме 4096, колкото да има нещо, а като стигнем до използването й, ще установим правилната стойност по емпиричен път);
- и разни други константи, свързани с garbage collection–а, които за сега само копираме, те би трябвало само да доведат до евентуална оптимизация, но според мен би следвало като първо приближение да работи и със стойностите от другите платформи;
Няма коментари:
Публикуване на коментар