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.