使用caml_c_call直接从OCaml调用C /汇编函数

前端之家收集整理的这篇文章主要介绍了使用caml_c_call直接从OCaml调用C /汇编函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
OCaml允许从OCaml程序调用C函数,只要程序员遵循本手册“使用OCaml连接C”一章中的说明即可.

遵循这些指令时,本机编译器会将对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.

猜你在找的C&C++相关文章