This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
Re: nano printf + powerpc gcc
- From: "Andre Vieira (lists)" <Andre dot SimoesDiasVieira at arm dot com>
- To: newlib at sourceware dot org, alfedotov at gmail dot com
- Date: Tue, 23 Jan 2018 14:04:48 +0000
- Subject: Re: nano printf + powerpc gcc
- Authentication-results: sourceware.org; auth=none
- References: <CAN8C2CpXVH8iq=9XMV0JxWPJihRi_vHDwHwMC830=YCxV-ZjNQ@mail.gmail.com> <20180108100732.GB3084@calimero.vinschen.de>
Hi Alexander,
This patch is causing our arm-none-eabi-gcc newlib-nano builds to fail.
It seems the _Generic isn't picking up the right type when ap is of type
va_list. We get the following error:
newlib/libc/stdio/nano-vfscanf.c:430:2: error: cannot convert to a
pointer type
ret = _scanf_chars (rptr, &scan_data, fp, va_ptr(ap));
^~~
newlib/libc/stdio/nano-vfscanf.c:432:2: error: cannot convert to a
pointer type
ret = _scanf_i (rptr, &scan_data, fp, va_ptr(ap));
^~~
newlib/libc/stdio/nano-vfscanf.c:435:2: error: cannot convert to a
pointer type
ret = _scanf_float (rptr, &scan_data, fp, va_ptr(ap));
A reduced test-case, see:
#include <stdio.h>
extern void bar(va_list *ap);
void foo(va_list ap) {
bar(_Generic(&(ap), va_list *: &(ap), default: (va_list *)(ap)));
}
Note that va_list for our toolchain is defined as gcc's __builtin_va_list.
I have tried your other definitions of va_ptr too and none of them seem
to work. How do you suggest we proceed?
Cheers,
Andre
On 08/01/18 10:07, Corinna Vinschen wrote:
> On Dec 25 16:39, Alexander Fedotov wrote:
>> Hi
>>
>> I'm experienced a strange printf() for float variables behaviour with
>> Nano version while regular is fine. It just prins out a garbage (even
>> with enabled -u _printf_float). After some digging I've managed to
>> track down issue until this line:
>>
>> n = _printf_float (data, &prt_data, fp, pfunc, &ap);
>>
>>
>> Moreover there are number of warnings also in build log:
>>
>> src_newlib/newlib/libc/stdio/nano-vfprintf.c -o lib_a-nano-svfprintf.o
>> ../../../../../../src_newlib/newlib/libc/stdio/nano-vfprintf.c: In
>> function '_svfprintf_r':
>> ../../../../../../src_newlib/newlib/libc/stdio/nano-vfprintf.c:645:55:
>> warning: passing argument 5 of '_printf_float' from incompatible
>> pointer type
>> n = _printf_float (data, &prt_data, fp, pfunc, &ap);
>> ^
>> In file included from
>> ../../../../../../src_newlib/newlib/libc/stdio/nano-vfprintf.c:169:0:
>> ../../../../../../src_newlib/newlib/libc/stdio/nano-vfprintf_local.h:228:1:
>> note: expected 'struct __va_list_tag (*)[1]' but argument is of type
>> 'struct __va_list_tag **'
>> _printf_float (struct _reent *data,
>> ^
>> ../../../../../../src_newlib/newlib/libc/stdio/nano-vfprintf.c:650:45:
>> warning: passing argument 5 of '_printf_i' from incompatible pointer
>> type
>> n = _printf_i (data, &prt_data, fp, pfunc, &ap);
>> ^
>> In file included from
>> ../../../../../../src_newlib/newlib/libc/stdio/nano-vfprintf.c:169:0:
>> ../../../../../../src_newlib/newlib/libc/stdio/nano-vfprintf_local.h:221:1:
>> note: expected 'struct __va_list_tag (*)[1]' but argument is of type
>> 'struct __va_list_tag **'
>> _printf_i (struct _reent *data, struct _prt_data_t *pdata, FILE *fp,
>>
>>
>> It looks like nano written without taking in mind such targets. Here I
>> found workaround https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14557
>> that's working.
>>
>> I'm attaching a patch.
>>
>> Alex
>
> Pushed.
>
>
> Thanks,
> Corinna
>