* Iain Sandoe:

> In the case that a call is built and no prototype is available, the
> assumption is that all parms are named.  The promotion is then done
> according to the C promotion rules.
>
> [for the number of args that can be passed in int regs] the callee
> will happen to observe the same rules in this case.
>
> It will, however, break once we overflow the number of int regs.. :/

Exactly.

> The case that is fundamentally broken from scratch is of a variadic function
> called without a prototype - since the aarch64-darwin ABI places unnamed
> parms differently.

That part is true for powerpc64le as well, due to the caller-provided
saved parameter area which only exists with variadic calls.  This
already happens in very simple cases, like the POSIX open function.  The
corruption is quite difficult to diagnose, too. 8-(  But it's also
quite rare to see such bugs.

> Given we have 8 int regs available, probably many calls will work .. 

Oh, I didn't know that so many registers were available.  Maybe that's
enough to paper over the lack of ABI compatibility for now.  Presumably
you could count the number of arguments and emit a warning at least?

C++ metaprogramming involving many parameters tends to use variadic
templates of non-variadic functions, so that shouldn't be a problem.

Thanks,
Florian

Reply via email to