On Wed, 3 May 2023 at 19:55, Jakub Jelinek via Libstdc++ <libstd...@gcc.gnu.org> wrote: > > Hi! > > This is an ABI problem on powerpc64le-linux, introduced in 13.1. > When libstdc++ is configured against old glibc, the > _ZSt10from_charsPKcS0_RDF128_St12chars_format@@GLIBCXX_3.4.31 > _ZSt8to_charsPcS_DF128_@@GLIBCXX_3.4.31 > _ZSt8to_charsPcS_DF128_St12chars_format@@GLIBCXX_3.4.31 > _ZSt8to_charsPcS_DF128_St12chars_formati@@GLIBCXX_3.4.31 > symbols are exported from the library, while when it is configured against > new enough glibc, those symbols aren't exported and we export instead > _ZSt10from_charsPKcS0_Ru9__ieee128St12chars_format@@GLIBCXX_IEEE128_3.4.29 > _ZSt8to_charsPcS_u9__ieee128@@GLIBCXX_IEEE128_3.4.29 > _ZSt8to_charsPcS_u9__ieee128St12chars_format@@GLIBCXX_IEEE128_3.4.29 > _ZSt8to_charsPcS_u9__ieee128St12chars_formati@@GLIBCXX_IEEE128_3.4.29 > together with various other @@GLIBCXX_IEEE128_3.4.{29,30,31} and > @@CXXABI_IEEE128_1.3.13 symbols. The idea was that those *IEEE128* symbol > versions (similarly to *LDBL* symbol versions) are optional (but if it > appears, all symbols from it up to the version of the library appears), > but the base appears always. > My _Float128 from_chars/to_chars changes unfortunately broke this. > I believe nothing really uses those symbols if libstdc++ has been > configured against old glibc, so if 13.1 wasn't already released, it might > be best to make sure they aren't exported on powerpc64le-linux. > But as they were exported, I think the best resolution for this ABI > difference is to add those 4 symbols as aliases to the > GLIBCXX_IEEE128_3.4.29 *u9__ieee128* symbols, which the following patch > does. > > Tested on powerpc64le-linux (both configured against glibc 2.36 and 2.17) > and powerpc64-linux (configured against glibc 2.17), ok for trunk?
Do we want a #pragma to suppress -Wattribute-alias here? > > 2023-05-03 Jakub Jelinek <ja...@redhat.com> > > * src/c++17/floating_from_chars.cc > (_ZSt10from_charsPKcS0_RDF128_St12chars_format): New alias to > _ZSt10from_charsPKcS0_Ru9__ieee128St12chars_format. > * src/c++17/floating_to_chars.cc (_ZSt8to_charsPcS_DF128_): New alias > to > _ZSt8to_charsPcS_u9__ieee128. > (_ZSt8to_charsPcS_DF128_St12chars_format): New alias to > _ZSt8to_charsPcS_u9__ieee128St12chars_format. > (_ZSt8to_charsPcS_DF128_St12chars_formati): New alias to > _ZSt8to_charsPcS_u9__ieee128St12chars_formati. > * config/abi/post/powerpc64le-linux-gnu/baseline_symbols.txt: Updated. > > --- libstdc++-v3/src/c++17/floating_from_chars.cc.jj 2023-04-13 > 23:00:36.125459347 +0200 > +++ libstdc++-v3/src/c++17/floating_from_chars.cc 2023-05-03 > 17:24:45.121600206 +0200 > @@ -1272,6 +1272,13 @@ from_chars(const char* first, const char > // fast_float doesn't support IEEE binary128 format, but we can use > strtold. > return from_chars_strtod(first, last, value, fmt); > } > + > +extern "C" from_chars_result > +_ZSt10from_charsPKcS0_RDF128_St12chars_format(const char* first, > + const char* last, > + __ieee128& value, > + chars_format fmt) noexcept > +__attribute__((alias > ("_ZSt10from_charsPKcS0_Ru9__ieee128St12chars_format"))); > #elif defined(USE_STRTOF128_FOR_FROM_CHARS) > from_chars_result > from_chars(const char* first, const char* last, _Float128& value, > --- libstdc++-v3/src/c++17/floating_to_chars.cc.jj 2023-01-16 > 23:19:06.284716774 +0100 > +++ libstdc++-v3/src/c++17/floating_to_chars.cc 2023-05-03 17:12:16.766877278 > +0200 > @@ -1851,6 +1851,23 @@ to_chars(char* first, char* last, __floa > { > return __floating_to_chars_precision(first, last, value, fmt, precision); > } > + > +extern "C" to_chars_result > +_ZSt8to_charsPcS_DF128_(char* first, char* last, __float128 value) noexcept > + __attribute__((alias ("_ZSt8to_charsPcS_u9__ieee128"))); > + > +extern "C" to_chars_result > +_ZSt8to_charsPcS_DF128_St12chars_format(char* first, char* last, > + __float128 value, > + chars_format fmt) noexcept > + __attribute__((alias ("_ZSt8to_charsPcS_u9__ieee128St12chars_format"))); > + > +extern "C" to_chars_result > +_ZSt8to_charsPcS_DF128_St12chars_formati(char* first, char* last, > + __float128 value, > + chars_format fmt, > + int precision) noexcept > + __attribute__((alias ("_ZSt8to_charsPcS_u9__ieee128St12chars_formati"))); > #else > to_chars_result > to_chars(char* first, char* last, _Float128 value) noexcept > --- > libstdc++-v3/config/abi/post/powerpc64le-linux-gnu/baseline_symbols.txt.jj > 2023-05-02 19:27:47.538504941 +0200 > +++ libstdc++-v3/config/abi/post/powerpc64le-linux-gnu/baseline_symbols.txt > 2023-05-03 19:06:33.389469841 +0200 > @@ -4491,6 +4491,7 @@ FUNC:_ZNSt9type_infoD1Ev@@GLIBCXX_3.4 > FUNC:_ZNSt9type_infoD2Ev@@GLIBCXX_3.4 > > FUNC:_ZNVSt9__atomic011atomic_flag12test_and_setESt12memory_order@@GLIBCXX_3.4.11 > FUNC:_ZNVSt9__atomic011atomic_flag5clearESt12memory_order@@GLIBCXX_3.4.11 > +FUNC:_ZSt10from_charsPKcS0_RDF128_St12chars_format@@GLIBCXX_3.4.31 > FUNC:_ZSt10from_charsPKcS0_RdSt12chars_format@@GLIBCXX_3.4.29 > FUNC:_ZSt10from_charsPKcS0_ReSt12chars_format@@GLIBCXX_3.4.29 > FUNC:_ZSt10from_charsPKcS0_RfSt12chars_format@@GLIBCXX_3.4.29 > @@ -4641,6 +4642,9 @@ FUNC:_ZSt7getlineIwSt11char_traitsIwESaI > > FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RNSt7__cxx1112basic_stringIS4_S5_T1_EES4_@@GLIBCXX_3.4.21 > > FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4 > > FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCXX_3.4 > +FUNC:_ZSt8to_charsPcS_DF128_@@GLIBCXX_3.4.31 > +FUNC:_ZSt8to_charsPcS_DF128_St12chars_format@@GLIBCXX_3.4.31 > +FUNC:_ZSt8to_charsPcS_DF128_St12chars_formati@@GLIBCXX_3.4.31 > FUNC:_ZSt8to_charsPcS_d@@GLIBCXX_3.4.29 > FUNC:_ZSt8to_charsPcS_dSt12chars_format@@GLIBCXX_3.4.29 > FUNC:_ZSt8to_charsPcS_dSt12chars_formati@@GLIBCXX_3.4.29 > > Jakub >