[libstdc++] Add proper OpenBSD support

Submitted by Mark Kettenis on Oct. 8, 2012, 7:45 p.m.

Details

Message ID 201210081945.q98Jj9P8011913@glazunov.sibelius.xs4all.nl
State New
Headers show

Commit Message

Mark Kettenis Oct. 8, 2012, 7:45 p.m.
Jonathan,

Any further thoughts about this?  I've attached a diff that combines
my origional diff with the change to use the "newlib" locale model on
OpenBSD since they probably should be committed together.

> > > On 10 September 2012 07:34, Mark Kettenis wrote:
> > >> Date: Sun, 9 Sep 2012 21:07:39 +0100
> > >> From: Jonathan Wakely <jwakely.gcc@gmail.com>
> > >>
> > >> On 4 September 2012 20:26, Mark Kettenis wrote:
> > >> > Fixes a few testcases.  Mostly based on the existing
> > >> > NetBSD/FreeBSD/Darwin code.
> > >> >
> > >> > 2012-09-04  Mark Kettenis  <kettenis@openbsd.org>
> > >> >
> > >> >         * configure.host (*-*-openbsd*) Set cpu_include_dir.
> > >> >         * config/os/bsd/openbsd/ctype_base.h: New file.
> > >> >         * config/os/bsd/openbsd/ctype_configure_char.cc: New file.
> > >> >         * config/os/bsd/openbsd/ctype_inline.h: New file.
> > >> >         * config/os/bsd/openbsd/os_defines.h: New file.
> > >>
> > >> This patch is OK, thanks.  Do you want me to commit it for you?
> > >
> > > Yes please.
> > 
> > It occurs to me now that the patch changes the size of
> > ctype_base::mask, from the generic unsigned to char. I assume the
> > OpenBSD system compiler uses char? How long has that change been
> > present in the OpenBSD source tree?
> 
> Yes, the system compile uses char and has been doing so since mid-2005.
> 
> > I'm not sure whether or not it's better to change the size of that
> > type in GCC 4.8, which would break compatibility with previous
> > versions of the FSF sources but provide compatibility with the OpenBSD
> > system compiler.  My guess would be that most people on OpenBSD are
> > using the system compiler not upstream FSF sources.
> 
> Indeed.  People either use the system compiler or install one from
> ports/packages.  Given the sorry state of OpenBSD support in the FSF
> source tree (barely buildable) I think binary compatibility with the
> system compiler is more important.

2012-10-08  Mark Kettenis  <kettenis@openbsd.org>

	* configure.host (*-*-openbsd*) Set cpu_include_dir.
	* config/os/bsd/openbsd/ctype_base.h: New file.
	* config/os/bsd/openbsd/ctype_configure_char.cc: New file.
	* config/os/bsd/openbsd/ctype_inline.h: New file.
	* config/os/bsd/openbsd/os_defines.h: New file.
	* acinclude.m4 (GLIBCXX_ENABLE_CLOCALE): Use newlib locale model
	for OpenBSD.
	* configure: Regenerated.

Comments

Jonathan Wakely Oct. 8, 2012, 7:52 p.m.
On 8 October 2012 20:45, Mark Kettenis wrote:
> Jonathan,
>
> Any further thoughts about this?  I've attached a diff that combines
> my origional diff with the change to use the "newlib" locale model on
> OpenBSD since they probably should be committed together.

Hi,

Sorry for the delay, I realised over the weekend this never went in.

I'm happy to apply the combined diff if you think using newlib is the
right option for OpenBSD.

Jonathan
Mark Kettenis Oct. 9, 2012, 7:48 p.m.
> Date: Mon, 8 Oct 2012 20:52:22 +0100
> From: Jonathan Wakely <jwakely.gcc@gmail.com>
> 
> On 8 October 2012 20:45, Mark Kettenis wrote:
> > Jonathan,
> >
> > Any further thoughts about this?  I've attached a diff that combines
> > my origional diff with the change to use the "newlib" locale model on
> > OpenBSD since they probably should be committed together.
> 
> Hi,
> 
> Sorry for the delay, I realised over the weekend this never went in.
> 
> I'm happy to apply the combined diff if you think using newlib is the
> right option for OpenBSD.

I think it is.  The newlib ctype classification is identical to the
traditional BSD scheme that OpenBSD uses.

Thanks,

Mark
Jonathan Wakely Oct. 9, 2012, 9:03 p.m.
On 9 October 2012 20:48, Mark Kettenis wrote:
>
> I think it is.  The newlib ctype classification is identical to the
> traditional BSD scheme that OpenBSD uses.

OK, I'll commit your patch tomorrow, thanks.
Jonathan Wakely Oct. 10, 2012, 11:10 p.m.
On 9 October 2012 22:03, Jonathan Wakely wrote:
> On 9 October 2012 20:48, Mark Kettenis wrote:
>>
>> I think it is.  The newlib ctype classification is identical to the
>> traditional BSD scheme that OpenBSD uses.
>
> OK, I'll commit your patch tomorrow, thanks.

it's on the trunk now, thanks for improving the OpenBSD support.

Patch hide | download patch | download mbox

Index: acinclude.m4
===================================================================
--- acinclude.m4	(revision 192154)
+++ acinclude.m4	(working copy)
@@ -1862,6 +1862,9 @@ 
       darwin* | freebsd*)
 	enable_clocale_flag=darwin
 	;;
+      openbsd*)
+	enable_clocale_flag=newlib
+	;;
       *)
 	if test x"$with_newlib" = x"yes"; then
 	  enable_clocale_flag=newlib
Index: config/os/bsd/openbsd/ctype_base.h
===================================================================
--- config/os/bsd/openbsd/ctype_base.h	(revision 0)
+++ config/os/bsd/openbsd/ctype_base.h	(working copy)
@@ -0,0 +1,59 @@ 
+// Locale support -*- C++ -*-
+
+// Copyright (C) 2000, 2009, 2012 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+//
+// ISO C++ 14882: 22.1  Locales
+//
+  
+// Information as gleaned from /usr/include/ctype.h on OpenBSD.
+  
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  /// @brief  Base class for ctype.
+  struct ctype_base
+  {
+    // Non-standard typedefs.
+    typedef const short*	__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 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;
+  };
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
Index: config/os/bsd/openbsd/ctype_configure_char.cc
===================================================================
--- config/os/bsd/openbsd/ctype_configure_char.cc	(revision 0)
+++ config/os/bsd/openbsd/ctype_configure_char.cc	(working copy)
@@ -0,0 +1,99 @@ 
+// Locale support -*- C++ -*-
+
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file ctype_configure_char.cc */
+
+//
+// ISO C++ 14882: 22.1  Locales
+//
+
+#include <locale>
+#include <cstdlib>
+#include <cstring>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+// Information as gleaned from /usr/include/ctype.h
+
+  const ctype_base::mask*
+  ctype<char>::classic_table() throw()
+  { return _ctype_ + 1; }
+
+  ctype<char>::ctype(__c_locale, const mask* __table, bool __del, 
+		     size_t __refs) 
+  : facet(__refs), _M_del(__table != 0 && __del), 
+  _M_toupper(NULL), _M_tolower(NULL), 
+  _M_table(__table ? __table : classic_table())
+  { 
+    memset(_M_widen, 0, sizeof(_M_widen));
+    _M_widen_ok = 0;
+    memset(_M_narrow, 0, sizeof(_M_narrow));
+    _M_narrow_ok = 0;
+  }
+
+  ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) 
+  : facet(__refs), _M_del(__table != 0 && __del), 
+  _M_toupper(NULL), _M_tolower(NULL), 
+  _M_table(__table ? __table : classic_table())
+  { 
+    memset(_M_widen, 0, sizeof(_M_widen));
+    _M_widen_ok = 0;
+    memset(_M_narrow, 0, sizeof(_M_narrow));
+    _M_narrow_ok = 0;
+  }
+
+  char
+  ctype<char>::do_toupper(char __c) const
+  { return ::toupper((int) __c); }
+
+  const char*
+  ctype<char>::do_toupper(char* __low, const char* __high) const
+  {
+    while (__low < __high)
+      {
+	*__low = ::toupper((int) *__low);
+	++__low;
+      }
+    return __high;
+  }
+
+  char
+  ctype<char>::do_tolower(char __c) const
+  { return ::tolower((int) __c); }
+
+  const char* 
+  ctype<char>::do_tolower(char* __low, const char* __high) const
+  {
+    while (__low < __high)
+      {
+	*__low = ::tolower((int) *__low);
+	++__low;
+      }
+    return __high;
+  }
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
Index: config/os/bsd/openbsd/ctype_inline.h
===================================================================
--- config/os/bsd/openbsd/ctype_inline.h	(revision 0)
+++ config/os/bsd/openbsd/ctype_inline.h	(working copy)
@@ -0,0 +1,74 @@ 
+// Locale support -*- C++ -*-
+
+// Copyright (C) 2010 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file bits/ctype_inline.h
+ *  This is an internal header file, included by other library headers.
+ *  Do not attempt to use it directly. @headername{locale}
+ */
+
+//
+// ISO C++ 14882: 22.1  Locales
+//
+
+// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*)
+// functions go in ctype.cc
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  bool
+  ctype<char>::
+  is(mask __m, char __c) const
+  { return _M_table[static_cast<unsigned char>(__c)] & __m; }
+
+  const char*
+  ctype<char>::
+  is(const char* __low, const char* __high, mask* __vec) const
+  {
+    while (__low < __high)
+      *__vec++ = _M_table[static_cast<unsigned char>(*__low++)];
+    return __high;
+  }
+
+  const char*
+  ctype<char>::
+  scan_is(mask __m, const char* __low, const char* __high) const
+  {
+    while (__low < __high && !this->is(__m, *__low))
+      ++__low;
+    return __low;
+  }
+
+  const char*
+  ctype<char>::
+  scan_not(mask __m, const char* __low, const char* __high) const
+  {
+    while (__low < __high && this->is(__m, *__low) != 0)
+      ++__low;
+    return __low;
+  }
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
Index: config/os/bsd/openbsd/os_defines.h
===================================================================
--- config/os/bsd/openbsd/os_defines.h	(revision 0)
+++ config/os/bsd/openbsd/os_defines.h	(working copy)
@@ -0,0 +1,41 @@ 
+// Specific definitions for OpenBSD  -*- C++ -*-
+
+// Copyright (C) 2000, 2002, 2009, 2012 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+/** @file bits/os_defines.h
+ *  This is an internal header file, included by other library headers.
+ *  Do not attempt to use it directly. @headername{iosfwd}
+ */
+
+#ifndef _GLIBCXX_OS_DEFINES
+#define _GLIBCXX_OS_DEFINES 1
+
+// System-specific #define, typedefs, corrections, etc, go here.  This
+// file will come before all others.
+
+#define _GLIBCXX_USE_C99_DYNAMIC (!(__ISO_C_VISIBLE >= 1999))
+#define _GLIBCXX_USE_C99_LONG_LONG_DYNAMIC _GLIBCXX_USE_C99_DYNAMIC
+#define _GLIBCXX_USE_C99_FLOAT_TRANSCENDENTALS_DYNAMIC _GLIBCXX_USE_C99_DYNAMIC
+#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC _GLIBCXX_USE_C99_DYNAMIC
+
+#endif
Index: configure.host
===================================================================
--- configure.host	(revision 192154)
+++ configure.host	(working copy)
@@ -291,6 +291,9 @@ 
   netbsd*)
     os_include_dir="os/bsd/netbsd"
     ;;
+  openbsd*)
+    os_include_dir="os/bsd/openbsd"
+    ;;
   qnx6.[12]*)
     os_include_dir="os/qnx/qnx6.1"
     c_model=c