disable-newlib-io-long-double?

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

disable-newlib-io-long-double?

chengzhiwei (C)
Hi, all:

In my project, all of the quadrature symbols have been stripped away in libgcc.a, so when I built newlib toolchain based on riscv32 target, we used the option "--disable-newlib-io-long-double" to turn off the feature of long double. But when performing a floating-point calculation, the symbol "trunctfdf2" is not defined correctly:



libc.a(lib_a-vfprintf.o): in function `.L60':vfprintf.c:(.text+0x3fe): undefined reference to `__trunctfdf2'



What puzzles me is why is this one symbol undefined? Is there any way to solve this problem?



Regards,

--zhiwei




Reply | Threaded
Open this post in threaded view
|

Re: disable-newlib-io-long-double?

Jim Wilson-2
On 3/16/20 4:37 AM, chengzhiwei (C) wrote:
> In my project, all of the quadrature symbols have been stripped away in libgcc.a, so when I built newlib toolchain based on riscv32 target, we used the option "--disable-newlib-io-long-double" to turn off the feature of long double. But when performing a floating-point calculation, the symbol "trunctfdf2" is not defined correctly:
> libc.a(lib_a-vfprintf.o): in function `.L60':vfprintf.c:(.text+0x3fe): undefined reference to `__trunctfdf2'

--disable-newlib-io-long-double is the default.  That configure option
shouldn't do anything.

__trunctfdf2 comes from libgcc.  Are you linking with libgcc?

Of course, if you have long double disabled, it is odd that you get a
call to trunctfdf2.  You should check how the vfprintf.c file was
compiled.  There is a _NO_LONGDBL that should be defined by default, and
should prevent any long double code from being enabled in that file.

Jim
Reply | Threaded
Open this post in threaded view
|

Re: disable-newlib-io-long-double?

chengzhiwei (C)
In reply to this post by chengzhiwei (C)
Thanks!
Check the file of vfprintf.c, I guess I found the reason:
# ifdef _NO_LONGDBL
                        if (flags & LONGDBL) {
                                _fpvalue = (double)GET_ARG (N, ap, _LONG_DOUBLE);
                        } else {
                                _fpvalue = GET_ARG (N, ap, double);
                        }
There is an accuracy conversion step, but in my project, all of the long double symbols have been stripped away in libgcc.a, maybe I should patch the file of vfprintf.c.

zhiwei

-----邮件原件-----
发件人: Jim Wilson [mailto:[hidden email]]
发送时间: 2020年3月17日 4:51
收件人: chengzhiwei (C) <[hidden email]>; [hidden email]
主题: Re: disable-newlib-io-long-double?

On 3/16/20 4:37 AM, chengzhiwei (C) wrote:
> In my project, all of the quadrature symbols have been stripped away in libgcc.a, so when I built newlib toolchain based on riscv32 target, we used the option "--disable-newlib-io-long-double" to turn off the feature of long double. But when performing a floating-point calculation, the symbol "trunctfdf2" is not defined correctly:
> libc.a(lib_a-vfprintf.o): in function `.L60':vfprintf.c:(.text+0x3fe): undefined reference to `__trunctfdf2'

--disable-newlib-io-long-double is the default.  That configure option shouldn't do anything.

__trunctfdf2 comes from libgcc.  Are you linking with libgcc?

Of course, if you have long double disabled, it is odd that you get a call to trunctfdf2.  You should check how the vfprintf.c file was compiled.  There is a _NO_LONGDBL that should be defined by default, and should prevent any long double code from being enabled in that file.

Jim
Reply | Threaded
Open this post in threaded view
|

Re: disable-newlib-io-long-double?

Jim Wilson-2
On Mon, Mar 16, 2020 at 6:34 PM chengzhiwei (C) <[hidden email]> wrote:
> Check the file of vfprintf.c, I guess I found the reason:
> # ifdef _NO_LONGDBL
>                         if (flags & LONGDBL) {
>                                 _fpvalue = (double)GET_ARG (N, ap, _LONG_DOUBLE);
>                         } else {
>                                 _fpvalue = GET_ARG (N, ap, double);
>                         }
> There is an accuracy conversion step, but in my project, all of the long double symbols have been stripped away in libgcc.a, maybe I should patch the file of vfprintf.c.

Another option is --enable-newlib-nano-formatted-io which uses the
nano-vfprintf.c file instead of vprintf.c.  This drops more features
from vprintf, including the long double support.

You might want to look at github.com/riscv/riscv-gnu-toolchain for
comparison.  It builds a regular newlib and a newlib nano, where the
newlib nano uses --enable-newlib-nano-formatted-io,

Jim