assembly Rust使用什么ABI来传递结构

tjrkku2a  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(127)

在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来传递结构呢

iovurdzv

iovurdzv1#

Rust ABI是未指定的,不应依赖。
如果要使用CABI,请将函数指定为extern "C" fn ...。确保所有涉及的结构也是#[repr(C)]

相关问题