从 LLVM 代码调用 FFI C 函数时,什么时候需要 `sret` 返回指针?

问题描述

似乎返回结构体的 C 函数有时使用 magic hidden return argument 携带指向某个内存的指针,该内存将被函数的返回值覆盖。

例如,一个 C 函数声明如下:

MyBuffer string_from_double(double d);

将出现在 LLVM 中,例如:

declare void @string_from_double(%struct.MyBuffer* sret align 8,double)

尽管表面上看,该函数实际上有两个参数而不是一个参数。魔术参数显然由它的 sret tag 标识。

(令人困惑的是,LLVM 不会自动执行从按值返回的转换,即使对于 cdecl 约定函数也是如此。这肯定是有原因的,但对我来说似乎违反直觉)。

所以我的问题是:从编译器后端,我如何判断何时需要将 FFI 函数转换为“sret”形式?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)