go ``` cmd/asm, runtime: textflag for CABI ```

ercv8c1e  于 7个月前  发布在  Go
关注(0)|答案(3)|浏览(150)

运行时汇编代码包含许多从运行时外部调用并使用C ABI的函数。这意味着这些函数首先需要手动保存被调用者保存的寄存器。
例如,在sys_linux_*.s中查看runtime·sigtramp。
在诊断一个被调用者保存错误后,我未能保存所有被调用者保存的寄存器。这意味着几个月后,@aclements不得不经历同样的漫长调试过程。我们可以通过添加CABI文本标志来使这个过程更加健壮(并可能使我们的汇编代码更容易阅读),让汇编器插入保存和恢复寄存器的代码。
cc @ianlancetaylor

gupuwyp2

gupuwyp21#

仅仅想要拯救它们是不够的,我们需要一个地方来拯救它们。我们在哪里拯救它们(xx(SP))?我们需要为它们预留空间吗,还是这个标志已经做到了这一点?

apeeds0o

apeeds0o2#

我们需要为它们预留空间吗,还是这个标志会自动预留空间?
我认为我们希望这个标志能够自动为它们预留空间,就像我们在x86上的帧指针和LR机器上的保存的LR一样。
这意味着函数首先需要手动保存callee-saved寄存器。
这个标志是否能保存所有的callee-save寄存器?这可能是很多实际上不会被覆盖的寄存器。这些bug真正狡猾的地方在于obj隐式使用的C callee-save寄存器(因此它们从未在汇编中显式出现)。

abithluo

abithluo3#

我能想到的情况都不是热点函数,所以我会很高兴地保存所有callee-save寄存器。尽管我同意仅使用不可见的对象寄存器就足够让我轻松呼吸。
至于在哪里,预留的堆空间。这些是从C调用的函数,因此有堆栈可供使用。

相关问题