This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] libstdcxx: Update ctype_base.h from NetBSD upstream


On 07/01/20 00:18 +0100, Kamil Rytarowski wrote:
On 06.01.2020 16:34, 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 libstdc++@gcc.gnu.org.

Let me re-address this to libstdc++@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;
+
+    static const mask upper    = _CTYPE_U;
+    static const mask lower    = _CTYPE_L;
+    static const mask alpha    = _CTYPE_A;
+    static const mask digit    = _CTYPE_D;
+    static const mask xdigit    = _CTYPE_X;
+    static const mask space    = _CTYPE_S;
+    static const mask print    = _CTYPE_R;
+    static const mask graph    = _CTYPE_G;
+    static const mask cntrl    = _CTYPE_C;
+    static const mask punct    = _CTYPE_P;
+    static const mask alnum    = _CTYPE_A | _CTYPE_D;
#endif
#if __cplusplus >= 201103L
-    static const mask blank     = space;
+    static const mask blank    = space;
#endif
  };

diff --git a/libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc
b/libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc
index ed3b7cd0d6a..33358e8f5d8 100644
--- a/libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc
+++ b/libstdc++-v3/config/os/bsd/netbsd/ctype_configure_char.cc
@@ -38,11 +38,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION

// Information as gleaned from /usr/include/ctype.h

-  extern "C" const u_int8_t _C_ctype_[];
-
  const ctype_base::mask*
  ctype<char>::classic_table() throw()
-  { return _C_ctype_ + 1; }
+  { return _C_ctype_tab_ + 1; }

The first patch attached to PR 64271 (i.e.
https://gcc.gnu.org/bugzilla/attachment.cgi?id=34254 ) does that
differently. Is it safe to make this change unconditionally?


This file is NetBSD only (at least in theory) and we likely can do the
right think without conditional build here.

Yes, it's NetBSD-specific, but it's used for multiple versions of
NetBSD.

The patch in PR 64271 only uses _C_ctype_tab_+1 when _CTYPE_BL is
defined, i.e. for newer versions of NetBSD. For older versions, it
still uses _C_ctype_.

So my question is whether _C_ctype_tab_+1 does the right thing for all
versions of NetBSD, or only for newer ones.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]