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: [email protected], phone: +1 (978) 899-4797