在x86_64系统上,当返回值小于或等于16字节时,通过寄存器RAX和RDX传递,当返回值大于16字节时,通过第一个sret参数传递。然而,似乎生 rust 并不遵循这一规则。
在C profram示例中:
struct test_struct {
int a;
int b;
int c;
};
struct test_struct foo() {
struct test_struct a = {1,2,3};
return a;
}
llvm ir中的此函数如下:
define dso_local { i64, i32 } @foo()
我们可以看到返回值是通过寄存器传递的。
在Rust profram示例中:
pub struct test_struct {
a: i32,
b: i32,
c: i32,
}
pub fn foo() -> test_struct {
let data = test_struct {
a: 0,
b: 1,
c: 2,
};
data
}
llvm ir中的此函数如下:
define void @_ZN7example3foo17hd5941535b576c335E(ptr sret(%test_struct) %0) unnamed_addr
我们可以看到返回值可以通过第一个sret参数传递。那么Rust使用什么ABI来传递结构呢
1条答案
按热度按时间iovurdzv1#
Rust ABI是未指定的,不应依赖。
如果要使用CABI,请将函数指定为
extern "C" fn ...
。确保所有涉及的结构也是#[repr(C)]
。