nano printf + powerpc gcc
Alexander Fedotov
alfedotov@gmail.com
Thu Jan 25 18:31:00 GMT 2018
Well if this requires a much of effort I would rather propose to to
wrap up these ifdef's by checking architecture.
Like #if defined(_PPC_) || defined (__x86_64__) || defined (__amd64__)
|| defined (__i386__) etc
On Wed, Jan 24, 2018 at 8:49 PM, Alexander Fedotov <alfedotov@gmail.com> wrote:
> Sure, I can check fix on my side.
>
> Other way is to fix original issue from where this workaround comes
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14557. But seems nobody cares
> it.
>
> Alex
>
> On Wed, 24 Jan 2018 at 20:46, Andre Vieira (lists)
> <Andre.SimoesDiasVieira@arm.com> wrote:
>>
>> Sorry for my other email not replying to this, when I started writing it
>> I hadn't seen your email yet.
>>
>> Anyhow, I suggested a change to your patch there at the end, if you
>> could give that a try to see if it works for you too, then we could (at
>> least for now) maybe get away with it.
>>
>> Cheers,
>> Andre
>>
>> On 24/01/18 16:02, Alexander Fedotov wrote:
>> > Hello Andre
>> > Yes indeed this fix unfortunately broke an ARM port. I have no idea
>> > why this builtins doesn't work on gcc for arm. Best way I believe
>> > right now is to revert this commit.
>> >
>> > Alex
>> >
>> > On Tue, Jan 23, 2018 at 5:04 PM, Andre Vieira (lists)
>> > <Andre.SimoesDiasVieira@arm.com> wrote:
>> >> 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
>> >>>
>> >>
>> >
>> >
>> >
>>
> --
> Best regards,
> AF
--
Best regards,
AF
More information about the Newlib
mailing list