Jonathan, could you send a fresh set of patches (or at least replacements)? I tried installing the patches on a master branch I checked out this morning, and I got two rejects:
--- libstdc++-v3/testsuite/util/testsuite_abi.cc +++ libstdc++-v3/testsuite/util/testsuite_abi.cc @@ -207,6 +207,7 @@ known_versions.push_back("GLIBCXX_3.4.24"); known_versions.push_back("GLIBCXX_3.4.25"); known_versions.push_back("GLIBCXX_3.4.26"); + known_versions.push_back("GLIBCXX_IEEE128_3.4.26"); known_versions.push_back("CXXABI_1.3"); known_versions.push_back("CXXABI_LDBL_1.3"); known_versions.push_back("CXXABI_1.3.1"); @@ -220,6 +221,8 @@ known_versions.push_back("CXXABI_1.3.9"); known_versions.push_back("CXXABI_1.3.10"); known_versions.push_back("CXXABI_1.3.11"); + known_versions.push_back("CXXABI_1.3.12"); + known_versions.push_back("CXXABI_IEEE128_1.3.12"); known_versions.push_back("CXXABI_TM_1"); known_versions.push_back("CXXABI_FLOAT128"); } @@ -238,7 +241,7 @@ // Check that added symbols are added in the latest pre-release version. bool latestp = (test.version_name == "GLIBCXX_3.4.26" - || test.version_name == "CXXABI_1.3.11" + || test.version_name == "CXXABI_1.3.12" || test.version_name == "CXXABI_FLOAT128" || test.version_name == "CXXABI_TM_1"); if (added && !latestp) --- libstdc++-v3/include/bits/locale_facets.h +++ libstdc++-v3/include/bits/locale_facets.h @@ -51,16 +51,19 @@ { _GLIBCXX_BEGIN_NAMESPACE_VERSION - // NB: Don't instantiate required wchar_t facets if no wchar_t support. -#ifdef _GLIBCXX_USE_WCHAR_T -# define _GLIBCXX_NUM_FACETS 28 -# define _GLIBCXX_NUM_CXX11_FACETS 16 -#else -# define _GLIBCXX_NUM_FACETS 14 -# define _GLIBCXX_NUM_CXX11_FACETS 8 -#endif +// Number of standard facets (for narrow characters only) +#define _GLIBCXX_NUM_FACETS 14 + +// Number of duplicated facets for cxx11 ABI +#define _GLIBCXX_NUM_CXX11_FACETS (_GLIBCXX_USE_DUAL_ABI ? 8 : 0) + +// codecvt<char16_t> and codecvt<char32_t> #define _GLIBCXX_NUM_UNICODE_FACETS 2 +// Facets duplicated for alt128 long double format +// num_get, num_put, money_get, money_put (+ cxx11 money_get, money_put) +#define _GLIBCXX_NUM_LBDL_ALT128_FACETS (4 + (_GLIBCXX_USE_DUAL_ABI ? 2 : 0)) + // Convert string to numeric value of type _Tp and store results. // NB: This is specialized for all required types, there is no // generic definition. I tried to fix it with the following patches, but I get the error when I build libstdc++: .../bin/ld: duplicate version tag `CXXABI_1.3.12' diff --git a/libstdc++-v3/testsuite/util/testsuite_abi.cc b/libstdc++-v3/testsuite/util/testsuite_abi.cc index 33b9ec15935..bbe397ae8a4 100644 --- a/libstdc++-v3/testsuite/util/testsuite_abi.cc +++ b/libstdc++-v3/testsuite/util/testsuite_abi.cc @@ -207,6 +207,7 @@ check_version(symbol& test, bool added) known_versions.push_back("GLIBCXX_3.4.24"); known_versions.push_back("GLIBCXX_3.4.25"); known_versions.push_back("GLIBCXX_3.4.26"); + known_versions.push_back("GLIBCXX_IEEE128_3.4.26"); known_versions.push_back("GLIBCXX_3.4.27"); known_versions.push_back("GLIBCXX_3.4.28"); known_versions.push_back("GLIBCXX_3.4.29"); @@ -225,6 +226,7 @@ check_version(symbol& test, bool added) known_versions.push_back("CXXABI_1.3.10"); known_versions.push_back("CXXABI_1.3.11"); known_versions.push_back("CXXABI_1.3.12"); + known_versions.push_back("CXXABI_IEEE128_1.3.12"); known_versions.push_back("CXXABI_1.3.13"); known_versions.push_back("CXXABI_TM_1"); known_versions.push_back("CXXABI_FLOAT128"); @@ -260,7 +262,17 @@ check_version(symbol& test, bool added) && test.demangled_name.find("std::__cxx11::") != 0) { if (test.version_name.find("_LDBL_") == std::string::npos - && test.version_name.find("_FLOAT128") == std::string::npos) + && test.version_name.find("_FLOAT128") == std::string::npos + && test.version_name.find("_IEEE128") == std::string::npos) + test.version_status = symbol::incompatible; + } + + // Check that IEEE128 long double compatibility symbols demangled as + // __ieee128 are put into some _LDBL_IEEE version name. + // XXX is this right? might not want *everything* for __ieee128 in here. + if (added && test.demangled_name.find("__ieee128") != std::string::npos) + { + if (test.version_name.find("_IEEE128") == std::string::npos) test.version_status = symbol::incompatible; } diff --git a/libstdc++-v3/include/bits/locale_facets.h b/libstdc++-v3/include/bits/locale_facets.h index 3e0ae8776c9..9b262c2d228 100644 --- a/libstdc++-v3/include/bits/locale_facets.h +++ b/libstdc++-v3/include/bits/locale_facets.h @@ -65,6 +65,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION # define _GLIBCXX_NUM_UNICODE_FACETS 2 #endif +// Facets duplicated for alt128 long double format +// num_get, num_put, money_get, money_put (+ cxx11 money_get, money_put) +#define _GLIBCXX_NUM_LBDL_ALT128_FACETS (4 + (_GLIBCXX_USE_DUAL_ABI ? 2 : 0)) + // Convert string to numeric value of type _Tp and store results. // NB: This is specialized for all required types, there is no // generic definition. @@ -2252,6 +2256,10 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL // XXX GLIBCXX_ABI Deprecated #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ + // For __gnu_cxx_ldbl128::num_get and __gnu_cxx_ieee128::num_get + // this entry in the vtable is for a 64-bit "long double" with the + // same format as double. This keeps the vtable layout consistent + // with std::num_get (visible when -mlong-double-64 is used). virtual iter_type __do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, double&) const; @@ -2264,8 +2272,21 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL virtual iter_type do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, void*&) const; + // XXX GLIBCXX_ABI Deprecated +#if defined _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT \ + && defined __LONG_DOUBLE_IEEE128__ + // For __gnu_cxx_ieee128::num_get this entry in the vtable is for + // the non-IEEE 128-bit "long double" (aka "double double"). This + // is consistent with __gnu_cxx_ldbl128::num_get (-mabi=ibmlongdouble) + virtual iter_type + __do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, + __ibm128&) const; +#endif + // XXX GLIBCXX_ABI Deprecated #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ + // For __gnu_cxx_ldbl128::num_get and __gnu_cxx_ieee128::num_get + // this entry in the vtable is for the 128-bit "long double" type. virtual iter_type do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, long double&) const; @@ -2545,6 +2566,13 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL virtual iter_type do_put(iter_type, ios_base&, char_type, const void*) const; + // XXX GLIBCXX_ABI Deprecated +#if defined _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT \ + && defined __LONG_DOUBLE_IEEE128__ + virtual iter_type + __do_put(iter_type, ios_base&, char_type, __ibm128) const; +#endif + // XXX GLIBCXX_ABI Deprecated #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ virtual iter_type -- Michael Meissner, IBM IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA email: meiss...@linux.ibm.com, phone: +1 (978) 899-4797