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

Kamil Rytarowski n54@gmx.com
Tue Jan 7 00:31:00 GMT 2020


On 07.01.2020 01:26, Jonathan Wakely wrote:
> 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 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;
>>>
>>> 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.
> 
> 

I know, but we don't support this in NetBSD. We ship with our own major
numbers for GCC. If someone wants to maintain out of base or out of
pkgsrc it will have likely more problems than ABI breakage.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20200107/70394f92/attachment.sig>


More information about the Libstdc++ mailing list