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/