pub enum Variadic {
SameAsFixed,
AlwaysMemory,
BothBanks,
IntegersOnly,
}Expand description
What a variadic argument does differently.
Variants§
SameAsFixed
Nothing. A variadic argument is classified the same way a fixed one is.
AlwaysMemory
Every variadic argument is in the argument area, whatever registers are left.
Darwin arm64, and the divergence that makes it a separate ABI rather than AAPCS64 with
notes, per spec/cross-compile/06-abis.md section 6.3. It is also the reason a variadic call there is
ABI-incompatible with a non-variadic one, so calling an unprototyped function works until
the day it does not.
BothBanks
A floating point argument travels in both its vector register and the corresponding general purpose one.
Windows x64, because the callee of a variadic function does not know which bank to read.
IntegersOnly
Every argument of a variadic function travels in general purpose registers and the argument area, the named ones as well as the rest, and nothing is looked inside for floating point members.
Windows on AArch64. The callee homes x0 to x7 directly below the arguments the caller left
in memory and walks the lot with a char *, so there is only one bank it could read. A
double travels as its bits in the next x register, a structure of four floats is the
sixteen bytes of two x registers rather than four s registers, and one of four doubles is
over sixteen bytes and so travels as the address of a copy. It reaches the named arguments
too, which is the difference from Variadic::BothBanks: void f(double, ...) takes its
double in x0, and a call through a prototype without the ... puts it in d0. The value
that comes back is not an argument and comes back where it always does.