OberonCore https://forum.oberoncore.ru/ |
|
компилятор CP2 и регистры ESI, EDI https://forum.oberoncore.ru/viewtopic.php?f=2&t=6909 |
Страница 1 из 1 |
Автор: | arisu [ Воскресенье, 05 Март, 2023 13:21 ] |
Заголовок сообщения: | компилятор CP2 и регистры ESI, EDI |
кто-нибудь знает, зачем CP2 сохраняет и восстанавливает ESI и EDI во всех экспортированых процедурах? в смысле: они же, вроде бы, внутри самого компилятора не имеют никакого особого значения. я так понимаю, это для X86 ABI, где EBX, ESI и EDI являются call-preserved. но в самом CP2 только EBX (вроде бы) имеет особое значение, и то только для вложеных функций. не есть ли смысл слелать специальный флаг `[callback]` (который вроде бы есть, но делает не совсем то сейчас), и оставить такие сохранения только если он установлен? идея такая, что помечать как `[callback]` надо процедуры, которые передаются во внешние библиотеки как колбэки. кстати, для `[ccall]` такое сейчас не делается, а должно: они-то как раз могут быть использованы как колбэки без экспорта. по-моему, это баг. надо починить. |
Автор: | arisu [ Воскресенье, 05 Март, 2023 14:40 ] |
Заголовок сообщения: | Re: компилятор CP2 и регистры ESI, EDI |
дополню, что я сделал вышеописаное в Lament Configuration. затаив дыхание ожидаю рандомных падений. |
Автор: | luowy [ Воскресенье, 05 Март, 2023 16:27 ] |
Заголовок сообщения: | Re: компилятор CP2 и регистры ESI, EDI |
According to the x86 ABI, EBX, ESI, EDI, and EBP are callee-save registers and EAX, ECX and EDX are caller-save registers. Since EBX, ESI, EDI, and EBP are callee-save registers, functions have to restore the values to the original for any of those they modify, before returning. In BB, a public procedure may be exported by a dll that can be called by other languages, so it is necessary to follow this convention. |
Автор: | arisu [ Воскресенье, 05 Март, 2023 18:26 ] |
Заголовок сообщения: | Re: компилятор CP2 и регистры ESI, EDI |
luowy писал(а): In BB, a public procedure may be exported by a dll that can be called by other languages, so it is necessary to follow this convention. hm. that's someting i didn't thought about (linking BlackBox as a dynamic library). still, i believe that such exported procedures should be explicitly marked as `[callback]` or `[ccall]`, and for such procedures the compiler will generate save/restore code. so it's a matter of placing the right calling convention at the right place — again, something the programmer should do anyway. there are no checks if calling conventions are right (because it is impossible), so i'm willing to accept this tradeoff for dynamic exports too.
|
Автор: | arisu [ Четверг, 23 Март, 2023 09:35 ] |
Заголовок сообщения: | Re: компилятор CP2 и регистры ESI, EDI |
как выяснилось после анализа — не сохранять ESI и EDI в экспортированых процедурах нельзя: кодоген считает, что они сохраняются, и после вызова экспортированой процедуры не изменились. исправлять кодоген в этом плане можно, но я не хочу пока (время не пришло), поэтому просто вернул всем экспортированым процедурам обратно флажок callback. я потом это переделаю, но пока пусть всё будет как было. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |