On 06/01/20 23:20 +0100, Kamil Rytarowski wrote:
On 06.01.2020 16:24, Jonathan Wakely wrote:
On 22/12/19 09:36 +1000, Gerald Pfeifer wrote:
Hi Matthew,

On Mon, 4 Feb 2019, Matthew Bauer wrote:
The ctype_base.h file in libstdc++-v3 is out of date for NetBSD. They
have changed their ctype.h definition. It was updated in their intree
libstdc++-v3 but not in the GCC one. My understanding is this is a
straightforward rewrite. I've attached my own patch, but the file can
be obtained directly here:

http://cvsweb.netbsd.org/bsdweb.cgi/src/external/gpl3/gcc/dist/libstdc%2b%2b-v3/config/os/bsd/netbsd/ctype_base.h


With the attached patch, libstdc++-v3 can succesfully be built with
NetBSD headers (along with --disable-libcilkrts).

I noticed this has not been applied yet, nor seen a follow-up?, and also
noticed it went to the gcc-patches list, but not libstd...@gcc.gnu.org.

Let me re-address this to libstd...@gcc.gnu.org in the hope the
maintainers there will have a look.

Gerald

diff --git a/libstdc++-v3/config/os/bsd/netbsd/ctype_base.h
b/libstdc++-v3/config/os/bsd/netbsd/ctype_base.h
index ff3ec893974..21eccf9fde1 100644
--- a/libstdc++-v3/config/os/bsd/netbsd/ctype_base.h
+++ b/libstdc++-v3/config/os/bsd/netbsd/ctype_base.h
@@ -38,40 +38,46 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
  /// @brief  Base class for ctype.
  struct ctype_base
  {
-    // Non-standard typedefs.
-    typedef const unsigned char*    __to_type;

    // NB: Offsets into ctype<char>::_M_table force a particular size
    // on the mask type. Because of this, we don't use an enum.
-    typedef unsigned char          mask;

#ifndef _CTYPE_U
-    static const mask upper        = _U;
-    static const mask lower     = _L;
-    static const mask alpha     = _U | _L;
-    static const mask digit     = _N;
-    static const mask xdigit     = _N | _X;
-    static const mask space     = _S;
-    static const mask print     = _P | _U | _L | _N | _B;
-    static const mask graph     = _P | _U | _L | _N;
-    static const mask cntrl     = _C;
-    static const mask punct     = _P;
-    static const mask alnum     = _U | _L | _N;
+    // Non-standard typedefs.
+    typedef const unsigned char*    __to_type;
+
+    typedef unsigned char    mask;
+
+    static const mask upper    = _U;
+    static const mask lower    = _L;
+    static const mask alpha    = _U | _L;
+    static const mask digit    = _N;
+    static const mask xdigit    = _N | _X;
+    static const mask space    = _S;
+    static const mask print    = _P | _U | _L | _N | _B;
+    static const mask graph    = _P | _U | _L | _N;
+    static const mask cntrl    = _C;
+    static const mask punct    = _P;
+    static const mask alnum    = _U | _L | _N;
#else
-    static const mask upper        = _CTYPE_U;
-    static const mask lower     = _CTYPE_L;
-    static const mask alpha     = _CTYPE_U | _CTYPE_L;
-    static const mask digit     = _CTYPE_N;
-    static const mask xdigit     = _CTYPE_N | _CTYPE_X;
-    static const mask space     = _CTYPE_S;
-    static const mask print     = _CTYPE_P | _CTYPE_U | _CTYPE_L |
_CTYPE_N | _CTYPE_B;
-    static const mask graph     = _CTYPE_P | _CTYPE_U | _CTYPE_L |
_CTYPE_N;
-    static const mask cntrl     = _CTYPE_C;
-    static const mask punct     = _CTYPE_P;
-    static const mask alnum     = _CTYPE_U | _CTYPE_L | _CTYPE_N;
+    typedef const unsigned short*    __to_type;
+
+    typedef unsigned short    mask;

I seem to recall looking at this previously and noting that the change
to ctype_base::mask is an ABI break. It means that code compiled with
old versions of GCC or on old versions of NetBSD will not be ABI
compatible with code compiled by a new GCC on a new version of NetBSD.

If the NetBSD maintainers are OK with that, then we can go ahead and
change it.



We are fine with ABI breaks as we bump libstdc++ major on each upgrade
in base.

That affects the libstdc++ built from NetBSD ports collection, but if
somebody builds GCC themselves using the upstream sources (which is
what these patches are trying to change) then they don't get that
bumped major version.

So if somebody builds GCC 9 themselves, and then builds GCC 10
themselves on the same machine, they'll get two versions of
libstdc++.so that are not ABI compatible.




Reply via email to