Re: C aggregate passing (Rust kernel policy)

From: Linus Torvalds
Date: Fri Feb 21 2025 - 14:12:57 EST


On Fri, 21 Feb 2025 at 10:34, David Laight <david.laight.linux@xxxxxxxxx> wrote:
>
> As Linus said, most modern ABI pass short structures in one or two registers
> (or stack slots).
> But aggregate returns are always done by passing a hidden pointer argument.
>
> It is annoying that double-sized integers (u64 on 32bit and u128 on 64bit)
> are returned in a register pair - but similar sized structures have to be
> returned by value.

No, they really don't. At least not on x86 and arm64 with our ABI.
Two-register structures get returned in registers too.

Try something like this:

struct a {
unsigned long val1, val2;
} function(void)
{ return (struct a) { 5, 100 }; }

and you'll see both gcc and clang generate

movl $5, %eax
movl $100, %edx
retq

(and you'll similar code on other architectures).

But it really is just that the two-register case is special.
Immediately when it grows past that size then yes, it ends up being
returned through indirect memory.

Linus