From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ed1-x536.google.com (mail-ed1-x536.google.com [IPv6:2a00:1450:4864:20::536]) by sourceware.org (Postfix) with ESMTPS id 487AD3858C30 for ; Thu, 1 Jun 2023 09:29:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 487AD3858C30 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-ed1-x536.google.com with SMTP id 4fb4d7f45d1cf-51492ae66a4so965812a12.1 for ; Thu, 01 Jun 2023 02:29:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1685611769; x=1688203769; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=o26KMRLXZ1ZhgS4WiOMIJ1zzZqdDcAwvYCMswKN7EUs=; b=CS/PpVM60HP1DxyXpi7knIqZAaXGJB6qNJ26bSv+xjQH/BGVpC8c4hPAV8A2aU67mj 9GBtxQUyDLxfQ6tkxGmQwQVUfjjUSjKCBWq4+hRvUojYMvbbWe+Q9WMkd9MzmVMT/ng/ Mv2PHXw4JMgmC5lLqI0Keaa2vUT0056SmxHbsqWg8jldna+6lAi/wna1mo9ZtOv6AobB NTPHgw1jR0ZBsgzjK/4qaryJbv1zgRJqbhAjvt2TxUfJoap1aVbix7/otr4wbp3rXXDd G0BjW7c7TQOV1YetFCogE5E3lfbjHJcIv6J18BD77oK2ZRp9fL6WkX/PfwFiSXoiX3Vs dOsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685611769; x=1688203769; 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=o26KMRLXZ1ZhgS4WiOMIJ1zzZqdDcAwvYCMswKN7EUs=; b=cmmLOfW0hBsXKDKjVdrqJCxjTCm5PSzTaVMxZ2BDhwVI4hJjU0tO5DAQ4hB0loOb7b lxWxSkJzmiK7ONkB5xE3MUwnu15alTsK/osg+cpJYEbz03dFzfjDTcohLhDoB0nW84ng KYwjo/BXaD+qcmK1xOrzmAhzdxKZOkFT49U3Hdz0u2ha1r2fm4Vg26goetoST3BviueU Fv79XepgW9IP0G6xFst2f556jwe4nCsVRBHPQN/Y8wg7T9SGi2lAfFdM4CIIdE1thhNE WE/dhtDmwBIA0udFXaQqp1wuGVr0z/nEUtgESu32tPmIClwJ6tQ3w+TDQ5F+FHfjw+HD dxmQ== X-Gm-Message-State: AC+VfDy3cjoXYg4DmC3v+2ao2Mv4qQuxXv6L3mUWFwSJnb4YXDQlP4RR IzE9D27UvnRgp7y/Ykxop4PHEAblWPcBVRIR4tX9OPA6CDlXZvmq5cWderZk X-Google-Smtp-Source: ACHHUZ6uX/9QWePmtHUmreAADUAFoKGe+kjPqNS8gKqvkmjap6qGH2GUY+zQl7WM0I//SCcHTsK+GIHEsOiIymGBD5Y= X-Received: by 2002:aa7:d642:0:b0:514:7afc:67d4 with SMTP id v2-20020aa7d642000000b005147afc67d4mr5020233edr.39.1685611768935; Thu, 01 Jun 2023 02:29:28 -0700 (PDT) MIME-Version: 1.0 References: <20230531122222.4116868-1-jwakely@redhat.com> In-Reply-To: <20230531122222.4116868-1-jwakely@redhat.com> From: Christophe Lyon Date: Thu, 1 Jun 2023 11:29:23 +0200 Message-ID: Subject: Re: [committed] libstdc++: Fix preprocessor conditions for std::from_chars [PR109921] To: Jonathan Wakely Cc: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Content-Type: multipart/alternative; boundary="000000000000b78de605fd0e12e3" X-Spam-Status: No, score=-10.4 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: --000000000000b78de605fd0e12e3 Content-Type: text/plain; charset="UTF-8" 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 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 > > --000000000000b78de605fd0e12e3--