Fixes for FreeBSD, including some fairly obvious copy-and-paste errors.

libc++ now mostly works on FreeBSD with libcxxrt and this patch applied to the base system:

http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20110920/e666632c/xlocale-0001.obj

Summary of tests on FreeBSD:


****************************************************
Results for /root/libcxx/test:
using FreeBSD clang version 3.0 (trunk 135360) 20110717
Target: x86_64-unknown-freebsd9.0
Thread model: posix
with -std=c++0x -stdlib=libc++ -I/root/libcxx/include -L/root/libcxx/build/lib
----------------------------------------------------
sections without tests   : 1
sections with failures   : 48
sections without failures: 1015
                       +   ----
total number of sections : 1064
----------------------------------------------------
number of tests failed   : 145
number of tests passed   : 4179
                       +   ----
total number of tests    : 4324
****************************************************

(Many due to this clang version not supporting C++ atomics)

More fixes to follow...



git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@140245 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Chisnall 2011-09-21 08:39:44 +00:00
parent e2f2a15066
commit c512df1950
6 changed files with 60 additions and 46 deletions

View File

@ -21,3 +21,6 @@ N: Bjorn Reese
E: breese@users.sourceforge.net E: breese@users.sourceforge.net
D: Initial regex prototype D: Initial regex prototype
N: David Chisnall
E: theraven at theravensnest dot org
D: FreeBSD port and libcxxrt support.

View File

@ -297,7 +297,7 @@ template <unsigned> struct __static_assert_check {};
#define __has_feature(__x) 0 #define __has_feature(__x) 0
#endif #endif
#ifdef __APPLE__ #if __APPLE__ || __FreeBSD__
#define _LIBCPP_LOCALE__L_EXTENSIONS 1 #define _LIBCPP_LOCALE__L_EXTENSIONS 1
#endif #endif
@ -305,7 +305,7 @@ template <unsigned> struct __static_assert_check {};
#define _LIBCPP_STABLE_APPLE_ABI #define _LIBCPP_STABLE_APPLE_ABI
#endif #endif
#ifdef __APPLE__ #if __APPLE__ || __FreeBSD__
#define _LIBCPP_WCTYPE_IS_MASK #define _LIBCPP_WCTYPE_IS_MASK
#endif #endif

View File

@ -302,24 +302,8 @@ locale::operator()(const basic_string<_CharT, _Traits, _Allocator>& __x,
class _LIBCPP_VISIBLE ctype_base class _LIBCPP_VISIBLE ctype_base
{ {
public: public:
#ifdef __GLIBC__ #if __GLIBC__
typedef unsigned short mask; typedef unsigned short mask;
#else
typedef __uint32_t mask;
#endif
#if __APPLE__ || __FreeBSD__
static const mask space = _CTYPE_S;
static const mask print = _CTYPE_R;
static const mask cntrl = _CTYPE_C;
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 punct = _CTYPE_P;
static const mask xdigit = _CTYPE_X;
static const mask blank = _CTYPE_B;
#else // __APPLE__
static const mask space = _ISspace; static const mask space = _ISspace;
static const mask print = _ISprint; static const mask print = _ISprint;
static const mask cntrl = _IScntrl; static const mask cntrl = _IScntrl;
@ -330,7 +314,23 @@ public:
static const mask punct = _ISpunct; static const mask punct = _ISpunct;
static const mask xdigit = _ISxdigit; static const mask xdigit = _ISxdigit;
static const mask blank = _ISblank; static const mask blank = _ISblank;
#endif // __APPLE__ #else // __GLIBC__
#if __APPLE__
typedef __uint32_t mask;
#elif __FreeBSD__
typedef unsigned long mask;
#endif
static const mask space = _CTYPE_S;
static const mask print = _CTYPE_R;
static const mask cntrl = _CTYPE_C;
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 punct = _CTYPE_P;
static const mask xdigit = _CTYPE_X;
static const mask blank = _CTYPE_B;
#endif // __GLIBC__
static const mask alnum = alpha | digit; static const mask alnum = alpha | digit;
static const mask graph = alnum | punct; static const mask graph = alnum | punct;

View File

@ -272,7 +272,7 @@ size_t __mbsnrtowcs_l(wchar_t * __dest, const char **__src, size_t __nms,
size_t __len, mbstate_t *__ps, locale_t __l) size_t __len, mbstate_t *__ps, locale_t __l)
{ {
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS #ifdef _LIBCPP_LOCALE__L_EXTENSIONS
return mbsnrtowcs_l(__dest, __src, __nms__len, __ps, __l); return mbsnrtowcs_l(__dest, __src, __nms, __len, __ps, __l);
#else #else
__locale_raii __current(uselocale(__l), uselocale); __locale_raii __current(uselocale(__l), uselocale);
return mbsnrtowcs(__dest, __src, __nms, __len, __ps); return mbsnrtowcs(__dest, __src, __nms, __len, __ps);
@ -295,7 +295,7 @@ _LIBCPP_ALWAYS_INLINE inline
int __mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l) int __mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l)
{ {
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS #ifdef _LIBCPP_LOCALE__L_EXTENSIONS
return mbtowc(__pwc, __pmb, __max, __l); return mbtowc_l(__pwc, __pmb, __max, __l);
#else #else
__locale_raii __current(uselocale(__l), uselocale); __locale_raii __current(uselocale(__l), uselocale);
return mbtowc(__pwc, __pmb, __max); return mbtowc(__pwc, __pmb, __max);
@ -1754,13 +1754,13 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
__nc = asprintf_l(&__nb, 0, __fmt, (int)__iob.precision(), __v); __nc = asprintf_l(&__nb, 0, __fmt, (int)__iob.precision(), __v);
#else #else
__nc = __asprintf_l(&__nb, __cloc(), __fmt, __nc = __asprintf_l(&__nb, __cloc(), __fmt,
(int)__iob.precision()); (int)__iob.precision(), __v);
#endif #endif
else else
#ifdef _LIBCPP_STABLE_APPLE_ABI #ifdef _LIBCPP_STABLE_APPLE_ABI
__nc = asprintf_l(&__nb, 0, __fmt, __v); __nc = asprintf_l(&__nb, 0, __fmt, __v);
#else #else
__nc = __asprintf_l(&__nb, __cloc(), __fmt, (int)__iob.precision()); __nc = __asprintf_l(&__nb, __cloc(), __fmt, (int)__iob.precision(), __v);
#endif #endif
if (__nb == 0) if (__nb == 0)
__throw_bad_alloc(); __throw_bad_alloc();
@ -1823,13 +1823,13 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
__nc = asprintf_l(&__nb, 0, __fmt, (int)__iob.precision(), __v); __nc = asprintf_l(&__nb, 0, __fmt, (int)__iob.precision(), __v);
#else #else
__nc = __asprintf_l(&__nb, __cloc(), __fmt, __nc = __asprintf_l(&__nb, __cloc(), __fmt,
(int)__iob.precision()); (int)__iob.precision(), __v);
#endif #endif
else else
#ifdef _LIBCPP_STABLE_APPLE_ABI #ifdef _LIBCPP_STABLE_APPLE_ABI
__nc = asprintf_l(&__nb, 0, __fmt, __v); __nc = asprintf_l(&__nb, 0, __fmt, __v);
#else #else
__nc = __asprintf_l(&__nb, __cloc(), __fmt, (int)__iob.precision()); __nc = __asprintf_l(&__nb, __cloc(), __fmt, __v);
#endif #endif
if (__nb == 0) if (__nb == 0)
__throw_bad_alloc(); __throw_bad_alloc();

View File

@ -13,16 +13,24 @@
#if __APPLE__ #if __APPLE__
#include <cxxabi.h> #include <cxxabi.h>
using namespace __cxxabiv1; using namespace __cxxabiv1;
using namespace __cxxabiv1::__cxxabiapple;
// On Darwin, there are two STL shared libraries and a lower level ABI // On Darwin, there are two STL shared libraries and a lower level ABI
// shared libray. The globals holding the current terminate handler and // shared libray. The globals holding the current terminate handler and
// current unexpected handler are in the ABI library. // current unexpected handler are in the ABI library.
#define __terminate_handler __cxxabiapple::__cxa_terminate_handler #define __terminate_handler __cxxabiapple::__cxa_terminate_handler
#define __unexpected_handler __cxxabiapple::__cxa_unexpected_handler #define __unexpected_handler __cxxabiapple::__cxa_unexpected_handler
#define HAVE_DEPENDENT_EH_ABI 1
#elif defined(LIBCXXRT)
#include <cxxabi.h>
using namespace __cxxabiv1;
#define HAVE_DEPENDENT_EH_ABI 1
#else // __APPLE__ #else // __APPLE__
static std::terminate_handler __terminate_handler; static std::terminate_handler __terminate_handler;
static std::unexpected_handler __unexpected_handler; static std::unexpected_handler __unexpected_handler;
#endif // __APPLE__ #endif // __APPLE__
#ifndef LIBCXXRT
// libcxxrt provides implementations of these functions itself.
std::unexpected_handler std::unexpected_handler
std::set_unexpected(std::unexpected_handler func) _NOEXCEPT std::set_unexpected(std::unexpected_handler func) _NOEXCEPT
{ {
@ -76,18 +84,19 @@ std::terminate() _NOEXCEPT
} }
#endif // _LIBCPP_NO_EXCEPTIONS #endif // _LIBCPP_NO_EXCEPTIONS
} }
#endif // LIBCXXRT
bool std::uncaught_exception() _NOEXCEPT bool std::uncaught_exception() _NOEXCEPT
{ {
#if __APPLE__ #if __APPLE__
// on Darwin, there is a helper function so __cxa_get_globals is private // on Darwin, there is a helper function so __cxa_get_globals is private
return __cxxabiapple::__cxa_uncaught_exception(); return __cxxabiapple::__cxa_uncaught_exception();
#elif LIBCXXRT
__cxa_eh_globals * globals = __cxa_get_globals();
return (globals->uncaughtExceptions != 0);
#else // __APPLE__ #else // __APPLE__
#warning uncaught_exception not yet implemented #warning uncaught_exception not yet implemented
::abort(); ::abort();
// Not provided by Ubuntu gcc-4.2.4's cxxabi.h.
// __cxa_eh_globals * globals = __cxa_get_globals();
// return (globals->uncaughtExceptions != 0);
#endif // __APPLE__ #endif // __APPLE__
} }
@ -114,8 +123,8 @@ const char* bad_exception::what() const _NOEXCEPT
exception_ptr::~exception_ptr() _NOEXCEPT exception_ptr::~exception_ptr() _NOEXCEPT
{ {
#if __APPLE__ #if HAVE_DEPENDENT_EH_ABI
__cxxabiapple::__cxa_decrement_exception_refcount(__ptr_); __cxa_decrement_exception_refcount(__ptr_);
#else #else
#warning exception_ptr not yet implemented #warning exception_ptr not yet implemented
::abort(); ::abort();
@ -125,8 +134,8 @@ exception_ptr::~exception_ptr() _NOEXCEPT
exception_ptr::exception_ptr(const exception_ptr& other) _NOEXCEPT exception_ptr::exception_ptr(const exception_ptr& other) _NOEXCEPT
: __ptr_(other.__ptr_) : __ptr_(other.__ptr_)
{ {
#if __APPLE__ #if HAVE_DEPENDENT_EH_ABI
__cxxabiapple::__cxa_increment_exception_refcount(__ptr_); __cxa_increment_exception_refcount(__ptr_);
#else #else
#warning exception_ptr not yet implemented #warning exception_ptr not yet implemented
::abort(); ::abort();
@ -135,11 +144,11 @@ exception_ptr::exception_ptr(const exception_ptr& other) _NOEXCEPT
exception_ptr& exception_ptr::operator=(const exception_ptr& other) _NOEXCEPT exception_ptr& exception_ptr::operator=(const exception_ptr& other) _NOEXCEPT
{ {
#if __APPLE__ #if HAVE_DEPENDENT_EH_ABI
if (__ptr_ != other.__ptr_) if (__ptr_ != other.__ptr_)
{ {
__cxxabiapple::__cxa_increment_exception_refcount(other.__ptr_); __cxa_increment_exception_refcount(other.__ptr_);
__cxxabiapple::__cxa_decrement_exception_refcount(__ptr_); __cxa_decrement_exception_refcount(__ptr_);
__ptr_ = other.__ptr_; __ptr_ = other.__ptr_;
} }
return *this; return *this;
@ -171,12 +180,12 @@ nested_exception::rethrow_nested() const
std::exception_ptr std::current_exception() _NOEXCEPT std::exception_ptr std::current_exception() _NOEXCEPT
{ {
#if __APPLE__ #if HAVE_DEPENDENT_EH_ABI
// be nicer if there was a constructor that took a ptr, then // be nicer if there was a constructor that took a ptr, then
// this whole function would be just: // this whole function would be just:
// return exception_ptr(__cxa_current_primary_exception()); // return exception_ptr(__cxa_current_primary_exception());
std::exception_ptr ptr; std::exception_ptr ptr;
ptr.__ptr_ = __cxxabiapple::__cxa_current_primary_exception(); ptr.__ptr_ = __cxa_current_primary_exception();
return ptr; return ptr;
#else // __APPLE__ #else // __APPLE__
#warning exception_ptr not yet implemented #warning exception_ptr not yet implemented
@ -186,8 +195,8 @@ std::exception_ptr std::current_exception() _NOEXCEPT
void std::rethrow_exception(exception_ptr p) void std::rethrow_exception(exception_ptr p)
{ {
#if __APPLE__ #if HAVE_DEPENDENT_EH_ABI
__cxxabiapple::__cxa_rethrow_primary_exception(p.__ptr_); __cxa_rethrow_primary_exception(p.__ptr_);
// if p.__ptr_ is NULL, above returns so we terminate // if p.__ptr_ is NULL, above returns so we terminate
terminate(); terminate();
#else // __APPLE__ #else // __APPLE__

View File

@ -733,7 +733,7 @@ ctype<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high)
wchar_t wchar_t
ctype<wchar_t>::do_toupper(char_type c) const ctype<wchar_t>::do_toupper(char_type c) const
{ {
#ifndef _LIBCPP_STABLE_APPLE_ABI #if !(defined(_LIBCPP_STABLE_APPLE_ABI) || defined(__FreeBSD__))
return isascii(c) ? ctype<char>::__classic_upper_table()[c] : c; return isascii(c) ? ctype<char>::__classic_upper_table()[c] : c;
#else #else
return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c; return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c;
@ -744,7 +744,7 @@ const wchar_t*
ctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const ctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const
{ {
for (; low != high; ++low) for (; low != high; ++low)
#ifndef _LIBCPP_STABLE_APPLE_ABI #if !(defined(_LIBCPP_STABLE_APPLE_ABI) || defined(__FreeBSD__))
*low = isascii(*low) ? ctype<char>::__classic_upper_table()[*low] *low = isascii(*low) ? ctype<char>::__classic_upper_table()[*low]
: *low; : *low;
#else #else
@ -908,11 +908,12 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
const ctype<char>::mask* const ctype<char>::mask*
ctype<char>::classic_table() _NOEXCEPT ctype<char>::classic_table() _NOEXCEPT
{ {
#ifdef __APPLE__ #if defined(__APPLE__) || defined(__FreeBSD__)
return _DefaultRuneLocale.__runetype; return _DefaultRuneLocale.__runetype;
#elif defined(__GLIBC__) #elif defined(__GLIBC__)
return __cloc()->__ctype_b; return __cloc()->__ctype_b;
// This is assumed to be safe. // This is assumed to be safe, which is a nonsense assumption because we're
// going to end up dereferencing it later...
#else #else
return NULL; return NULL;
#endif #endif
@ -922,7 +923,7 @@ ctype<char>::classic_table() _NOEXCEPT
const int* const int*
ctype<char>::__classic_lower_table() _NOEXCEPT ctype<char>::__classic_lower_table() _NOEXCEPT
{ {
#ifdef __APPLE__ #if defined(__APPLE__) || defined(__FreeBSD__)
return _DefaultRuneLocale.__maplower; return _DefaultRuneLocale.__maplower;
#elif defined(__GLIBC__) #elif defined(__GLIBC__)
return __cloc()->__ctype_tolower; return __cloc()->__ctype_tolower;
@ -934,7 +935,7 @@ ctype<char>::__classic_lower_table() _NOEXCEPT
const int* const int*
ctype<char>::__classic_upper_table() _NOEXCEPT ctype<char>::__classic_upper_table() _NOEXCEPT
{ {
#ifdef __APPLE__ #if defined(__APPLE__) || defined(__FreeBSD__)
return _DefaultRuneLocale.__mapupper; return _DefaultRuneLocale.__mapupper;
#elif defined(__GLIBC__) #elif defined(__GLIBC__)
return __cloc()->__ctype_toupper; return __cloc()->__ctype_toupper;
@ -1036,6 +1037,7 @@ ctype_byname<wchar_t>::do_is(mask m, char_type c) const
#ifdef _LIBCPP_WCTYPE_IS_MASK #ifdef _LIBCPP_WCTYPE_IS_MASK
return static_cast<bool>(iswctype_l(c, m, __l)); return static_cast<bool>(iswctype_l(c, m, __l));
#else #else
// FIXME: This is broken for things that test more than one flag.
if (m & space && !iswspace_l(c, __l)) return false; if (m & space && !iswspace_l(c, __l)) return false;
if (m & print && !iswprint_l(c, __l)) return false; if (m & print && !iswprint_l(c, __l)) return false;
if (m & cntrl && !iswcntrl_l(c, __l)) return false; if (m & cntrl && !iswcntrl_l(c, __l)) return false;