OCaml允许从OCaml程序调用C函数,只要程序员遵循本手册“使用OCaml连接C”一章中的说明即可.
movq ml_as_z_sub@GOTPCREL(%rip),%rax call caml_c_call@PLT
(amd64指令集在这里,但在查看其他架构时,该方案似乎相当统一).
函数caml_c_call最终会执行计算跳转调用*%rax,但它会在之前和之后执行很多操作.来自asmrun / amd64.S:
/* Call a C function from Caml */ FUNCTION(G(caml_c_call)) .Lcaml_c_call: /* Record lowest stack address and return address */ popq %r12 STORE_VAR(%r12,caml_last_return_address) STORE_VAR(%rsp,caml_bottom_of_stack) /* Make the exception handler and alloc ptr available to the C code */ STORE_VAR(%r15,caml_young_ptr) STORE_VAR(%r14,caml_exception_pointer) /* Call the function (address in %rax) */ call *%rax /* Reload alloc ptr */ LOAD_VAR(caml_young_ptr,%r15) /* Return to caller */ pushq %r12 ret
当一个人想要经常执行一些既不分配也不提出异常的指令时,上面的内容有点矫枉过正.
有没有人有直接从OCaml调用小程序集的任何经验,而不通过caml_c_call存根?这可能涉及欺骗本机编译器以为它正在调用ML函数或修改编译器.
问题出在Zarith库的上下文中,其中代码的小组件可以直接计算并返回大多数结果,而不必通过caml_c_call,并且只需要跳转到caml_c_code以查找需要分配或异常的困难参数.有关可直接执行的汇编位示例,请参见this file.
解决方法
也许
“noalloc”和“浮动”可能有用吗?
PS更多related links.