diff options
author | David Chisnall <csdavec@swan.ac.uk> | 2011-09-21 08:39:44 +0000 |
---|---|---|
committer | David Chisnall <csdavec@swan.ac.uk> | 2011-09-21 08:39:44 +0000 |
commit | 89728139cbf9a73815aa3720d3bc0b740f1be197 (patch) | |
tree | af1acce734e24bb04b66e16e501a558df95ace8d | |
parent | 30909031a7f766a758b991891bc1678e7da82777 (diff) | |
download | bcm5719-llvm-89728139cbf9a73815aa3720d3bc0b740f1be197.tar.gz bcm5719-llvm-89728139cbf9a73815aa3720d3bc0b740f1be197.zip |
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...
llvm-svn: 140245
-rw-r--r-- | libcxx/CREDITS.TXT | 3 | ||||
-rw-r--r-- | libcxx/include/__config | 4 | ||||
-rw-r--r-- | libcxx/include/__locale | 32 | ||||
-rw-r--r-- | libcxx/include/locale | 12 | ||||
-rw-r--r-- | libcxx/src/exception.cpp | 37 | ||||
-rw-r--r-- | libcxx/src/locale.cpp | 14 |
6 files changed, 58 insertions, 44 deletions
diff --git a/libcxx/CREDITS.TXT b/libcxx/CREDITS.TXT index c64773902cf..619968c42d2 100644 --- a/libcxx/CREDITS.TXT +++ b/libcxx/CREDITS.TXT @@ -21,3 +21,6 @@ N: Bjorn Reese E: breese@users.sourceforge.net D: Initial regex prototype +N: David Chisnall +E: theraven at theravensnest dot org +D: FreeBSD port and libcxxrt support. diff --git a/libcxx/include/__config b/libcxx/include/__config index 3f6bfd454f2..84a7dddee25 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -297,7 +297,7 @@ template <unsigned> struct __static_assert_check {}; #define __has_feature(__x) 0 #endif -#ifdef __APPLE__ +#if __APPLE__ || __FreeBSD__ #define _LIBCPP_LOCALE__L_EXTENSIONS 1 #endif @@ -305,7 +305,7 @@ template <unsigned> struct __static_assert_check {}; #define _LIBCPP_STABLE_APPLE_ABI #endif -#ifdef __APPLE__ +#if __APPLE__ || __FreeBSD__ #define _LIBCPP_WCTYPE_IS_MASK #endif diff --git a/libcxx/include/__locale b/libcxx/include/__locale index 4099aa7e0ff..7ae1a343a84 100644 --- a/libcxx/include/__locale +++ b/libcxx/include/__locale @@ -302,13 +302,24 @@ locale::operator()(const basic_string<_CharT, _Traits, _Allocator>& __x, class _LIBCPP_VISIBLE ctype_base { public: -#ifdef __GLIBC__ +#if __GLIBC__ typedef unsigned short mask; -#else + static const mask space = _ISspace; + static const mask print = _ISprint; + static const mask cntrl = _IScntrl; + static const mask upper = _ISupper; + static const mask lower = _ISlower; + static const mask alpha = _ISalpha; + static const mask digit = _ISdigit; + static const mask punct = _ISpunct; + static const mask xdigit = _ISxdigit; + static const mask blank = _ISblank; +#else // __GLIBC__ +#if __APPLE__ typedef __uint32_t mask; +#elif __FreeBSD__ + typedef unsigned long mask; #endif - -#if __APPLE__ || __FreeBSD__ static const mask space = _CTYPE_S; static const mask print = _CTYPE_R; static const mask cntrl = _CTYPE_C; @@ -319,18 +330,7 @@ public: 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 print = _ISprint; - static const mask cntrl = _IScntrl; - static const mask upper = _ISupper; - static const mask lower = _ISlower; - static const mask alpha = _ISalpha; - static const mask digit = _ISdigit; - static const mask punct = _ISpunct; - static const mask xdigit = _ISxdigit; - static const mask blank = _ISblank; -#endif // __APPLE__ +#endif // __GLIBC__ static const mask alnum = alpha | digit; static const mask graph = alnum | punct; diff --git a/libcxx/include/locale b/libcxx/include/locale index 0e3a35d15d7..e40a04ce154 100644 --- a/libcxx/include/locale +++ b/libcxx/include/locale @@ -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) { #ifdef _LIBCPP_LOCALE__L_EXTENSIONS - return mbsnrtowcs_l(__dest, __src, __nms__len, __ps, __l); + return mbsnrtowcs_l(__dest, __src, __nms, __len, __ps, __l); #else __locale_raii __current(uselocale(__l), uselocale); 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) { #ifdef _LIBCPP_LOCALE__L_EXTENSIONS - return mbtowc(__pwc, __pmb, __max, __l); + return mbtowc_l(__pwc, __pmb, __max, __l); #else __locale_raii __current(uselocale(__l), uselocale); 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); #else __nc = __asprintf_l(&__nb, __cloc(), __fmt, - (int)__iob.precision()); + (int)__iob.precision(), __v); #endif else #ifdef _LIBCPP_STABLE_APPLE_ABI __nc = asprintf_l(&__nb, 0, __fmt, __v); #else - __nc = __asprintf_l(&__nb, __cloc(), __fmt, (int)__iob.precision()); + __nc = __asprintf_l(&__nb, __cloc(), __fmt, (int)__iob.precision(), __v); #endif if (__nb == 0) __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); #else __nc = __asprintf_l(&__nb, __cloc(), __fmt, - (int)__iob.precision()); + (int)__iob.precision(), __v); #endif else #ifdef _LIBCPP_STABLE_APPLE_ABI __nc = asprintf_l(&__nb, 0, __fmt, __v); #else - __nc = __asprintf_l(&__nb, __cloc(), __fmt, (int)__iob.precision()); + __nc = __asprintf_l(&__nb, __cloc(), __fmt, __v); #endif if (__nb == 0) __throw_bad_alloc(); diff --git a/libcxx/src/exception.cpp b/libcxx/src/exception.cpp index 28d87b34050..9a80d3e92ef 100644 --- a/libcxx/src/exception.cpp +++ b/libcxx/src/exception.cpp @@ -13,16 +13,24 @@ #if __APPLE__ #include <cxxabi.h> using namespace __cxxabiv1; + using namespace __cxxabiv1::__cxxabiapple; // On Darwin, there are two STL shared libraries and a lower level ABI // shared libray. The globals holding the current terminate handler and // current unexpected handler are in the ABI library. #define __terminate_handler __cxxabiapple::__cxa_terminate_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__ static std::terminate_handler __terminate_handler; static std::unexpected_handler __unexpected_handler; #endif // __APPLE__ +#ifndef LIBCXXRT +// libcxxrt provides implementations of these functions itself. std::unexpected_handler std::set_unexpected(std::unexpected_handler func) _NOEXCEPT { @@ -76,18 +84,19 @@ std::terminate() _NOEXCEPT } #endif // _LIBCPP_NO_EXCEPTIONS } +#endif // LIBCXXRT bool std::uncaught_exception() _NOEXCEPT { #if __APPLE__ // on Darwin, there is a helper function so __cxa_get_globals is private return __cxxabiapple::__cxa_uncaught_exception(); +#elif LIBCXXRT + __cxa_eh_globals * globals = __cxa_get_globals(); + return (globals->uncaughtExceptions != 0); #else // __APPLE__ #warning uncaught_exception not yet implemented ::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__ } @@ -114,8 +123,8 @@ const char* bad_exception::what() const _NOEXCEPT exception_ptr::~exception_ptr() _NOEXCEPT { -#if __APPLE__ - __cxxabiapple::__cxa_decrement_exception_refcount(__ptr_); +#if HAVE_DEPENDENT_EH_ABI + __cxa_decrement_exception_refcount(__ptr_); #else #warning exception_ptr not yet implemented ::abort(); @@ -125,8 +134,8 @@ exception_ptr::~exception_ptr() _NOEXCEPT exception_ptr::exception_ptr(const exception_ptr& other) _NOEXCEPT : __ptr_(other.__ptr_) { -#if __APPLE__ - __cxxabiapple::__cxa_increment_exception_refcount(__ptr_); +#if HAVE_DEPENDENT_EH_ABI + __cxa_increment_exception_refcount(__ptr_); #else #warning exception_ptr not yet implemented ::abort(); @@ -135,11 +144,11 @@ exception_ptr::exception_ptr(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_) { - __cxxabiapple::__cxa_increment_exception_refcount(other.__ptr_); - __cxxabiapple::__cxa_decrement_exception_refcount(__ptr_); + __cxa_increment_exception_refcount(other.__ptr_); + __cxa_decrement_exception_refcount(__ptr_); __ptr_ = other.__ptr_; } return *this; @@ -171,12 +180,12 @@ nested_exception::rethrow_nested() const 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 // this whole function would be just: // return exception_ptr(__cxa_current_primary_exception()); std::exception_ptr ptr; - ptr.__ptr_ = __cxxabiapple::__cxa_current_primary_exception(); + ptr.__ptr_ = __cxa_current_primary_exception(); return ptr; #else // __APPLE__ #warning exception_ptr not yet implemented @@ -186,8 +195,8 @@ std::exception_ptr std::current_exception() _NOEXCEPT void std::rethrow_exception(exception_ptr p) { -#if __APPLE__ - __cxxabiapple::__cxa_rethrow_primary_exception(p.__ptr_); +#if HAVE_DEPENDENT_EH_ABI + __cxa_rethrow_primary_exception(p.__ptr_); // if p.__ptr_ is NULL, above returns so we terminate terminate(); #else // __APPLE__ diff --git a/libcxx/src/locale.cpp b/libcxx/src/locale.cpp index a9fccec84c0..8f1e4e1322b 100644 --- a/libcxx/src/locale.cpp +++ b/libcxx/src/locale.cpp @@ -733,7 +733,7 @@ ctype<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high) wchar_t 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; #else 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 { 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; #else @@ -908,11 +908,12 @@ ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault, const ctype<char>::mask* ctype<char>::classic_table() _NOEXCEPT { -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__FreeBSD__) return _DefaultRuneLocale.__runetype; #elif defined(__GLIBC__) 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 return NULL; #endif @@ -922,7 +923,7 @@ ctype<char>::classic_table() _NOEXCEPT const int* ctype<char>::__classic_lower_table() _NOEXCEPT { -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__FreeBSD__) return _DefaultRuneLocale.__maplower; #elif defined(__GLIBC__) return __cloc()->__ctype_tolower; @@ -934,7 +935,7 @@ ctype<char>::__classic_lower_table() _NOEXCEPT const int* ctype<char>::__classic_upper_table() _NOEXCEPT { -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__FreeBSD__) return _DefaultRuneLocale.__mapupper; #elif defined(__GLIBC__) 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 return static_cast<bool>(iswctype_l(c, m, __l)); #else + // FIXME: This is broken for things that test more than one flag. if (m & space && !iswspace_l(c, __l)) return false; if (m & print && !iswprint_l(c, __l)) return false; if (m & cntrl && !iswcntrl_l(c, __l)) return false; |