In doing picolibc testing for lm32, I discovered that varargs handling
had an issue when the set of anonymous arguments spanned register
arguments and stack arguments.

On lm32, FIRST_PARM_OFFSET is '4', meaning there are four bytes
between the stack top and the first non-register parameter. When a
varargs function runs, the anonymous parameters in registers get
pushed to the stack below this gap. To process the args, this gap
needs to be skipped at the right time.

This series converts va_list into a struct to add a pointer to the gap
and code is added to va_arg to see when an argument spans the gap.

While developing this series, I identified a few other related issues
which affected this change by comparing the lm32 code to arc, which
has a similar implementation for saving the register parameters. Those
changes are first in the series with the gap skipping code provided in
the final patch.

Reply via email to