AaronBallman wrote:

> The pointer values in a specific `va_list` can and often do change when you 
> call `va_arg`, but I am not aware of any targets where they do not always 
> point to the same regions. In every ABI I've ever seen, `va_list` contains a 
> pointer to the stack argument area, and those pointers _must_ point there 
> because the stack argument area cannot be either copied or relocated. 
> `va_list` may also contain one or more pointers to separate "spill areas" 
> where the callee is required to spill certain argument registers, which it 
> generally does in its prologue. In theory, a compiler could produce multiple 
> copies of that spill area, or an ABI could require it to be copied by 
> `va_copy` or even allocated on the heap. However, there's no good reason to 
> do either of those things: the `va_list` can never validly escape the 
> variadic function because of the limitation on the stack argument area, and 
> so the spill area might as well also go in a unique location on the stack.

Ah! Thank you for the explanation, that makes a lot of sense.

> I have no objection to requiring va_copy and documenting primitive copies as 
> undefined behavior. It is the easiest thing to do, and we can clearly revisit 
> it later if we want.

Thank you for the clarification. So you're happy with the current state of the 
PR, or are there some changes you'd like to see made?

https://github.com/llvm/llvm-project/pull/98146
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to