Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从LLVM代码调用FFI C函数时,何时需要'sret'返回指针?_C_Compiler Construction_Llvm_Ffi_Calling Convention - Fatal编程技术网

从LLVM代码调用FFI C函数时,何时需要'sret'返回指针?

从LLVM代码调用FFI C函数时,何时需要'sret'返回指针?,c,compiler-construction,llvm,ffi,calling-convention,C,Compiler Construction,Llvm,Ffi,Calling Convention,看起来,返回结构的C函数有时会使用一个带有指向某个内存的指针的指针,该指针将被函数的返回值覆盖 例如,声明如下的C函数: MyBuffer string_from_double(double d); 将出现在LLVM中,如: declare void @string_from_double(%struct.MyBuffer* sret align 8, double) 尽管有外观,函数实际上有两个参数,而不是一个。这个神奇的论点显然是通过它的 (令人困惑的是,LLVM不会自动执行从按值返回的

看起来,返回结构的C函数有时会使用一个带有指向某个内存的指针的指针,该指针将被函数的返回值覆盖

例如,声明如下的C函数:

MyBuffer string_from_double(double d);
将出现在LLVM中,如:

declare void @string_from_double(%struct.MyBuffer* sret align 8, double)
尽管有外观,函数实际上有两个参数,而不是一个。这个神奇的论点显然是通过它的

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


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

这将取决于目标平台的ABI,并且平台之间的差异很大。对于X86平台,请参见@rici表7中的调查,这似乎使LLVM成为一个泄漏的抽象-我认为LLVM IR通常被认为是架构无关的。有没有办法让LLVM告诉我该怎么做?例如,是否有可靠的检查方法?其他实现FFI的系统通常是如何解决这个问题的?你在问什么编译器后端?@arrowd,我正在写的那个,我想让它能够调用FFI函数。你如何通知前端FFI调用?您正在为此解析C头吗?