From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by sourceware.org (Postfix) with ESMTPS id 8E2353858402 for ; Thu, 29 Jun 2023 13:25:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8E2353858402 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linaro.org Received: by mail-wm1-x32b.google.com with SMTP id 5b1f17b1804b1-3fba5a8af2cso5945705e9.3 for ; Thu, 29 Jun 2023 06:25:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1688045131; x=1690637131; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=lmGAzEjJKbPNJQhBZ9MgQLVbLAmEf2s8CDKjMadkqaA=; b=QTXdtZ5TTqXD7qPtteZ2fbm2hqbTVp8ztWmKik7YFyOKDom3jMGiHL9u4pLYurO7WW ho1J5FY1KwQ+eFdcssYawT6tynIC2uEhSjTf0w6PR6ikdR/mXeK+GFqFWUB3Hx0hYUfZ +1EFD9jOW07AYOGi1p02rhqPa/Hi0JSwrA6mTxBhBCjldYSrwwEC+4tgWb0SiGjqzoEX LxeiSZQ7nAWDxG8uJB0dTI0zvA7ErMIBCKQgwE2oTOJi209uUxqqL3HjUzt6CCVQqpZI cVj/xRRhWIjevtKIWzwVNw+735phXbO0GAQYB3n0CJ3VZOz4RfFv37EFUrCbrjLDmjNa vNiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1688045131; x=1690637131; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=lmGAzEjJKbPNJQhBZ9MgQLVbLAmEf2s8CDKjMadkqaA=; b=Jc9da9ioHhq/AjiJETTfoTahl3/jJ1f5YDXCmBl4bkI7BL5JGBJGM34zcY25BWFEkm VukVLItlEg8oPa2tiCfk2UabbhXq2HxlBPy+4IeY5LJ/CJP9xpniFM2+tDFyi9cvxhGc Ift3Cl4aigLnCed1KyoQ2GOTDvYe/0Dp2++uSlO7JmBCXkphbagzVwLcPdWR4HmIavcN DAd8zDDGnb9PIK5DhWPYt5OM/8mp2QMZLLbkRGEvzm4HFZ6hHHgT0vMJRLxV1XIaUwfl gPGEE8jyX6nQFxXOuYuGWnOpKdMLJ12iM60aSWyAFRbGqpOhTVAoh+vT2z/ba8JE5lfH cnKQ== X-Gm-Message-State: AC+VfDwILCvUiHXOo5cLm80hP4w+CJzONohO6km2uOQUeQ7+t+C4O0S+ f18LFeDnK2AtyKB1Ak2QWFQivwSm/dxZoCgoh+HKJw== X-Google-Smtp-Source: ACHHUZ6p+s55Qli/n/KQ3tkj7aqMr7YQYYG5s1GuAKwQn3bKQFSPYSFn3oKGxm50nIbVx/b4d70W2rv9aFeN7Q6Lcnw= X-Received: by 2002:a05:600c:b43:b0:3fb:b70f:fc21 with SMTP id k3-20020a05600c0b4300b003fbb70ffc21mr1816569wmr.35.1688045131171; Thu, 29 Jun 2023 06:25:31 -0700 (PDT) MIME-Version: 1.0 References: <20230531122222.4116868-1-jwakely@redhat.com> In-Reply-To: From: Christophe Lyon Date: Thu, 29 Jun 2023 15:25:19 +0200 Message-ID: Subject: Re: [committed] libstdc++: Fix preprocessor conditions for std::from_chars [PR109921] To: Jonathan Wakely Cc: Jonathan Wakely , libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Content-Type: multipart/alternative; boundary="000000000000689edb05ff44a26f" X-Spam-Status: No, score=-10.2 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,HTML_MESSAGE,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --000000000000689edb05ff44a26f Content-Type: text/plain; charset="UTF-8" On Thu, 29 Jun 2023 at 14:50, Jonathan Wakely wrote: > > > On Thu, 1 Jun 2023 at 12:05, Jonathan Wakely > wrote: > >> On Thu, 1 Jun 2023 at 10:30, Christophe Lyon via Libstdc++ >> wrote: >> > >> > Hi, >> > >> > >> > On Wed, 31 May 2023 at 14:25, Jonathan Wakely via Gcc-patches < >> > gcc-patches@gcc.gnu.org> wrote: >> > >> > > Tested powerpc64le-linux. Pushed to trunk. >> > > >> > > -- >8 -- >> > > >> > > We use the from_chars_strtod function with __strtof128 to read a >> > > _Float128 value, but from_chars_strtod is not defined unless uselocale >> > > is available. This can lead to compilation failures for some targets, >> > > because we try to define the _Flaot128 overload in terms of a >> > > non-existing from_chars_strtod function. >> > > >> > > Only try to use __strtof128 if uselocale is available, otherwise >> > > fallback to the long double overload of std::from_chars (which might >> > > fallback to the double overload, which should use fast_float). >> > > >> > > This ensures we always define the full set of overloads, even if they >> > > are not always accurate for all values of the wider types. >> > > >> > > libstdc++-v3/ChangeLog: >> > > >> > > PR libstdc++/109921 >> > > * src/c++17/floating_from_chars.cc >> (USE_STRTOF128_FOR_FROM_CHARS): >> > > Only define when USE_STRTOD_FOR_FROM_CHARS is also defined. >> > > (USE_STRTOD_FOR_FROM_CHARS): Do not undefine when long double >> is >> > > binary64. >> > > (from_chars(const char*, const char*, double&, chars_format)): >> > > Check __LDBL_MANT_DIG__ == __DBL_MANT_DIG__ here. >> > > (from_chars(const char*, const char*, _Float128&, >> chars_format)) >> > > Only use from_chars_strtod when USE_STRTOD_FOR_FROM_CHARS is >> > > defined, otherwise parse a long double and convert to >> _Float128. >> > > >> > >> > >> > This is causing a regression on aarch64: >> > FAIL: libstdc++-abi/abi_check >> >> This is now PR 110077. >> > > Hi Christophe, > > Is this fixed for aarch64 now? I think it should be. > > Hi Jonathan, Yes, I know see PASS: libstdc++-abi/abi_check Thanks for fixing this. Christophe > >> >> >> > >> > The log says: >> > >> > 3 added symbols >> > 0 >> > _ZNSt7__cxx1112basic_stringIwSt11char_traitsIwESaIwEE11_S_allocateERS3_m >> > std::__cxx11::basic_string, >> > std::allocator >::_S_allocate(std::allocator&, >> unsigned >> > long) >> > version status: compatible >> > GLIBCXX_3.4.32 >> > type: function >> > status: added >> > >> > 1 >> > _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE11_S_allocateERS3_m >> > std::__cxx11::basic_string, >> > std::allocator >::_S_allocate(std::allocator&, unsigned >> long) >> > version status: compatible >> > GLIBCXX_3.4.32 >> > type: function >> > status: added >> > >> > 2 >> > _ZSt10from_charsPKcS0_RDF128_St12chars_format >> > std::from_chars(char const*, char const*, _Float128&, std::chars_format) >> > version status: incompatible >> > GLIBCXX_3.4.31 >> > type: function >> > status: added >> > >> > >> > 2 undesignated symbols >> > 0 >> > _ZSt11__once_call >> > std::__once_call >> > version status: compatible >> > GLIBCXX_3.4.11 >> > type: tls >> > type size: 8 >> > status: undesignated >> > >> > 1 >> > _ZSt15__once_callable >> > std::__once_callable >> > version status: compatible >> > GLIBCXX_3.4.11 >> > type: tls >> > type size: 8 >> > status: undesignated >> > >> > >> > 1 incompatible symbols >> > 0 >> > _ZSt10from_charsPKcS0_RDF128_St12chars_format >> > std::from_chars(char const*, char const*, _Float128&, std::chars_format) >> > version status: incompatible >> > GLIBCXX_3.4.31 >> > type: function >> > status: added >> > >> > >> > >> > ==== libstdc++-v3 check-abi Summary ==== >> > >> > # of added symbols: 3 >> > # of missing symbols: 0 >> > # of undesignated symbols: 2 >> > # of incompatible symbols: 1 >> > >> > >> > Can you have a look? >> > >> > Thanks, >> > Christophe >> > >> > --- >> > > libstdc++-v3/src/c++17/floating_from_chars.cc | 20 >> ++++++++++++------- >> > > 1 file changed, 13 insertions(+), 7 deletions(-) >> > > >> > > diff --git a/libstdc++-v3/src/c++17/floating_from_chars.cc >> > > b/libstdc++-v3/src/c++17/floating_from_chars.cc >> > > index ebd428d5be3..eea878072b0 100644 >> > > --- a/libstdc++-v3/src/c++17/floating_from_chars.cc >> > > +++ b/libstdc++-v3/src/c++17/floating_from_chars.cc >> > > @@ -64,7 +64,7 @@ >> > > // strtold for __ieee128 >> > > extern "C" __ieee128 __strtoieee128(const char*, char**); >> > > #elif __FLT128_MANT_DIG__ == 113 && __LDBL_MANT_DIG__ != 113 \ >> > > - && defined(__GLIBC_PREREQ) >> > > + && defined(__GLIBC_PREREQ) && >> defined(USE_STRTOD_FOR_FROM_CHARS) >> > > #define USE_STRTOF128_FOR_FROM_CHARS 1 >> > > extern "C" _Float128 __strtof128(const char*, char**) >> > > __asm ("strtof128") >> > > @@ -77,10 +77,6 @@ extern "C" _Float128 __strtof128(const char*, >> char**) >> > > #if _GLIBCXX_FLOAT_IS_IEEE_BINARY32 && >> _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 \ >> > > && __SIZE_WIDTH__ >= 32 >> > > # define USE_LIB_FAST_FLOAT 1 >> > > -# if __LDBL_MANT_DIG__ == __DBL_MANT_DIG__ >> > > -// No need to use strtold. >> > > -# undef USE_STRTOD_FOR_FROM_CHARS >> > > -# endif >> > > #endif >> > > >> > > #if USE_LIB_FAST_FLOAT >> > > @@ -1261,7 +1257,7 @@ from_chars_result >> > > from_chars(const char* first, const char* last, long double& value, >> > > chars_format fmt) noexcept >> > > { >> > > -#if ! USE_STRTOD_FOR_FROM_CHARS >> > > +#if __LDBL_MANT_DIG__ == __DBL_MANT_DIG__ || !defined >> > > USE_STRTOD_FOR_FROM_CHARS >> > > // Either long double is the same as double, or we can't use >> strtold. >> > > // In the latter case, this might give an incorrect result (e.g. >> values >> > > // out of range of double give an error, even if they fit in long >> > > double). >> > > @@ -1329,13 +1325,23 @@ >> > > _ZSt10from_charsPKcS0_RDF128_St12chars_format(const char* first, >> > > __ieee128& value, >> > > chars_format fmt) >> noexcept >> > > __attribute__((alias >> > > ("_ZSt10from_charsPKcS0_Ru9__ieee128St12chars_format"))); >> > > -#elif defined(USE_STRTOF128_FOR_FROM_CHARS) >> > > +#else >> > > from_chars_result >> > > from_chars(const char* first, const char* last, _Float128& value, >> > > chars_format fmt) noexcept >> > > { >> > > +#ifdef USE_STRTOF128_FOR_FROM_CHARS >> > > // fast_float doesn't support IEEE binary128 format, but we can use >> > > strtold. >> > > return from_chars_strtod(first, last, value, fmt); >> > > +#else >> > > + // Read a long double. This might give an incorrect result (e.g. >> values >> > > + // out of range of long double give an error, even if they fit in >> > > _Float128). >> > > + long double ldbl_val; >> > > + auto res = std::from_chars(first, last, ldbl_val, fmt); >> > > + if (res.ec == errc{}) >> > > + value = ldbl_val; >> > > + return res; >> > > +#endif >> > > } >> > > #endif >> > > >> > > -- >> > > 2.40.1 >> > > >> > > >> >> --000000000000689edb05ff44a26f--