On 07.01.2020 01:28, Jonathan Wakely wrote: > 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 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; >>>> + >>>> + 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.
This change was introduced in 2013 and we do not support such old snapshots. If GCC wants to support older releases there it would be futile. > > 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. > The right thing today is to go unconditionally for _C_ctype_tab_ and abandon _C_ctype_ entirely. _C_ctype_ was u8 and did not support all inline semantics. We still keep _C_ctype_ binary compat for the time being (until next libc major bump), but it will go away in future (no timeline when).
signature.asc
Description: OpenPGP digital signature