diff options
Diffstat (limited to 'system/lib/libcxx')
-rw-r--r-- | system/lib/libcxx/CREDITS.TXT | 24 | ||||
-rw-r--r-- | system/lib/libcxx/debug.cpp | 20 | ||||
-rw-r--r-- | system/lib/libcxx/exception.cpp | 9 | ||||
-rw-r--r-- | system/lib/libcxx/hash.cpp | 6 | ||||
-rw-r--r-- | system/lib/libcxx/iostream.cpp | 8 | ||||
-rw-r--r-- | system/lib/libcxx/locale.cpp | 133 | ||||
-rw-r--r-- | system/lib/libcxx/readme.txt | 2 | ||||
-rw-r--r-- | system/lib/libcxx/stdexcept.cpp | 2 | ||||
-rw-r--r-- | system/lib/libcxx/string.cpp | 823 | ||||
-rw-r--r-- | system/lib/libcxx/support/win32/locale_win32.cpp | 6 | ||||
-rw-r--r-- | system/lib/libcxx/support/win32/support.cpp | 181 | ||||
-rw-r--r-- | system/lib/libcxx/symbols | 265 | ||||
-rw-r--r-- | system/lib/libcxx/system_error.cpp | 3 | ||||
-rw-r--r-- | system/lib/libcxx/thread.cpp | 19 | ||||
-rw-r--r-- | system/lib/libcxx/typeinfo.cpp | 14 |
15 files changed, 663 insertions, 852 deletions
diff --git a/system/lib/libcxx/CREDITS.TXT b/system/lib/libcxx/CREDITS.TXT index 52948510..5e4d14ec 100644 --- a/system/lib/libcxx/CREDITS.TXT +++ b/system/lib/libcxx/CREDITS.TXT @@ -33,6 +33,14 @@ E: mclow.lists@gmail.com E: marshall@idio.com D: Minor patches and bug fixes. +N: Bill Fisher +E: william.w.fisher@gmail.com +D: Regex bug fixes. + +N: Matthew Dempsky +E: matthew@dempsky.org +D: Minor patches and bug fixes. + N: Google Inc. D: Copyright owner and contributor of the CityHash algorithm @@ -48,6 +56,10 @@ N: Argyrios Kyrtzidis E: kyrtzidis@apple.com D: Bug fixes. +N: Bruce Mitchener, Jr. +E: bruce.mitchener@gmail.com +D: Emscripten-related changes. + N: Michel Morin E: mimomorin@gmail.com D: Minor patches to is_convertible. @@ -74,6 +86,14 @@ D: Implemented Cityhash as the string hash function on 64-bit machines N: Richard Smith D: Minor patches. +N: Joerg Sonnenberger +E: joerg@NetBSD.org +D: NetBSD port. + +N: Stephan Tolksdorf +E: st@quanttec.com +D: Minor <atomic> fix + N: Michael van der Westhuizen E: r1mikey at gmail dot com @@ -85,6 +105,10 @@ N: Zhang Xiongpang E: zhangxiongpang@gmail.com D: Minor patches and bug fixes. +N: Zhihao Yuan +E: lichray@gmail.com +D: Standard compatibility fixes. + N: Jeffrey Yasskin E: jyasskin@gmail.com E: jyasskin@google.com diff --git a/system/lib/libcxx/debug.cpp b/system/lib/libcxx/debug.cpp index 2d4b094b..c9b09b7a 100644 --- a/system/lib/libcxx/debug.cpp +++ b/system/lib/libcxx/debug.cpp @@ -110,8 +110,7 @@ __libcpp_db::__find_c_from_i(void* __i) const { RLock _(mut()); __i_node* i = __find_iterator(__i); - _LIBCPP_ASSERT(i != nullptr, "iterator constructed in translation unit with debug mode not enabled." - " #define _LIBCPP_DEBUG2 1 for that translation unit."); + _LIBCPP_ASSERT(i != nullptr, "iterator not found in debug database."); return i->__c_ != nullptr ? i->__c_->__c_ : nullptr; } @@ -144,7 +143,7 @@ __libcpp_db::__insert_c(void* __c) if (__csz_ + 1 > static_cast<size_t>(__cend_ - __cbeg_)) { size_t nc = __next_prime(2*static_cast<size_t>(__cend_ - __cbeg_) + 1); - __c_node** cbeg = (__c_node**)calloc(nc, sizeof(void*)); + __c_node** cbeg = static_cast<__c_node**>(calloc(nc, sizeof(void*))); if (cbeg == nullptr) #ifndef _LIBCPP_NO_EXCEPTIONS throw bad_alloc(); @@ -169,7 +168,8 @@ __libcpp_db::__insert_c(void* __c) } size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); __c_node* p = __cbeg_[hc]; - __c_node* r = __cbeg_[hc] = (__c_node*)malloc(sizeof(__c_node)); + __c_node* r = __cbeg_[hc] = + static_cast<__c_node*>(malloc(sizeof(__c_node))); if (__cbeg_[hc] == nullptr) #ifndef _LIBCPP_NO_EXCEPTIONS throw bad_alloc(); @@ -302,7 +302,7 @@ __libcpp_db::__iterator_copy(void* __i, const void* __i0) __i_node* i = __find_iterator(__i); __i_node* i0 = __find_iterator(__i0); __c_node* c0 = i0 != nullptr ? i0->__c_ : nullptr; - if (i == nullptr && c0 != nullptr) + if (i == nullptr && i0 != nullptr) i = __insert_iterator(__i); __c_node* c = i != nullptr ? i->__c_ : nullptr; if (c != c0) @@ -354,7 +354,7 @@ __libcpp_db::__subscriptable(const void* __i, ptrdiff_t __n) const } bool -__libcpp_db::__comparable(const void* __i, const void* __j) const +__libcpp_db::__less_than_comparable(const void* __i, const void* __j) const { RLock _(mut()); __i_node* i = __find_iterator(__i); @@ -408,7 +408,8 @@ __c_node::__add(__i_node* i) size_t nc = 2*static_cast<size_t>(cap_ - beg_); if (nc == 0) nc = 1; - __i_node** beg = (__i_node**)malloc(nc * sizeof(__i_node*)); + __i_node** beg = + static_cast<__i_node**>(malloc(nc * sizeof(__i_node*))); if (beg == nullptr) #ifndef _LIBCPP_NO_EXCEPTIONS throw bad_alloc(); @@ -434,7 +435,7 @@ __libcpp_db::__insert_iterator(void* __i) if (__isz_ + 1 > static_cast<size_t>(__iend_ - __ibeg_)) { size_t nc = __next_prime(2*static_cast<size_t>(__iend_ - __ibeg_) + 1); - __i_node** ibeg = (__i_node**)calloc(nc, sizeof(void*)); + __i_node** ibeg = static_cast<__i_node**>(calloc(nc, sizeof(void*))); if (ibeg == nullptr) #ifndef _LIBCPP_NO_EXCEPTIONS throw bad_alloc(); @@ -459,7 +460,8 @@ __libcpp_db::__insert_iterator(void* __i) } size_t hi = hash<void*>()(__i) % static_cast<size_t>(__iend_ - __ibeg_); __i_node* p = __ibeg_[hi]; - __i_node* r = __ibeg_[hi] = (__i_node*)malloc(sizeof(__i_node)); + __i_node* r = __ibeg_[hi] = + static_cast<__i_node*>(malloc(sizeof(__i_node))); if (r == nullptr) #ifndef _LIBCPP_NO_EXCEPTIONS throw bad_alloc(); diff --git a/system/lib/libcxx/exception.cpp b/system/lib/libcxx/exception.cpp index 1d2f6b25..d3e1b292 100644 --- a/system/lib/libcxx/exception.cpp +++ b/system/lib/libcxx/exception.cpp @@ -7,6 +7,7 @@ // //===----------------------------------------------------------------------===// #include <stdlib.h> +#include <stdio.h> #include "exception" @@ -88,12 +89,14 @@ terminate() _NOEXCEPT #endif // _LIBCPP_NO_EXCEPTIONS (*get_terminate())(); // handler should not return + printf("terminate_handler unexpectedly returned\n"); ::abort (); #ifndef _LIBCPP_NO_EXCEPTIONS } catch (...) { // handler should not throw exception + printf("terminate_handler unexpectedly threw an exception\n"); ::abort (); } #endif // _LIBCPP_NO_EXCEPTIONS @@ -109,6 +112,7 @@ bool uncaught_exception() _NOEXCEPT return __cxa_uncaught_exception(); #else // __APPLE__ #warning uncaught_exception not yet implemented + printf("uncaught_exception not yet implemented\n"); ::abort(); #endif // __APPLE__ } @@ -146,6 +150,7 @@ exception_ptr::~exception_ptr() _NOEXCEPT __cxa_decrement_exception_refcount(__ptr_); #else #warning exception_ptr not yet implemented + printf("exception_ptr not yet implemented\n"); ::abort(); #endif // __APPLE__ } @@ -157,6 +162,7 @@ exception_ptr::exception_ptr(const exception_ptr& other) _NOEXCEPT __cxa_increment_exception_refcount(__ptr_); #else #warning exception_ptr not yet implemented + printf("exception_ptr not yet implemented\n"); ::abort(); #endif // __APPLE__ } @@ -173,6 +179,7 @@ exception_ptr& exception_ptr::operator=(const exception_ptr& other) _NOEXCEPT return *this; #else // __APPLE__ #warning exception_ptr not yet implemented + printf("exception_ptr not yet implemented\n"); ::abort(); #endif // __APPLE__ } @@ -207,6 +214,7 @@ exception_ptr current_exception() _NOEXCEPT return ptr; #else // __APPLE__ #warning exception_ptr not yet implemented + printf("exception_ptr not yet implemented\n"); ::abort(); #endif // __APPLE__ } @@ -220,6 +228,7 @@ void rethrow_exception(exception_ptr p) terminate(); #else // __APPLE__ #warning exception_ptr not yet implemented + printf("exception_ptr not yet implemented\n"); ::abort(); #endif // __APPLE__ } diff --git a/system/lib/libcxx/hash.cpp b/system/lib/libcxx/hash.cpp index a0135002..388ab2eb 100644 --- a/system/lib/libcxx/hash.cpp +++ b/system/lib/libcxx/hash.cpp @@ -12,7 +12,9 @@ #include "stdexcept" #include "type_traits" +#ifdef __clang__ #pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare" +#endif _LIBCPP_BEGIN_NAMESPACE_STD @@ -155,6 +157,8 @@ __check_for_overflow(size_t N) #ifndef _LIBCPP_NO_EXCEPTIONS if (N > 0xFFFFFFFB) throw overflow_error("__next_prime overflow"); +#else + (void)N; #endif } @@ -166,6 +170,8 @@ __check_for_overflow(size_t N) #ifndef _LIBCPP_NO_EXCEPTIONS if (N > 0xFFFFFFFFFFFFFFC5ull) throw overflow_error("__next_prime overflow"); +#else + (void)N; #endif } diff --git a/system/lib/libcxx/iostream.cpp b/system/lib/libcxx/iostream.cpp index 7fc71df4..f413681f 100644 --- a/system/lib/libcxx/iostream.cpp +++ b/system/lib/libcxx/iostream.cpp @@ -54,13 +54,13 @@ ios_base::Init::Init() ios_base::Init::~Init() { - ostream* cout_ptr = (ostream*)cout; - ostream* clog_ptr = (ostream*)clog; + ostream* cout_ptr = reinterpret_cast<ostream*>(cout); + ostream* clog_ptr = reinterpret_cast<ostream*>(clog); cout_ptr->flush(); clog_ptr->flush(); - wostream* wcout_ptr = (wostream*)wcout; - wostream* wclog_ptr = (wostream*)wclog; + wostream* wcout_ptr = reinterpret_cast<wostream*>(wcout); + wostream* wclog_ptr = reinterpret_cast<wostream*>(wclog); wcout_ptr->flush(); wclog_ptr->flush(); } diff --git a/system/lib/libcxx/locale.cpp b/system/lib/libcxx/locale.cpp index d9bc6f9a..d95d0c9c 100644 --- a/system/lib/libcxx/locale.cpp +++ b/system/lib/libcxx/locale.cpp @@ -18,19 +18,21 @@ #include "codecvt" #include "vector" #include "algorithm" -#include "algorithm" #include "typeinfo" -#include "type_traits" +#ifndef _LIBCPP_NO_EXCEPTIONS +# include "type_traits" +#endif #include "clocale" #include "cstring" #include "cwctype" #include "__sso_allocator" -#ifdef _WIN32 +#ifdef _LIBCPP_MSVCRT #include <support/win32/locale_win32.h> -#else // _WIN32 +#else // _LIBCPP_MSVCRT #include <langinfo.h> -#endif // _!WIN32 +#endif // !_LIBCPP_MSVCRT #include <stdlib.h> +#include <stdio.h> // On Linux, wint_t and wchar_t have different signed-ness, and this causes // lots of noise in the build log, but no bugs that I know of. @@ -230,8 +232,10 @@ locale::__imp::__imp(const string& name, size_t refs) // NOTE avoid the `base class should be explicitly initialized in the // copy constructor` warning emitted by GCC +#if defined(__clang__) || _GNUC_VER >= 406 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wextra" +#endif locale::__imp::__imp(const __imp& other) : facets_(max<size_t>(N, other.facets_.size())), @@ -243,7 +247,9 @@ locale::__imp::__imp(const __imp& other) facets_[i]->__add_shared(); } +#if defined(__clang__) || _GNUC_VER >= 406 #pragma GCC diagnostic pop +#endif locale::__imp::__imp(const __imp& other, const string& name, locale::category c) : facets_(N), @@ -786,7 +792,7 @@ ctype<wchar_t>::do_toupper(char_type c) const { #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c; -#elif defined(__GLIBC__) || defined(EMSCRIPTEN) +#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__) return isascii(c) ? ctype<char>::__classic_upper_table()[c] : c; #else return (isascii(c) && iswlower_l(c, __cloc())) ? c-L'a'+L'A' : c; @@ -799,7 +805,7 @@ ctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const for (; low != high; ++low) #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low; -#elif defined(__GLIBC__) || defined(EMSCRIPTEN) +#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__) *low = isascii(*low) ? ctype<char>::__classic_upper_table()[*low] : *low; #else @@ -813,7 +819,7 @@ ctype<wchar_t>::do_tolower(char_type c) const { #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c; -#elif defined(__GLIBC__) || defined(EMSCRIPTEN) +#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__) return isascii(c) ? ctype<char>::__classic_lower_table()[c] : c; #else return (isascii(c) && isupper_l(c, __cloc())) ? c-L'A'+'a' : c; @@ -826,7 +832,7 @@ ctype<wchar_t>::do_tolower(char_type* low, const char_type* high) const for (; low != high; ++low) #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low; -#elif defined(__GLIBC__) || defined(EMSCRIPTEN) +#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__) *low = isascii(*low) ? ctype<char>::__classic_lower_table()[*low] : *low; #else @@ -893,9 +899,11 @@ ctype<char>::do_toupper(char_type c) const #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE return isascii(c) ? static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(c)]) : c; +#elif defined(__NetBSD__) + return static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(c)]); #elif defined(__GLIBC__) || defined(EMSCRIPTEN) return isascii(c) ? - static_cast<char>(__classic_upper_table()[static_cast<size_t>(c)]) : c; + static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(c)]) : c; #else return (isascii(c) && islower_l(c, __cloc())) ? c-'a'+'A' : c; #endif @@ -908,6 +916,8 @@ ctype<char>::do_toupper(char_type* low, const char_type* high) const #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE *low = isascii(*low) ? static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(*low)]) : *low; +#elif defined(__NetBSD__) + *low = static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(*low)]); #elif defined(__GLIBC__) || defined(EMSCRIPTEN) *low = isascii(*low) ? static_cast<char>(__classic_upper_table()[static_cast<size_t>(*low)]) : *low; @@ -923,7 +933,9 @@ ctype<char>::do_tolower(char_type c) const #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE return isascii(c) ? static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(c)]) : c; -#elif defined(__GLIBC__) || defined(EMSCRIPTEN) +#elif defined(__NetBSD__) + return static_cast<char>(__classic_lower_table()[static_cast<unsigned char>(c)]); +#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__) return isascii(c) ? static_cast<char>(__classic_lower_table()[static_cast<size_t>(c)]) : c; #else @@ -937,6 +949,8 @@ ctype<char>::do_tolower(char_type* low, const char_type* high) const for (; low != high; ++low) #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE *low = isascii(*low) ? static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(*low)]) : *low; +#elif defined(__NetBSD__) + *low = static_cast<char>(__classic_lower_table()[static_cast<unsigned char>(*low)]); #elif defined(__GLIBC__) || defined(EMSCRIPTEN) *low = isascii(*low) ? static_cast<char>(__classic_lower_table()[static_cast<size_t>(*low)]) : *low; #else @@ -989,11 +1003,13 @@ ctype<char>::classic_table() _NOEXCEPT { #if defined(__APPLE__) || defined(__FreeBSD__) return _DefaultRuneLocale.__runetype; +#elif defined(__NetBSD__) + return _C_ctype_tab_ + 1; #elif defined(__GLIBC__) return __cloc()->__ctype_b; #elif __sun__ return __ctype_mask; -#elif defined(_WIN32) +#elif defined(_LIBCPP_MSVCRT) return _ctype+1; // internal ctype mask table defined in msvcrt.dll // This is assumed to be safe, which is a nonsense assumption because we're // going to end up dereferencing it later... @@ -1003,6 +1019,7 @@ ctype<char>::classic_table() _NOEXCEPT // Platform not supported: abort so the person doing the port knows what to // fix # warning ctype<char>::classic_table() is not implemented + printf("ctype<char>::classic_table() is not implemented\n"); abort(); return NULL; #endif @@ -1020,9 +1037,20 @@ ctype<char>::__classic_upper_table() _NOEXCEPT { return __cloc()->__ctype_toupper; } -#endif // __GLIBC__ +#elif __NetBSD__ +const short* +ctype<char>::__classic_lower_table() _NOEXCEPT +{ + return _C_tolower_tab_ + 1; +} -#if defined(EMSCRIPTEN) +const short* +ctype<char>::__classic_upper_table() _NOEXCEPT +{ + return _C_toupper_tab_ + 1; +} + +#elif defined(EMSCRIPTEN) const int* ctype<char>::__classic_lower_table() _NOEXCEPT { @@ -1034,7 +1062,7 @@ ctype<char>::__classic_upper_table() _NOEXCEPT { return *__ctype_toupper_loc(); } -#endif // EMSCRIPTEN +#endif // __GLIBC__ || EMSCRIPTEN || __NETBSD__ // template <> class ctype_byname<char> @@ -1068,28 +1096,28 @@ ctype_byname<char>::~ctype_byname() char ctype_byname<char>::do_toupper(char_type c) const { - return static_cast<char>(toupper_l(c, __l)); + return static_cast<char>(toupper_l(static_cast<unsigned char>(c), __l)); } const char* ctype_byname<char>::do_toupper(char_type* low, const char_type* high) const { for (; low != high; ++low) - *low = static_cast<char>(toupper_l(*low, __l)); + *low = static_cast<char>(toupper_l(static_cast<unsigned char>(*low), __l)); return low; } char ctype_byname<char>::do_tolower(char_type c) const { - return static_cast<char>(tolower_l(c, __l)); + return static_cast<char>(tolower_l(static_cast<unsigned char>(c), __l)); } const char* ctype_byname<char>::do_tolower(char_type* low, const char_type* high) const { for (; low != high; ++low) - *low = static_cast<char>(tolower_l(*low, __l)); + *low = static_cast<char>(tolower_l(static_cast<unsigned char>(*low), __l)); return low; } @@ -1372,7 +1400,7 @@ locale::id codecvt<wchar_t, char, mbstate_t>::id; codecvt<wchar_t, char, mbstate_t>::codecvt(size_t refs) : locale::facet(refs), - __l(0) + __l(_LIBCPP_GET_C_LOCALE) { } @@ -1389,7 +1417,7 @@ codecvt<wchar_t, char, mbstate_t>::codecvt(const char* nm, size_t refs) codecvt<wchar_t, char, mbstate_t>::~codecvt() { - if (__l != 0) + if (__l != _LIBCPP_GET_C_LOCALE) freelocale(__l); } @@ -1407,7 +1435,7 @@ codecvt<wchar_t, char, mbstate_t>::do_out(state_type& st, to_nxt = to; for (frm_nxt = frm; frm != frm_end && to != to_end; frm = frm_nxt, to = to_nxt) { - // save state in case needed to reover to_nxt on error + // save state in case it is needed to recover to_nxt on error mbstate_t save_state = st; #ifdef _LIBCPP_LOCALE__L_EXTENSIONS size_t n = wcsnrtombs_l(to, &frm_nxt, static_cast<size_t>(fend-frm), @@ -1476,7 +1504,7 @@ codecvt<wchar_t, char, mbstate_t>::do_in(state_type& st, to_nxt = to; for (frm_nxt = frm; frm != frm_end && to != to_end; frm = frm_nxt, to = to_nxt) { - // save state in case needed to reover to_nxt on error + // save state in case it is needed to recover to_nxt on error mbstate_t save_state = st; #ifdef _LIBCPP_LOCALE__L_EXTENSIONS size_t n = mbsnrtowcs_l(to, &frm_nxt, static_cast<size_t>(fend-frm), @@ -3176,14 +3204,25 @@ __codecvt_utf8<wchar_t>::do_out(state_type&, const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, extern_type* to, extern_type* to_end, extern_type*& to_nxt) const { +#if _WIN32 + const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm); + const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end); + const uint16_t* _frm_nxt = _frm; +#else const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm); const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end); const uint32_t* _frm_nxt = _frm; +#endif uint8_t* _to = reinterpret_cast<uint8_t*>(to); uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); uint8_t* _to_nxt = _to; +#if _WIN32 + result r = ucs2_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); +#else result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, _Maxcode_, _Mode_); +#endif frm_nxt = frm + (_frm_nxt - _frm); to_nxt = to + (_to_nxt - _to); return r; @@ -3197,11 +3236,19 @@ __codecvt_utf8<wchar_t>::do_in(state_type&, const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); const uint8_t* _frm_nxt = _frm; +#if _WIN32 + uint16_t* _to = reinterpret_cast<uint16_t*>(to); + uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end); + uint16_t* _to_nxt = _to; + result r = utf8_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); +#else uint32_t* _to = reinterpret_cast<uint32_t*>(to); uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end); uint32_t* _to_nxt = _to; result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, _Maxcode_, _Mode_); +#endif frm_nxt = frm + (_frm_nxt - _frm); to_nxt = to + (_to_nxt - _to); return r; @@ -5315,7 +5362,7 @@ __time_put::__time_put(const string& nm) __time_put::~__time_put() { - if (__loc_) + if (__loc_ != _LIBCPP_GET_C_LOCALE) freelocale(__loc_); } @@ -5801,19 +5848,19 @@ moneypunct_byname<char, true>::init(const char* nm) __frac_digits_ = lc->int_frac_digits; else __frac_digits_ = base::do_frac_digits(); -#ifdef _WIN32 +#ifdef _LIBCPP_MSVCRT if (lc->p_sign_posn == 0) -#else // _WIN32 +#else // _LIBCPP_MSVCRT if (lc->int_p_sign_posn == 0) -#endif //_WIN32 +#endif // !_LIBCPP_MSVCRT __positive_sign_ = "()"; else __positive_sign_ = lc->positive_sign; -#ifdef _WIN32 +#ifdef _LIBCPP_MSVCRT if(lc->n_sign_posn == 0) -#else // _WIN32 +#else // _LIBCPP_MSVCRT if (lc->int_n_sign_posn == 0) -#endif // _WIN32 +#endif // !_LIBCPP_MSVCRT __negative_sign_ = "()"; else __negative_sign_ = lc->negative_sign; @@ -5821,19 +5868,19 @@ moneypunct_byname<char, true>::init(const char* nm) // the same places in curr_symbol since there's no way to // represent anything else. string_type __dummy_curr_symbol = __curr_symbol_; -#ifdef _WIN32 +#ifdef _LIBCPP_MSVCRT __init_pat(__pos_format_, __dummy_curr_symbol, true, lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, ' '); __init_pat(__neg_format_, __curr_symbol_, true, lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, ' '); -#else +#else // _LIBCPP_MSVCRT __init_pat(__pos_format_, __dummy_curr_symbol, true, lc->int_p_cs_precedes, lc->int_p_sep_by_space, lc->int_p_sign_posn, ' '); __init_pat(__neg_format_, __curr_symbol_, true, lc->int_n_cs_precedes, lc->int_n_sep_by_space, lc->int_n_sign_posn, ' '); -#endif // _WIN32 +#endif // !_LIBCPP_MSVCRT } template<> @@ -5960,11 +6007,11 @@ moneypunct_byname<wchar_t, true>::init(const char* nm) __frac_digits_ = lc->int_frac_digits; else __frac_digits_ = base::do_frac_digits(); -#ifdef _WIN32 +#ifdef _LIBCPP_MSVCRT if (lc->p_sign_posn == 0) -#else // _WIN32 +#else // _LIBCPP_MSVCRT if (lc->int_p_sign_posn == 0) -#endif // _WIN32 +#endif // !_LIBCPP_MSVCRT __positive_sign_ = L"()"; else { @@ -5980,11 +6027,11 @@ moneypunct_byname<wchar_t, true>::init(const char* nm) wbe = wbuf + j; __positive_sign_.assign(wbuf, wbe); } -#ifdef _WIN32 +#ifdef _LIBCPP_MSVCRT if (lc->n_sign_posn == 0) -#else // _WIN32 +#else // _LIBCPP_MSVCRT if (lc->int_n_sign_posn == 0) -#endif // _WIN32 +#endif // !_LIBCPP_MSVCRT __negative_sign_ = L"()"; else { @@ -6004,19 +6051,19 @@ moneypunct_byname<wchar_t, true>::init(const char* nm) // the same places in curr_symbol since there's no way to // represent anything else. string_type __dummy_curr_symbol = __curr_symbol_; -#ifdef _WIN32 +#ifdef _LIBCPP_MSVCRT __init_pat(__pos_format_, __dummy_curr_symbol, true, lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, L' '); __init_pat(__neg_format_, __curr_symbol_, true, lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, L' '); -#else // _WIN32 +#else // _LIBCPP_MSVCRT __init_pat(__pos_format_, __dummy_curr_symbol, true, lc->int_p_cs_precedes, lc->int_p_sep_by_space, lc->int_p_sign_posn, L' '); __init_pat(__neg_format_, __curr_symbol_, true, lc->int_n_cs_precedes, lc->int_n_sep_by_space, lc->int_n_sign_posn, L' '); -#endif // _WIN32 +#endif // !_LIBCPP_MSVCRT } void __do_nothing(void*) {} @@ -6025,6 +6072,8 @@ void __throw_runtime_error(const char* msg) { #ifndef _LIBCPP_NO_EXCEPTIONS throw runtime_error(msg); +#else + (void)msg; #endif } diff --git a/system/lib/libcxx/readme.txt b/system/lib/libcxx/readme.txt index 97d8db86..7687e5b2 100644 --- a/system/lib/libcxx/readme.txt +++ b/system/lib/libcxx/readme.txt @@ -1 +1 @@ -These files are from libc++, svn revision 178253, Mar 29 2013 +These files are from libc++, svn revision 187959, 2013-08-08. diff --git a/system/lib/libcxx/stdexcept.cpp b/system/lib/libcxx/stdexcept.cpp index 0c4e8323..8d25f3ee 100644 --- a/system/lib/libcxx/stdexcept.cpp +++ b/system/lib/libcxx/stdexcept.cpp @@ -61,7 +61,7 @@ __libcpp_nmstr::__libcpp_nmstr(const char* msg) c[0] = c[1] = len; str_ += offset; count() = 0; - std::strcpy(const_cast<char*>(c_str()), msg); + std::memcpy(const_cast<char*>(c_str()), msg, len + 1); } inline diff --git a/system/lib/libcxx/string.cpp b/system/lib/libcxx/string.cpp index c71af4fe..5a869116 100644 --- a/system/lib/libcxx/string.cpp +++ b/system/lib/libcxx/string.cpp @@ -11,9 +11,12 @@ #include "cstdlib" #include "cwchar" #include "cerrno" -#ifdef _WIN32 +#include "limits" +#include "stdexcept" +#ifdef _LIBCPP_MSVCRT #include "support/win32/support.h" -#endif // _WIN32 +#endif // _LIBCPP_MSVCRT +#include <stdio.h> _LIBCPP_BEGIN_NAMESPACE_STD @@ -26,662 +29,500 @@ template string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&); -int -stoi(const string& str, size_t* idx, int base) +namespace +{ + +template<typename T> +inline +void throw_helper( const string& msg ) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw T( msg ); +#else + printf("%s\n", msg.c_str()); + abort(); +#endif +} + +inline +void throw_from_string_out_of_range( const string& func ) +{ + throw_helper<out_of_range>(func + ": out of range"); +} + +inline +void throw_from_string_invalid_arg( const string& func ) +{ + throw_helper<invalid_argument>(func + ": no conversion"); +} + +// as_integer + +template<typename V, typename S, typename F> +inline +V +as_integer_helper(const string& func, const S& str, size_t* idx, int base, F f) { - char* ptr; - const char* const p = str.c_str(); + typename S::value_type* ptr; + const typename S::value_type* const p = str.c_str(); typename remove_reference<decltype(errno)>::type errno_save = errno; errno = 0; - long r = strtol(p, &ptr, base); + V r = f(p, &ptr, base); swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE || r < numeric_limits<int>::min() || - numeric_limits<int>::max() < r) - throw out_of_range("stoi: out of range"); + if (errno_save == ERANGE) + throw_from_string_out_of_range(func); if (ptr == p) - throw invalid_argument("stoi: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS + throw_from_string_invalid_arg(func); if (idx) *idx = static_cast<size_t>(ptr - p); + return r; +} + +template<typename V, typename S> +inline +V +as_integer(const string& func, const S& s, size_t* idx, int base); + +// string +template<> +inline +int +as_integer(const string& func, const string& s, size_t* idx, int base ) +{ + // Use long as no Stantard string to integer exists. + long r = as_integer_helper<long>( func, s, idx, base, strtol ); + if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) + throw_from_string_out_of_range(func); return static_cast<int>(r); } +template<> +inline +long +as_integer(const string& func, const string& s, size_t* idx, int base ) +{ + return as_integer_helper<long>( func, s, idx, base, strtol ); +} + +template<> +inline +unsigned long +as_integer( const string& func, const string& s, size_t* idx, int base ) +{ + return as_integer_helper<unsigned long>( func, s, idx, base, strtoul ); +} + +template<> +inline +long long +as_integer( const string& func, const string& s, size_t* idx, int base ) +{ + return as_integer_helper<long long>( func, s, idx, base, strtoll ); +} + +template<> +inline +unsigned long long +as_integer( const string& func, const string& s, size_t* idx, int base ) +{ + return as_integer_helper<unsigned long long>( func, s, idx, base, strtoull ); +} + +// wstring +template<> +inline int -stoi(const wstring& str, size_t* idx, int base) +as_integer( const string& func, const wstring& s, size_t* idx, int base ) { - wchar_t* ptr; - const wchar_t* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - long r = wcstol(p, &ptr, base); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE || r < numeric_limits<int>::min() || - numeric_limits<int>::max() < r) - throw out_of_range("stoi: out of range"); - if (ptr == p) - throw invalid_argument("stoi: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); + // Use long as no Stantard string to integer exists. + long r = as_integer_helper<long>( func, s, idx, base, wcstol ); + if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) + throw_from_string_out_of_range(func); return static_cast<int>(r); } +template<> +inline long -stol(const string& str, size_t* idx, int base) +as_integer( const string& func, const wstring& s, size_t* idx, int base ) +{ + return as_integer_helper<long>( func, s, idx, base, wcstol ); +} + +template<> +inline +unsigned long +as_integer( const string& func, const wstring& s, size_t* idx, int base ) +{ + return as_integer_helper<unsigned long>( func, s, idx, base, wcstoul ); +} + +template<> +inline +long long +as_integer( const string& func, const wstring& s, size_t* idx, int base ) +{ + return as_integer_helper<long long>( func, s, idx, base, wcstoll ); +} + +template<> +inline +unsigned long long +as_integer( const string& func, const wstring& s, size_t* idx, int base ) +{ + return as_integer_helper<unsigned long long>( func, s, idx, base, wcstoull ); +} + +// as_float + +template<typename V, typename S, typename F> +inline +V +as_float_helper(const string& func, const S& str, size_t* idx, F f ) { - char* ptr; - const char* const p = str.c_str(); + typename S::value_type* ptr; + const typename S::value_type* const p = str.c_str(); typename remove_reference<decltype(errno)>::type errno_save = errno; errno = 0; - long r = strtol(p, &ptr, base); + V r = f(p, &ptr); swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS if (errno_save == ERANGE) - throw out_of_range("stol: out of range"); + throw_from_string_out_of_range(func); if (ptr == p) - throw invalid_argument("stol: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS + throw_from_string_invalid_arg(func); if (idx) *idx = static_cast<size_t>(ptr - p); return r; } +template<typename V, typename S> +inline +V as_float( const string& func, const S& s, size_t* idx = nullptr ); + +template<> +inline +float +as_float( const string& func, const string& s, size_t* idx ) +{ + return as_float_helper<float>( func, s, idx, strtof ); +} + +template<> +inline +double +as_float(const string& func, const string& s, size_t* idx ) +{ + return as_float_helper<double>( func, s, idx, strtod ); +} + +template<> +inline +long double +as_float( const string& func, const string& s, size_t* idx ) +{ + return as_float_helper<long double>( func, s, idx, strtold ); +} + +template<> +inline +float +as_float( const string& func, const wstring& s, size_t* idx ) +{ + return as_float_helper<float>( func, s, idx, wcstof ); +} + +template<> +inline +double +as_float( const string& func, const wstring& s, size_t* idx ) +{ + return as_float_helper<double>( func, s, idx, wcstod ); +} + +template<> +inline +long double +as_float( const string& func, const wstring& s, size_t* idx ) +{ + return as_float_helper<long double>( func, s, idx, wcstold ); +} + +} // unnamed namespace + +int +stoi(const string& str, size_t* idx, int base) +{ + return as_integer<int>( "stoi", str, idx, base ); +} + +int +stoi(const wstring& str, size_t* idx, int base) +{ + return as_integer<int>( "stoi", str, idx, base ); +} + +long +stol(const string& str, size_t* idx, int base) +{ + return as_integer<long>( "stol", str, idx, base ); +} + long stol(const wstring& str, size_t* idx, int base) { - wchar_t* ptr; - const wchar_t* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - long r = wcstol(p, &ptr, base); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE) - throw out_of_range("stol: out of range"); - if (ptr == p) - throw invalid_argument("stol: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); - return r; + return as_integer<long>( "stol", str, idx, base ); } unsigned long stoul(const string& str, size_t* idx, int base) { - char* ptr; - const char* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - unsigned long r = strtoul(p, &ptr, base); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE) - throw out_of_range("stoul: out of range"); - if (ptr == p) - throw invalid_argument("stoul: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); - return r; + return as_integer<unsigned long>( "stoul", str, idx, base ); } unsigned long stoul(const wstring& str, size_t* idx, int base) { - wchar_t* ptr; - const wchar_t* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - unsigned long r = wcstoul(p, &ptr, base); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE) - throw out_of_range("stoul: out of range"); - if (ptr == p) - throw invalid_argument("stoul: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); - return r; + return as_integer<unsigned long>( "stoul", str, idx, base ); } long long stoll(const string& str, size_t* idx, int base) { - char* ptr; - const char* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - long long r = strtoll(p, &ptr, base); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE) - throw out_of_range("stoll: out of range"); - if (ptr == p) - throw invalid_argument("stoll: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); - return r; + return as_integer<long long>( "stoll", str, idx, base ); } long long stoll(const wstring& str, size_t* idx, int base) { - wchar_t* ptr; - const wchar_t* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - long long r = wcstoll(p, &ptr, base); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE) - throw out_of_range("stoll: out of range"); - if (ptr == p) - throw invalid_argument("stoll: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); - return r; + return as_integer<long long>( "stoll", str, idx, base ); } unsigned long long stoull(const string& str, size_t* idx, int base) { - char* ptr; - const char* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - unsigned long long r = strtoull(p, &ptr, base); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE) - throw out_of_range("stoull: out of range"); - if (ptr == p) - throw invalid_argument("stoull: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); - return r; + return as_integer<unsigned long long>( "stoull", str, idx, base ); } unsigned long long stoull(const wstring& str, size_t* idx, int base) { - wchar_t* ptr; - const wchar_t* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - unsigned long long r = wcstoull(p, &ptr, base); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE) - throw out_of_range("stoull: out of range"); - if (ptr == p) - throw invalid_argument("stoull: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); - return r; + return as_integer<unsigned long long>( "stoull", str, idx, base ); } float stof(const string& str, size_t* idx) { - char* ptr; - const char* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - float r = strtof(p, &ptr); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE) - throw out_of_range("stof: out of range"); - if (ptr == p) - throw invalid_argument("stof: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); - return r; + return as_float<float>( "stof", str, idx ); } float stof(const wstring& str, size_t* idx) { - wchar_t* ptr; - const wchar_t* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - float r = wcstof(p, &ptr); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE) - throw out_of_range("stof: out of range"); - if (ptr == p) - throw invalid_argument("stof: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); - return r; + return as_float<float>( "stof", str, idx ); } double stod(const string& str, size_t* idx) { - char* ptr; - const char* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - double r = strtod(p, &ptr); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE) - throw out_of_range("stod: out of range"); - if (ptr == p) - throw invalid_argument("stod: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); - return r; + return as_float<double>( "stod", str, idx ); } double stod(const wstring& str, size_t* idx) { - wchar_t* ptr; - const wchar_t* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - double r = wcstod(p, &ptr); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE) - throw out_of_range("stod: out of range"); - if (ptr == p) - throw invalid_argument("stod: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); - return r; + return as_float<double>( "stod", str, idx ); } long double stold(const string& str, size_t* idx) { - char* ptr; - const char* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - long double r = strtold(p, &ptr); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE) - throw out_of_range("stold: out of range"); - if (ptr == p) - throw invalid_argument("stold: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); - return r; + return as_float<long double>( "stold", str, idx ); } long double stold(const wstring& str, size_t* idx) { - wchar_t* ptr; - const wchar_t* const p = str.c_str(); - typename remove_reference<decltype(errno)>::type errno_save = errno; - errno = 0; - long double r = wcstold(p, &ptr); - swap(errno, errno_save); -#ifndef _LIBCPP_NO_EXCEPTIONS - if (errno_save == ERANGE) - throw out_of_range("stold: out of range"); - if (ptr == p) - throw invalid_argument("stold: no conversion"); -#endif // _LIBCPP_NO_EXCEPTIONS - if (idx) - *idx = static_cast<size_t>(ptr - p); - return r; + return as_float<long double>( "stold", str, idx ); } -string to_string(int val) +// to_string + +namespace +{ + +// as_string + +template<typename S, typename P, typename V > +inline +S +as_string(P sprintf_like, S s, const typename S::value_type* fmt, V a) { - string s; - s.resize(s.capacity()); + typedef typename S::size_type size_type; + size_type available = s.size(); while (true) { - size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%d", val)); - if (n2 <= s.size()) + int status = sprintf_like(&s[0], available + 1, fmt, a); + if ( status >= 0 ) { - s.resize(n2); - break; + size_type used = static_cast<size_type>(status); + if ( used <= available ) + { + s.resize( used ); + break; + } + available = used; // Assume this is advice of how much space we need. } - s.resize(n2); + else + available = available * 2 + 1; + s.resize(available); } return s; } -string to_string(unsigned val) +template <class S, class V, bool = is_floating_point<V>::value> +struct initial_string; + +template <class V, bool b> +struct initial_string<string, V, b> { - string s; - s.resize(s.capacity()); - while (true) + string + operator()() const { - size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%u", val)); - if (n2 <= s.size()) - { - s.resize(n2); - break; - } - s.resize(n2); + string s; + s.resize(s.capacity()); + return s; } - return s; -} +}; -string to_string(long val) +template <class V> +struct initial_string<wstring, V, false> { - string s; - s.resize(s.capacity()); - while (true) + wstring + operator()() const { - size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%ld", val)); - if (n2 <= s.size()) - { - s.resize(n2); - break; - } - s.resize(n2); + const size_t n = (numeric_limits<unsigned long long>::digits / 3) + + ((numeric_limits<unsigned long long>::digits % 3) != 0) + + 1; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + return s; } - return s; -} +}; -string to_string(unsigned long val) +template <class V> +struct initial_string<wstring, V, true> { - string s; - s.resize(s.capacity()); - while (true) + wstring + operator()() const { - size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%lu", val)); - if (n2 <= s.size()) - { - s.resize(n2); - break; - } - s.resize(n2); + wstring s(20, wchar_t()); + s.resize(s.capacity()); + return s; } - return s; +}; + +typedef int (*wide_printf)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...); + +inline +wide_printf +get_swprintf() +{ +#ifndef _LIBCPP_MSVCRT + return swprintf; +#else + return static_cast<int (__cdecl*)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...)>(swprintf); +#endif +} + +} // unnamed namespace + +string to_string(int val) +{ + return as_string(snprintf, initial_string<string, int>()(), "%d", val); +} + +string to_string(unsigned val) +{ + return as_string(snprintf, initial_string<string, unsigned>()(), "%u", val); +} + +string to_string(long val) +{ + return as_string(snprintf, initial_string<string, long>()(), "%ld", val); +} + +string to_string(unsigned long val) +{ + return as_string(snprintf, initial_string<string, unsigned long>()(), "%lu", val); } string to_string(long long val) { - string s; - s.resize(s.capacity()); - while (true) - { - size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%lld", val)); - if (n2 <= s.size()) - { - s.resize(n2); - break; - } - s.resize(n2); - } - return s; + return as_string(snprintf, initial_string<string, long long>()(), "%lld", val); } string to_string(unsigned long long val) { - string s; - s.resize(s.capacity()); - while (true) - { - size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%llu", val)); - if (n2 <= s.size()) - { - s.resize(n2); - break; - } - s.resize(n2); - } - return s; + return as_string(snprintf, initial_string<string, unsigned long long>()(), "%llu", val); } string to_string(float val) { - string s; - s.resize(s.capacity()); - while (true) - { - size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%f", val)); - if (n2 <= s.size()) - { - s.resize(n2); - break; - } - s.resize(n2); - } - return s; + return as_string(snprintf, initial_string<string, float>()(), "%f", val); } string to_string(double val) { - string s; - s.resize(s.capacity()); - while (true) - { - size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%f", val)); - if (n2 <= s.size()) - { - s.resize(n2); - break; - } - s.resize(n2); - } - return s; + return as_string(snprintf, initial_string<string, double>()(), "%f", val); } string to_string(long double val) { - string s; - s.resize(s.capacity()); - while (true) - { - size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%Lf", val)); - if (n2 <= s.size()) - { - s.resize(n2); - break; - } - s.resize(n2); - } - return s; + return as_string(snprintf, initial_string<string, long double>()(), "%Lf", val); } wstring to_wstring(int val) { - const size_t n = (numeric_limits<int>::digits / 3) - + ((numeric_limits<int>::digits % 3) != 0) - + 1; - wstring s(n, wchar_t()); - s.resize(s.capacity()); - while (true) - { - int n2 = swprintf(&s[0], s.size()+1, L"%d", val); - if (n2 > 0) - { - s.resize(static_cast<size_t>(n2)); - break; - } - s.resize(2*s.size()); - s.resize(s.capacity()); - } - return s; + return as_string(get_swprintf(), initial_string<wstring, int>()(), L"%d", val); } wstring to_wstring(unsigned val) { - const size_t n = (numeric_limits<unsigned>::digits / 3) - + ((numeric_limits<unsigned>::digits % 3) != 0) - + 1; - wstring s(n, wchar_t()); - s.resize(s.capacity()); - while (true) - { - int n2 = swprintf(&s[0], s.size()+1, L"%u", val); - if (n2 > 0) - { - s.resize(static_cast<size_t>(n2)); - break; - } - s.resize(2*s.size()); - s.resize(s.capacity()); - } - return s; + return as_string(get_swprintf(), initial_string<wstring, unsigned>()(), L"%u", val); } wstring to_wstring(long val) { - const size_t n = (numeric_limits<long>::digits / 3) - + ((numeric_limits<long>::digits % 3) != 0) - + 1; - wstring s(n, wchar_t()); - s.resize(s.capacity()); - while (true) - { - int n2 = swprintf(&s[0], s.size()+1, L"%ld", val); - if (n2 > 0) - { - s.resize(static_cast<size_t>(n2)); - break; - } - s.resize(2*s.size()); - s.resize(s.capacity()); - } - return s; + return as_string(get_swprintf(), initial_string<wstring, long>()(), L"%ld", val); } wstring to_wstring(unsigned long val) { - const size_t n = (numeric_limits<unsigned long>::digits / 3) - + ((numeric_limits<unsigned long>::digits % 3) != 0) - + 1; - wstring s(n, wchar_t()); - s.resize(s.capacity()); - while (true) - { - int n2 = swprintf(&s[0], s.size()+1, L"%lu", val); - if (n2 > 0) - { - s.resize(static_cast<size_t>(n2)); - break; - } - s.resize(2*s.size()); - s.resize(s.capacity()); - } - return s; + return as_string(get_swprintf(), initial_string<wstring, unsigned long>()(), L"%lu", val); } wstring to_wstring(long long val) { - const size_t n = (numeric_limits<long long>::digits / 3) - + ((numeric_limits<long long>::digits % 3) != 0) - + 1; - wstring s(n, wchar_t()); - s.resize(s.capacity()); - while (true) - { - int n2 = swprintf(&s[0], s.size()+1, L"%lld", val); - if (n2 > 0) - { - s.resize(static_cast<size_t>(n2)); - break; - } - s.resize(2*s.size()); - s.resize(s.capacity()); - } - return s; + return as_string(get_swprintf(), initial_string<wstring, long long>()(), L"%lld", val); } wstring to_wstring(unsigned long long val) { - const size_t n = (numeric_limits<unsigned long long>::digits / 3) - + ((numeric_limits<unsigned long long>::digits % 3) != 0) - + 1; - wstring s(n, wchar_t()); - s.resize(s.capacity()); - while (true) - { - int n2 = swprintf(&s[0], s.size()+1, L"%llu", val); - if (n2 > 0) - { - s.resize(static_cast<size_t>(n2)); - break; - } - s.resize(2*s.size()); - s.resize(s.capacity()); - } - return s; + return as_string(get_swprintf(), initial_string<wstring, unsigned long long>()(), L"%llu", val); } wstring to_wstring(float val) { - const size_t n = 20; - wstring s(n, wchar_t()); - s.resize(s.capacity()); - while (true) - { - int n2 = swprintf(&s[0], s.size()+1, L"%f", val); - if (n2 > 0) - { - s.resize(static_cast<size_t>(n2)); - break; - } - s.resize(2*s.size()); - s.resize(s.capacity()); - } - return s; + return as_string(get_swprintf(), initial_string<wstring, float>()(), L"%f", val); } wstring to_wstring(double val) { - const size_t n = 20; - wstring s(n, wchar_t()); - s.resize(s.capacity()); - while (true) - { - int n2 = swprintf(&s[0], s.size()+1, L"%f", val); - if (n2 > 0) - { - s.resize(static_cast<size_t>(n2)); - break; - } - s.resize(2*s.size()); - s.resize(s.capacity()); - } - return s; + return as_string(get_swprintf(), initial_string<wstring, double>()(), L"%f", val); } wstring to_wstring(long double val) { - const size_t n = 20; - wstring s(n, wchar_t()); - s.resize(s.capacity()); - while (true) - { - int n2 = swprintf(&s[0], s.size()+1, L"%Lf", val); - if (n2 > 0) - { - s.resize(static_cast<size_t>(n2)); - break; - } - s.resize(2*s.size()); - s.resize(s.capacity()); - } - return s; + return as_string(get_swprintf(), initial_string<wstring, long double>()(), L"%Lf", val); } - _LIBCPP_END_NAMESPACE_STD diff --git a/system/lib/libcxx/support/win32/locale_win32.cpp b/system/lib/libcxx/support/win32/locale_win32.cpp index 02b5874e..a639ade4 100644 --- a/system/lib/libcxx/support/win32/locale_win32.cpp +++ b/system/lib/libcxx/support/win32/locale_win32.cpp @@ -9,8 +9,8 @@ //===----------------------------------------------------------------------===// #include "support/win32/locale_win32.h" - -#include <stdarg.h> // va_start, va_end +#include <cstdarg> // va_start, va_end +#include <cwchar> // mbstate_t // FIXME: base currently unused. Needs manual work to construct the new locale locale_t newlocale( int mask, const char * locale, locale_t /*base*/ ) @@ -20,6 +20,8 @@ locale_t newlocale( int mask, const char * locale, locale_t /*base*/ ) locale_t uselocale( locale_t newloc ) { locale_t old_locale = _get_current_locale(); + if ( newloc == NULL ) + return old_locale; // uselocale sets the thread's locale by definition, so unconditionally use thread-local locale _configthreadlocale( _ENABLE_PER_THREAD_LOCALE ); // uselocale sets all categories diff --git a/system/lib/libcxx/support/win32/support.cpp b/system/lib/libcxx/support/win32/support.cpp index 9e85077a..4215a700 100644 --- a/system/lib/libcxx/support/win32/support.cpp +++ b/system/lib/libcxx/support/win32/support.cpp @@ -8,63 +8,162 @@ // //===----------------------------------------------------------------------===// -#include <support/win32/support.h> -#include <stdarg.h> // va_start, va_end -#include <stddef.h> // size_t -#include <stdlib.h> // malloc -#include <stdio.h> // vsprintf, vsnprintf -#include <string.h> // strcpy, wcsncpy +#include <cstdarg> // va_start, va_end +#include <cstddef> // size_t +#include <cstdlib> // malloc +#include <cstdio> // vsprintf, vsnprintf +#include <cstring> // strcpy, wcsncpy +#include <cwchar> // mbstate_t +#include <memory> // unique_ptr -int asprintf(char **sptr, const char *__restrict fmt, ...) +namespace { // Private + + struct free_deleter { + inline void operator()(char* p) { free(p); } + }; +} +// Some of these functions aren't standard or if they conform, the name does not. + +int asprintf(char **sptr, const char *__restrict format, ...) { va_list ap; - va_start(ap, fmt); - int result = vasprintf(sptr, fmt, ap); + va_start(ap, format); + int result; +#ifndef _LIBCPP_NO_EXCEPTIONS + try { +#endif + result = vasprintf(sptr, format, ap); +#ifndef _LIBCPP_NO_EXCEPTIONS + } catch( ... ) { + va_end(ap); + throw; + } +#endif va_end(ap); return result; } -int vasprintf( char **sptr, const char *__restrict fmt, va_list ap ) + +// Like sprintf, but when return value >= 0 it returns a pointer to a malloc'd string in *sptr. +// If return >= 0, use free to delete *sptr. +int vasprintf( char **sptr, const char *__restrict format, va_list ap ) { *sptr = NULL; - int count = vsnprintf( *sptr, 0, fmt, ap ); - if( (count >= 0) && ((*sptr = (char*)malloc(count+1)) != NULL) ) - { - vsprintf( *sptr, fmt, ap ); - sptr[count] = '\0'; + int count = _vsnprintf( NULL, 0, format, ap ); // Query the buffer size required. + if( count >= 0 ) { + std::unique_ptr<char, free_deleter> p( static_cast<char*>(malloc(count+1)) ); + if ( ! p ) + return -1; + if ( vsnprintf( p.get(), count+1, format, ap ) == count ) // We should have used exactly what was required. + *sptr = p.release(); + else // Otherwise something is wrong, likely a bug in vsnprintf. If so free the memory and report the error. + return -1; // Pointer will get automaticlaly deleted. } return count; } -// FIXME: use wcrtomb and avoid copy -// use mbsrtowcs which is available, first copy first nwc elements of src +// Returns >= 0: the number of wide characters found in the multi byte sequence src (of src_size_bytes), +// that fit in the buffer dst (of max_dest_chars elements size). The count returned excludes the null terminator. +// When dst is NULL, no characters are copied and no "out" parameters are updated. +// Returns (size_t) -1: an incomplete sequence encountered. +// Leaves *src pointing the next character to convert or NULL if a null character was converted from *src. size_t mbsnrtowcs( wchar_t *__restrict dst, const char **__restrict src, - size_t nmc, size_t len, mbstate_t *__restrict ps ) + size_t src_size_bytes, size_t max_dest_chars, mbstate_t *__restrict ps ) { - char* local_src = new char[nmc+1]; - char* nmcsrc = local_src; - strncpy( nmcsrc, *src, nmc ); - nmcsrc[nmc] = '\0'; - const size_t result = mbsrtowcs( dst, const_cast<const char **>(&nmcsrc), len, ps ); - // propagate error - if( nmcsrc == NULL ) - *src = NULL; - delete[] local_src; - return result; + const size_t terminated_sequence = static_cast<size_t>(0); + //const size_t invalid_sequence = static_cast<size_t>(-1); + const size_t incomplete_sequence = static_cast< size_t>(-2); + + size_t dest_converted = 0; + size_t source_converted = 0; + size_t source_remaining = src_size_bytes; + size_t result = 0; + bool have_result = false; + + while ( source_remaining ) { + if ( dst && dest_converted >= max_dest_chars ) + break; + // Converts one multi byte character. + // if result > 0, it's the size in bytes of that character. + // othewise if result is zero it indicates the null character has been found. + // otherwise it's an error and errno may be set. + size_t char_size = mbrtowc( dst ? dst + dest_converted : NULL, *src + source_converted, source_remaining, ps ); + // Don't do anything to change errno from here on. + if ( char_size > 0 ) { + source_remaining -= char_size; + source_converted += char_size; + ++dest_converted; + continue; + } + result = char_size; + have_result = true; + break; + } + if ( dst ) { + if ( have_result && result == terminated_sequence ) + *src = NULL; + else + *src += source_converted; + } + if ( have_result && result != terminated_sequence && result != incomplete_sequence ) + return static_cast<size_t>(-1); + + return dest_converted; } -// FIXME: use wcrtomb and avoid copy -// use wcsrtombs which is available, first copy first nwc elements of src + +// Converts max_source_chars from the wide character buffer pointer to by *src, +// into the multi byte character sequence buffer stored at dst which must be dst_size_bytes bytes in size. +// Returns >= 0: the number of bytes in the sequence sequence converted frome *src, excluding the null terminator. +// Returns size_t(-1) if an error occurs, also sets errno. +// If dst is NULL dst_size_bytes is ignored and no bytes are copied to dst and no "out" parameters are updated. size_t wcsnrtombs( char *__restrict dst, const wchar_t **__restrict src, - size_t nwc, size_t len, mbstate_t *__restrict ps ) + size_t max_source_chars, size_t dst_size_bytes, mbstate_t *__restrict ps ) { - wchar_t* local_src = new wchar_t[nwc]; - wchar_t* nwcsrc = local_src; - wcsncpy(nwcsrc, *src, nwc); - nwcsrc[nwc] = '\0'; - const size_t result = wcsrtombs( dst, const_cast<const wchar_t **>(&nwcsrc), len, ps ); - // propogate error - if( nwcsrc == NULL ) - *src = NULL; - delete[] nwcsrc; - return result; + //const size_t invalid_sequence = static_cast<size_t>(-1); + + size_t source_converted = 0; + size_t dest_converted = 0; + size_t dest_remaining = dst_size_bytes; + size_t char_size = 0; + const errno_t no_error = ( errno_t) 0; + errno_t result = ( errno_t ) 0; + bool have_result = false; + bool terminator_found = false; + + while ( source_converted != max_source_chars ) { + if ( ! dest_remaining ) + break; + wchar_t c = (*src)[source_converted]; + if ( dst ) + result = wcrtomb_s( &char_size, dst + dest_converted, dest_remaining, c, ps); + else + result = wcrtomb_s( &char_size, NULL, 0, c, ps); + // If result is zero there is no error and char_size contains the size of the multi-byte-sequence converted. + // Otherwise result indicates an errno type error. + if ( result == no_error ) { + if ( c == L'\0' ) { + terminator_found = true; + break; + } + ++source_converted; + if ( dst ) + dest_remaining -= char_size; + dest_converted += char_size; + continue; + } + have_result = true; + break; + } + if ( dst ) { + if ( terminator_found ) + *src = NULL; + else + *src = *src + source_converted; + } + if ( have_result && result != no_error ) { + errno = result; + return static_cast<size_t>(-1); + } + + return dest_converted; } diff --git a/system/lib/libcxx/symbols b/system/lib/libcxx/symbols index 84f4ddc9..92a665d8 100644 --- a/system/lib/libcxx/symbols +++ b/system/lib/libcxx/symbols @@ -77,13 +77,13 @@ W _ZNKSt3__110moneypunctIwLb1EE16do_positive_signEv W _ZNKSt3__110moneypunctIwLb1EE16do_thousands_sepEv W _ZNKSt3__110moneypunctIwLb1EE8groupingEv - T _ZNKSt3__111__libcpp_db12__comparableEPKvS2_ T _ZNKSt3__111__libcpp_db15__decrementableEPKv T _ZNKSt3__111__libcpp_db15__find_c_from_iEPv T _ZNKSt3__111__libcpp_db15__find_iteratorEPKv T _ZNKSt3__111__libcpp_db15__subscriptableEPKvi T _ZNKSt3__111__libcpp_db17__dereferenceableEPKv T _ZNKSt3__111__libcpp_db17__find_c_and_lockEPv + T _ZNKSt3__111__libcpp_db22__less_than_comparableEPKvS2_ T _ZNKSt3__111__libcpp_db6unlockEv T _ZNKSt3__111__libcpp_db8__find_cEPv T _ZNKSt3__111__libcpp_db9__addableEPKvi @@ -372,8 +372,6 @@ W _ZNKSt3__117moneypunct_bynameIwLb1EE16do_negative_signEv W _ZNKSt3__117moneypunct_bynameIwLb1EE16do_positive_signEv W _ZNKSt3__117moneypunct_bynameIwLb1EE16do_thousands_sepEv - C _ZNKSt3__118__hidden_allocatorINS_4pairIPNS_18condition_variableEPNS_5mutexEEEE8max_sizeEv - C _ZNKSt3__118__hidden_allocatorIPNS_17__assoc_sub_stateEE8max_sizeEv T _ZNKSt3__118__time_get_storageIcE15__do_date_orderEv T _ZNKSt3__118__time_get_storageIwE15__do_date_orderEv T _ZNKSt3__119__iostream_category4nameEv @@ -448,15 +446,10 @@ T _ZNKSt3__15ctypeIwE9do_narrowEPKwS3_cPc T _ZNKSt3__15ctypeIwE9do_narrowEwc T _ZNKSt3__16locale4nameEv - C _ZNKSt3__16locale5__imp4nameEv - C _ZNKSt3__16locale5__imp9has_facetEl T _ZNKSt3__16locale5__imp9use_facetEl T _ZNKSt3__16locale9has_facetERNS0_2idE T _ZNKSt3__16locale9use_facetERNS0_2idE T _ZNKSt3__16localeeqERKS0_ - C _ZNKSt3__16vectorINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hidden_allocatorIS6_EEE8max_sizeEv - C _ZNKSt3__16vectorIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEE8max_sizeEv - C _ZNKSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE8max_sizeEv T _ZNKSt3__17codecvtIDic10_mbstate_tE10do_unshiftERS1_PcS4_RS4_ T _ZNKSt3__17codecvtIDic10_mbstate_tE11do_encodingEv T _ZNKSt3__17codecvtIDic10_mbstate_tE13do_max_lengthEv @@ -758,29 +751,23 @@ T _ZNSt16nested_exceptionD0Ev T _ZNSt16nested_exceptionD1Ev T _ZNSt16nested_exceptionD2Ev - C _ZNSt3__110__find_endIRNS_11__traits_eqINS_11char_traitsIcEEEEPKcS7_EET0_S8_S8_T1_S9_T_NS_26random_access_iterator_tagESB_ - C _ZNSt3__110__find_endIRNS_11__traits_eqINS_11char_traitsIwEEEEPKwS7_EET0_S8_S8_T1_S9_T_NS_26random_access_iterator_tagESB_ C _ZNSt3__110__sscanf_lEPKcPvS1_z C _ZNSt3__110__stdinbufIcE5imbueERKNS_6localeE C _ZNSt3__110__stdinbufIcE5uflowEv C _ZNSt3__110__stdinbufIcE9__getcharEb C _ZNSt3__110__stdinbufIcE9pbackfailEi C _ZNSt3__110__stdinbufIcE9underflowEv - C _ZNSt3__110__stdinbufIcEC1EP7__sFILEP10_mbstate_t C _ZNSt3__110__stdinbufIcEC2EP7__sFILEP10_mbstate_t C _ZNSt3__110__stdinbufIcED0Ev C _ZNSt3__110__stdinbufIcED1Ev - C _ZNSt3__110__stdinbufIcED2Ev C _ZNSt3__110__stdinbufIwE5imbueERKNS_6localeE C _ZNSt3__110__stdinbufIwE5uflowEv C _ZNSt3__110__stdinbufIwE9__getcharEb - C _ZNSt3__110__stdinbufIwE9pbackfailEj + C _ZNSt3__110__stdinbufIwE9pbackfailEi C _ZNSt3__110__stdinbufIwE9underflowEv - C _ZNSt3__110__stdinbufIwEC1EP7__sFILEP10_mbstate_t C _ZNSt3__110__stdinbufIwEC2EP7__sFILEP10_mbstate_t C _ZNSt3__110__stdinbufIwED0Ev C _ZNSt3__110__stdinbufIwED1Ev - C _ZNSt3__110__stdinbufIwED2Ev T _ZNSt3__110__time_getC1EPKc T _ZNSt3__110__time_getC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE T _ZNSt3__110__time_getC2EPKc @@ -878,23 +865,16 @@ W _ZNSt3__111__money_putIwE8__formatEPwRS2_S3_jPKwS5_RKNS_5ctypeIwEEbRKNS_10money_base7patternEwwRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERKNSE_IwNSF_IwEENSH_IwEEEESQ_i W _ZNSt3__111__money_putIwEC1Ev W _ZNSt3__111__money_putIwEC2Ev - C _ZNSt3__111__sprintf_lEPcPvPKcz C _ZNSt3__111__stdoutbufIcE4syncEv C _ZNSt3__111__stdoutbufIcE5imbueERKNS_6localeE C _ZNSt3__111__stdoutbufIcE8overflowEi - C _ZNSt3__111__stdoutbufIcEC1EP7__sFILEP10_mbstate_t - C _ZNSt3__111__stdoutbufIcEC2EP7__sFILEP10_mbstate_t C _ZNSt3__111__stdoutbufIcED0Ev C _ZNSt3__111__stdoutbufIcED1Ev - C _ZNSt3__111__stdoutbufIcED2Ev C _ZNSt3__111__stdoutbufIwE4syncEv C _ZNSt3__111__stdoutbufIwE5imbueERKNS_6localeE - C _ZNSt3__111__stdoutbufIwE8overflowEj - C _ZNSt3__111__stdoutbufIwEC1EP7__sFILEP10_mbstate_t - C _ZNSt3__111__stdoutbufIwEC2EP7__sFILEP10_mbstate_t + C _ZNSt3__111__stdoutbufIwE8overflowEi C _ZNSt3__111__stdoutbufIwED0Ev C _ZNSt3__111__stdoutbufIwED1Ev - C _ZNSt3__111__stdoutbufIwED2Ev T _ZNSt3__111regex_errorC1ENS_15regex_constants10error_typeE T _ZNSt3__111regex_errorC2ENS_15regex_constants10error_typeE T _ZNSt3__111regex_errorD0Ev @@ -909,17 +889,12 @@ T _ZNSt3__111timed_mutexD1Ev T _ZNSt3__111timed_mutexD2Ev D _ZNSt3__111try_to_lockE - C _ZNSt3__111unique_lockINS_5mutexEE6unlockEv C _ZNSt3__112__asprintf_lEPPcPvPKcz - C _ZNSt3__112__do_messageC2Ev C _ZNSt3__112__do_messageD0Ev C _ZNSt3__112__do_messageD1Ev - C _ZNSt3__112__do_messageD2Ev T _ZNSt3__112__do_nothingEPv T _ZNSt3__112__get_sp_mutEPKv T _ZNSt3__112__next_primeEj - C _ZNSt3__112__rotate_gcdINS_11__wrap_iterIPcEEEET_S4_S4_S4_ - C _ZNSt3__112__rotate_gcdINS_11__wrap_iterIPwEEEET_S4_S4_S4_ D _ZNSt3__112__rs_default4__c_E T _ZNSt3__112__rs_defaultC1ERKS0_ T _ZNSt3__112__rs_defaultC1Ev @@ -972,7 +947,6 @@ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcjj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEjc - C _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPKcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESA_SA_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKc W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKcj @@ -1011,7 +985,6 @@ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjRKS5_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjRKS5_jj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceEjjjc - C _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7replaceIPKcEENS_9enable_ifIXsr19__is_input_iteratorIT_EE5valueERS5_E4typeENS_11__wrap_iterIS8_EESF_SA_SA_ W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7reserveEj W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8pop_backEv W _ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__grow_byEjjjjjj @@ -1098,7 +1071,6 @@ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initEPKwj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initEPKwjj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initEjw - C _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initIPKwEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESA_SA_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__zeroEv W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendEPKw W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6appendEPKwj @@ -1138,7 +1110,6 @@ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjRKS5_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjRKS5_jj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceEjjjw - C _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7replaceIPKwEENS_9enable_ifIXsr19__is_input_iteratorIT_EE5valueERS5_E4typeENS_11__wrap_iterIS8_EESF_SA_SA_ W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE7reserveEj W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE8pop_backEv W _ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE9__grow_byEjjjjjj @@ -1200,9 +1171,7 @@ T _ZNSt3__112ctype_bynameIwED1Ev T _ZNSt3__112ctype_bynameIwED2Ev T _ZNSt3__112future_errorC1ENS_10error_codeE - C _ZNSt3__112future_errorC1ERKS0_ T _ZNSt3__112future_errorC2ENS_10error_codeE - C _ZNSt3__112future_errorC2ERKS0_ T _ZNSt3__112future_errorD0Ev T _ZNSt3__112future_errorD1Ev T _ZNSt3__112future_errorD2Ev @@ -1260,12 +1229,6 @@ T _ZNSt3__112system_errorD0Ev T _ZNSt3__112system_errorD1Ev T _ZNSt3__112system_errorD2Ev - C _ZNSt3__113__lower_boundIRNS_6__lessIjjEEPKjjEET0_S6_S6_RKT1_T_ - C _ZNSt3__113__rotate_leftINS_11__wrap_iterIPcEEEET_S4_S4_ - C _ZNSt3__113__rotate_leftINS_11__wrap_iterIPwEEEET_S4_S4_ - C _ZNSt3__113__vector_baseINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hidden_allocatorIS6_EEED2Ev - C _ZNSt3__113__vector_baseIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEED2Ev - C _ZNSt3__113__vector_baseIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEED2Ev D _ZNSt3__113allocator_argE W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getEPci W _ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE3getEPcic @@ -1327,7 +1290,7 @@ W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE5seekgExNS_8ios_base7seekdirE W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE5tellgEv W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE5ungetEv - W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE6ignoreEij + W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE6ignoreEii W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE6sentryC1ERS3_b W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE6sentryC2ERS3_b W _ZNSt3__113basic_istreamIwNS_11char_traitsIwEEE7getlineEPwi @@ -1435,8 +1398,6 @@ W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEt W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEx W _ZNSt3__113basic_ostreamIwNS_11char_traitsIwEEElsEy - C _ZNSt3__113find_first_ofIPKcS2_NS_11__traits_eqINS_11char_traitsIcEEEEEET_S7_S7_T0_S8_T1_ - C _ZNSt3__113find_first_ofIPKwS2_NS_11__traits_eqINS_11char_traitsIwEEEEEET_S7_S7_T0_S8_T1_ T _ZNSt3__113random_deviceC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE T _ZNSt3__113random_deviceC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE T _ZNSt3__113random_deviceD1Ev @@ -1447,21 +1408,16 @@ T _ZNSt3__113shared_futureIvEaSERKS1_ C _ZNSt3__114__codecvt_utf8IDiED0Ev C _ZNSt3__114__codecvt_utf8IDiED1Ev - C _ZNSt3__114__codecvt_utf8IDiED2Ev C _ZNSt3__114__codecvt_utf8IDsED0Ev C _ZNSt3__114__codecvt_utf8IDsED1Ev - C _ZNSt3__114__codecvt_utf8IDsED2Ev C _ZNSt3__114__codecvt_utf8IwED0Ev C _ZNSt3__114__codecvt_utf8IwED1Ev - C _ZNSt3__114__codecvt_utf8IwED2Ev T _ZNSt3__114__get_const_dbEv T _ZNSt3__114__num_get_base10__get_baseERNS_8ios_baseE D _ZNSt3__114__num_get_base5__srcE T _ZNSt3__114__num_put_base12__format_intEPcPKcbj T _ZNSt3__114__num_put_base14__format_floatEPcPKcj T _ZNSt3__114__num_put_base18__identify_paddingEPcS1_RKNS_8ios_baseE - C _ZNSt3__114__rotate_rightINS_11__wrap_iterIPcEEEET_S4_S4_ - C _ZNSt3__114__rotate_rightINS_11__wrap_iterIPwEEEET_S4_S4_ C _ZNSt3__114__scan_keywordINS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEPKNS_12basic_stringIcS3_NS_9allocatorIcEEEENS_5ctypeIcEEEET0_RT_SE_SD_SD_RKT1_Rjb C _ZNSt3__114__scan_keywordINS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEPKNS_12basic_stringIwS3_NS_9allocatorIwEEEENS_5ctypeIwEEEET0_RT_SE_SD_SD_RKT1_Rjb C _ZNSt3__114__scan_keywordIPcPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_5ctypeIcEEEET0_RT_SC_SB_SB_RKT1_Rjb @@ -1471,19 +1427,6 @@ T _ZNSt3__114__shared_countD0Ev T _ZNSt3__114__shared_countD1Ev T _ZNSt3__114__shared_countD2Ev - C _ZNSt3__114__split_bufferINS_4pairIPNS_18condition_variableEPNS_5mutexEEERNS_18__hidden_allocatorIS6_EEEC1EjjS9_ - C _ZNSt3__114__split_bufferINS_4pairIPNS_18condition_variableEPNS_5mutexEEERNS_18__hidden_allocatorIS6_EEEC2EjjS9_ - C _ZNSt3__114__split_bufferINS_4pairIPNS_18condition_variableEPNS_5mutexEEERNS_18__hidden_allocatorIS6_EEED1Ev - C _ZNSt3__114__split_bufferINS_4pairIPNS_18condition_variableEPNS_5mutexEEERNS_18__hidden_allocatorIS6_EEED2Ev - C _ZNSt3__114__split_bufferIPNS_17__assoc_sub_stateERNS_18__hidden_allocatorIS2_EEEC1EjjS5_ - C _ZNSt3__114__split_bufferIPNS_17__assoc_sub_stateERNS_18__hidden_allocatorIS2_EEEC2EjjS5_ - C _ZNSt3__114__split_bufferIPNS_17__assoc_sub_stateERNS_18__hidden_allocatorIS2_EEED1Ev - C _ZNSt3__114__split_bufferIPNS_17__assoc_sub_stateERNS_18__hidden_allocatorIS2_EEED2Ev - C _ZNSt3__114__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lj28EEEE18__construct_at_endEj - C _ZNSt3__114__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lj28EEEEC1EjjS6_ - C _ZNSt3__114__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lj28EEEEC2EjjS6_ - C _ZNSt3__114__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lj28EEEED1Ev - C _ZNSt3__114__split_bufferIPNS_6locale5facetERNS_15__sso_allocatorIS3_Lj28EEEED2Ev W _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEE4swapERS3_ W _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC1EOS3_ W _ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC1EPNS_15basic_streambufIcS2_EE @@ -1541,22 +1484,16 @@ T _ZNSt3__114error_categoryD2Ev C _ZNSt3__115__codecvt_utf16IDiLb0EED0Ev C _ZNSt3__115__codecvt_utf16IDiLb0EED1Ev - C _ZNSt3__115__codecvt_utf16IDiLb0EED2Ev C _ZNSt3__115__codecvt_utf16IDiLb1EED0Ev C _ZNSt3__115__codecvt_utf16IDiLb1EED1Ev - C _ZNSt3__115__codecvt_utf16IDiLb1EED2Ev C _ZNSt3__115__codecvt_utf16IDsLb0EED0Ev C _ZNSt3__115__codecvt_utf16IDsLb0EED1Ev - C _ZNSt3__115__codecvt_utf16IDsLb0EED2Ev C _ZNSt3__115__codecvt_utf16IDsLb1EED0Ev C _ZNSt3__115__codecvt_utf16IDsLb1EED1Ev - C _ZNSt3__115__codecvt_utf16IDsLb1EED2Ev C _ZNSt3__115__codecvt_utf16IwLb0EED0Ev C _ZNSt3__115__codecvt_utf16IwLb0EED1Ev - C _ZNSt3__115__codecvt_utf16IwLb0EED2Ev C _ZNSt3__115__codecvt_utf16IwLb1EED0Ev C _ZNSt3__115__codecvt_utf16IwLb1EED1Ev - C _ZNSt3__115__codecvt_utf16IwLb1EED2Ev T _ZNSt3__115__get_classnameEPKcb C _ZNSt3__115__num_get_floatIdEET_PKcS3_Rj C _ZNSt3__115__num_get_floatIeEET_PKcS3_Rj @@ -1567,20 +1504,10 @@ T _ZNSt3__115__thread_structC2Ev T _ZNSt3__115__thread_structD1Ev T _ZNSt3__115__thread_structD2Ev - C _ZNSt3__115__time_get_tempIcEC1EPKc - C _ZNSt3__115__time_get_tempIcEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE - C _ZNSt3__115__time_get_tempIcEC2EPKc - C _ZNSt3__115__time_get_tempIcEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE C _ZNSt3__115__time_get_tempIcED0Ev C _ZNSt3__115__time_get_tempIcED1Ev - C _ZNSt3__115__time_get_tempIcED2Ev - C _ZNSt3__115__time_get_tempIwEC1EPKc - C _ZNSt3__115__time_get_tempIwEC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE - C _ZNSt3__115__time_get_tempIwEC2EPKc - C _ZNSt3__115__time_get_tempIwEC2ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE C _ZNSt3__115__time_get_tempIwED0Ev C _ZNSt3__115__time_get_tempIwED1Ev - C _ZNSt3__115__time_get_tempIwED2Ev W _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE10pubseekoffExNS_8ios_base7seekdirEj W _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE10pubseekposENS_4fposI10_mbstate_tEEj W _ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4_ @@ -1644,9 +1571,9 @@ W _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE7seekposENS_4fposI10_mbstate_tEEj W _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE7sungetcEv W _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE8in_availEv - W _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE8overflowEj + W _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE8overflowEi W _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE8pubimbueERKNS_6localeE - W _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9pbackfailEj + W _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9pbackfailEi W _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9pubsetbufEPwi W _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9showmanycEv W _ZNSt3__115basic_streambufIwNS_11char_traitsIwEEE9sputbackcEw @@ -1748,7 +1675,6 @@ T _ZNSt3__117__assoc_sub_state9set_valueEv C _ZNSt3__117__assoc_sub_stateD0Ev C _ZNSt3__117__assoc_sub_stateD1Ev - C _ZNSt3__117__assoc_sub_stateD2Ev T _ZNSt3__117__widen_from_utf8ILj16EED0Ev T _ZNSt3__117__widen_from_utf8ILj16EED1Ev T _ZNSt3__117__widen_from_utf8ILj16EED2Ev @@ -1789,25 +1715,6 @@ W _ZNSt3__117moneypunct_bynameIwLb1EED0Ev W _ZNSt3__117moneypunct_bynameIwLb1EED1Ev W _ZNSt3__117moneypunct_bynameIwLb1EED2Ev - C _ZNSt3__118__hidden_allocatorINS_4pairIPNS_18condition_variableEPNS_5mutexEEEE10deallocateEPS6_j - C _ZNSt3__118__hidden_allocatorINS_4pairIPNS_18condition_variableEPNS_5mutexEEEE8allocateEj - C _ZNSt3__118__hidden_allocatorIPNS_17__assoc_sub_stateEE10deallocateEPS2_j - C _ZNSt3__118__hidden_allocatorIPNS_17__assoc_sub_stateEE8allocateEj - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIaaEEPaEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIccEEPcEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIddEEPdEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIeeEEPeEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIffEEPfEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIhhEEPhEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIiiEEPiEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIjjEEPjEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIllEEPlEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessImmEEPmEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIssEEPsEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIttEEPtEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIwwEEPwEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIxxEEPxEEvT0_S5_T_ - C _ZNSt3__118__insertion_sort_3IRNS_6__lessIyyEEPyEEvT0_S5_T_ T _ZNSt3__118__time_get_storageIcE4initERKNS_5ctypeIcEE T _ZNSt3__118__time_get_storageIcE9__analyzeEcRKNS_5ctypeIcEE T _ZNSt3__118__time_get_storageIcEC1EPKc @@ -1827,14 +1734,9 @@ T _ZNSt3__118condition_variableD1Ev T _ZNSt3__118condition_variableD2Ev T _ZNSt3__118get_pointer_safetyEv - C _ZNSt3__119__double_or_nothingIcEEvRNS_10unique_ptrIT_PFvPvEEERPS2_S9_ - C _ZNSt3__119__double_or_nothingIjEEvRNS_10unique_ptrIT_PFvPvEEERPS2_S9_ C _ZNSt3__119__double_or_nothingIwEEvRNS_10unique_ptrIT_PFvPvEEERPS2_S9_ - C _ZNSt3__119__iostream_categoryC1Ev - C _ZNSt3__119__iostream_categoryC2Ev C _ZNSt3__119__iostream_categoryD0Ev C _ZNSt3__119__iostream_categoryD1Ev - C _ZNSt3__119__iostream_categoryD2Ev T _ZNSt3__119__shared_weak_count10__add_weakEv T _ZNSt3__119__shared_weak_count12__add_sharedEv T _ZNSt3__119__shared_weak_count14__release_weakEv @@ -1847,37 +1749,25 @@ T _ZNSt3__119__thread_local_dataEv T _ZNSt3__119__thread_struct_imp25notify_all_at_thread_exitEPNS_18condition_variableEPNS_5mutexE T _ZNSt3__119__thread_struct_imp27__make_ready_at_thread_exitEPNS_17__assoc_sub_stateE - C _ZNSt3__119__thread_struct_impC1Ev - C _ZNSt3__119__thread_struct_impC2Ev T _ZNSt3__119__thread_struct_impD1Ev T _ZNSt3__119__thread_struct_impD2Ev T _ZNSt3__119declare_no_pointersEPcj D _ZNSt3__119piecewise_constructE C _ZNSt3__120__codecvt_utf8_utf16IDiED0Ev C _ZNSt3__120__codecvt_utf8_utf16IDiED1Ev - C _ZNSt3__120__codecvt_utf8_utf16IDiED2Ev C _ZNSt3__120__codecvt_utf8_utf16IDsED0Ev C _ZNSt3__120__codecvt_utf8_utf16IDsED1Ev - C _ZNSt3__120__codecvt_utf8_utf16IDsED2Ev C _ZNSt3__120__codecvt_utf8_utf16IwED0Ev C _ZNSt3__120__codecvt_utf8_utf16IwED1Ev - C _ZNSt3__120__codecvt_utf8_utf16IwED2Ev T _ZNSt3__120__get_collation_nameEPKc C _ZNSt3__120__get_up_to_n_digitsIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEiRT0_S5_RjRKNS_5ctypeIT_EEi C _ZNSt3__120__get_up_to_n_digitsIcPcEEiRT0_S2_RjRKNS_5ctypeIT_EEi C _ZNSt3__120__get_up_to_n_digitsIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEiRT0_S5_RjRKNS_5ctypeIT_EEi - C _ZNSt3__120__get_up_to_n_digitsIwPwEEiRT0_S2_RjRKNS_5ctypeIT_EEi T _ZNSt3__120__throw_system_errorEiPKc - C _ZNSt3__120__time_get_c_storageIcEC2Ev - C _ZNSt3__120__time_get_c_storageIwEC2Ev W _ZNSt3__120__vector_base_commonILb1EEC1Ev W _ZNSt3__120__vector_base_commonILb1EEC2Ev - C _ZNSt3__121__murmur2_or_cityhashIjLj32EEclEPKvj C _ZNSt3__121__thread_specific_ptrINS_15__thread_structEE16__at_thread_exitEPv - C _ZNSt3__121__thread_specific_ptrINS_15__thread_structEEC1Ev - C _ZNSt3__121__thread_specific_ptrINS_15__thread_structEEC2Ev C _ZNSt3__121__thread_specific_ptrINS_15__thread_structEED1Ev - C _ZNSt3__121__thread_specific_ptrINS_15__thread_structEED2Ev T _ZNSt3__121__throw_runtime_errorEPKc T _ZNSt3__121__undeclare_reachableEPv T _ZNSt3__121recursive_timed_mutex4lockEv @@ -1888,24 +1778,12 @@ T _ZNSt3__121recursive_timed_mutexD1Ev T _ZNSt3__121recursive_timed_mutexD2Ev T _ZNSt3__121undeclare_no_pointersEPcj - C _ZNSt3__122__release_shared_countclEPNS_14__shared_countE - C _ZNSt3__123__future_error_categoryC1Ev - C _ZNSt3__123__future_error_categoryC2Ev C _ZNSt3__123__future_error_categoryD0Ev C _ZNSt3__123__future_error_categoryD1Ev - C _ZNSt3__123__future_error_categoryD2Ev - C _ZNSt3__123__system_error_categoryC1Ev - C _ZNSt3__123__system_error_categoryC2Ev C _ZNSt3__123__system_error_categoryD0Ev C _ZNSt3__123__system_error_categoryD1Ev - C _ZNSt3__123__system_error_categoryD2Ev - C _ZNSt3__123mersenne_twister_engineIjLj32ELj624ELj397ELj31ELj2567483615ELj11ELj4294967295ELj7ELj2636928640ELj15ELj4022730752ELj18ELj1812433253EE4seedEj - C _ZNSt3__123mersenne_twister_engineIjLj32ELj624ELj397ELj31ELj2567483615ELj11ELj4294967295ELj7ELj2636928640ELj15ELj4022730752ELj18ELj1812433253EEclEv - C _ZNSt3__124__generic_error_categoryC1Ev - C _ZNSt3__124__generic_error_categoryC2Ev C _ZNSt3__124__generic_error_categoryD0Ev C _ZNSt3__124__generic_error_categoryD1Ev - C _ZNSt3__124__generic_error_categoryD2Ev C _ZNSt3__125__num_get_signed_integralIlEET_PKcS3_Rji C _ZNSt3__125__num_get_signed_integralIxEET_PKcS3_Rji T _ZNSt3__125notify_all_at_thread_exitERNS_18condition_variableENS_11unique_lockINS_5mutexEEE @@ -2005,84 +1883,8 @@ D _ZNSt3__16locale4noneE D _ZNSt3__16locale4timeE T _ZNSt3__16locale5__imp11make_globalEv - C _ZNSt3__16locale5__imp12install_fromINS_10moneypunctIcLb0EEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_10moneypunctIcLb1EEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_10moneypunctIwLb0EEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_10moneypunctIwLb1EEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_5ctypeIcEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_5ctypeIwEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_7codecvtIDic10_mbstate_tEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_7codecvtIDsc10_mbstate_tEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_7codecvtIcc10_mbstate_tEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_7codecvtIwc10_mbstate_tEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_7collateIcEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_7collateIwEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_7num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_7num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_7num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_7num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_8messagesIcEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_8messagesIwEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_8numpunctIcEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_8numpunctIwEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_8time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_8time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_8time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_9money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_9money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_9money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvRKS1_ - C _ZNSt3__16locale5__imp12install_fromINS_9money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvRKS1_ T _ZNSt3__16locale5__imp12make_classicEv T _ZNSt3__16locale5__imp7installEPNS0_5facetEl - C _ZNSt3__16locale5__imp7installINS_10moneypunctIcLb0EEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_10moneypunctIcLb1EEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_10moneypunctIwLb0EEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_10moneypunctIwLb1EEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_12ctype_bynameIcEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_12ctype_bynameIwEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_14codecvt_bynameIDic10_mbstate_tEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_14codecvt_bynameIDsc10_mbstate_tEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_14codecvt_bynameIcc10_mbstate_tEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_14codecvt_bynameIwc10_mbstate_tEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_14collate_bynameIcEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_14collate_bynameIwEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_15messages_bynameIcEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_15messages_bynameIwEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_15numpunct_bynameIcEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_15numpunct_bynameIwEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_15time_get_bynameIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_15time_get_bynameIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_15time_put_bynameIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_15time_put_bynameIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_17moneypunct_bynameIcLb0EEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_17moneypunct_bynameIcLb1EEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_17moneypunct_bynameIwLb0EEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_17moneypunct_bynameIwLb1EEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_5ctypeIcEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_5ctypeIwEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_7codecvtIDic10_mbstate_tEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_7codecvtIDsc10_mbstate_tEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_7codecvtIcc10_mbstate_tEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_7codecvtIwc10_mbstate_tEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_7collateIcEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_7collateIwEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_7num_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_7num_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_7num_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_7num_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_8messagesIcEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_8messagesIwEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_8numpunctIcEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_8numpunctIwEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_8time_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_8time_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_8time_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_8time_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_9money_getIcNS_19istreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_9money_getIwNS_19istreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_9money_putIcNS_19ostreambuf_iteratorIcNS_11char_traitsIcEEEEEEEEvPT_ - C _ZNSt3__16locale5__imp7installINS_9money_putIwNS_19ostreambuf_iteratorIwNS_11char_traitsIwEEEEEEEEvPT_ T _ZNSt3__16locale5__impC1ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEj T _ZNSt3__16locale5__impC1ERKS1_ T _ZNSt3__16locale5__impC1ERKS1_PNS0_5facetEl @@ -2135,55 +1937,10 @@ T _ZNSt3__16threadD1Ev T _ZNSt3__16threadD2Ev C _ZNSt3__16vectorINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hidden_allocatorIS6_EEE21__push_back_slow_pathIS6_EEvOT_ - C _ZNSt3__16vectorINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hidden_allocatorIS6_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS8_EE - C _ZNSt3__16vectorINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hidden_allocatorIS6_EEED1Ev - C _ZNSt3__16vectorINS_4pairIPNS_18condition_variableEPNS_5mutexEEENS_18__hidden_allocatorIS6_EEED2Ev C _ZNSt3__16vectorIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT_ - C _ZNSt3__16vectorIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS2_RS4_EE - C _ZNSt3__16vectorIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEED1Ev - C _ZNSt3__16vectorIPNS_17__assoc_sub_stateENS_18__hidden_allocatorIS2_EEED2Ev - C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE10deallocateEv - C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE18__construct_at_endEj - C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE18__construct_at_endIPS3_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESA_SA_ - C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE6assignIPS3_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS3_NS_15iterator_traitsISA_E9referenceEEE5valueEvE4typeESA_SA_ - C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE6resizeEj C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE8__appendEj - C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEE8allocateEj - C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEEC1Ej C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEEC2Ej - C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEED1Ev - C _ZNSt3__16vectorIPNS_6locale5facetENS_15__sso_allocatorIS3_Lj28EEEED2Ev - C _ZNSt3__17__sort3IRNS_6__lessIaaEEPaEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessIccEEPcEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessIddEEPdEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessIeeEEPeEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessIffEEPfEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessIhhEEPhEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessIiiEEPiEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessIjjEEPjEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessIllEEPlEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessImmEEPmEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessIssEEPsEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessIttEEPtEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessIwwEEPwEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessIxxEEPxEEjT0_S5_S5_T_ - C _ZNSt3__17__sort3IRNS_6__lessIyyEEPyEEjT0_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIaaEEPaEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIccEEPcEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIddEEPdEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIeeEEPeEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIffEEPfEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIhhEEPhEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIiiEEPiEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIjjEEPjEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIllEEPlEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessImmEEPmEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIssEEPsEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIttEEPtEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIwwEEPwEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIxxEEPxEEjT0_S5_S5_S5_T_ - C _ZNSt3__17__sort4IRNS_6__lessIyyEEPyEEjT0_S5_S5_S5_T_ C _ZNSt3__17__sort5IRNS_6__lessIaaEEPaEEjT0_S5_S5_S5_S5_T_ C _ZNSt3__17__sort5IRNS_6__lessIccEEPcEEjT0_S5_S5_S5_S5_T_ C _ZNSt3__17__sort5IRNS_6__lessIddEEPdEEjT0_S5_S5_S5_S5_T_ @@ -2273,12 +2030,8 @@ T _ZNSt3__18__i_nodeD1Ev T _ZNSt3__18__i_nodeD2Ev T _ZNSt3__18__rs_getEv - C _ZNSt3__18__searchIRNS_11__traits_eqINS_11char_traitsIcEEEEPKcS7_EET0_S8_S8_T1_S9_T_NS_26random_access_iterator_tagESB_ - C _ZNSt3__18__searchIRNS_11__traits_eqINS_11char_traitsIwEEEEPKwS7_EET0_S8_S8_T1_S9_T_NS_26random_access_iterator_tagESB_ T _ZNSt3__18__sp_mut4lockEv T _ZNSt3__18__sp_mut6unlockEv - C _ZNSt3__18__sp_mutC1EPv - C _ZNSt3__18__sp_mutC2EPv D _ZNSt3__18ios_base10floatfieldE D _ZNSt3__18ios_base10scientificE D _ZNSt3__18ios_base11adjustfieldE @@ -2488,6 +2241,7 @@ T _ZNSt3__19to_stringEx T _ZNSt3__19to_stringEy W _ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EEPKS6_RKS9_ + C _ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EERKS9_PKS6_ T _ZSt10unexpectedv T _ZSt13get_terminatev T _ZSt13set_terminatePFvvE @@ -2495,7 +2249,6 @@ T _ZSt14set_unexpectedPFvvE T _ZSt17current_exceptionv T _ZSt17rethrow_exceptionSt13exception_ptr - C _ZSt18make_exception_ptrINSt3__112future_errorEESt13exception_ptrT_ D _ZTCNSt3__110istrstreamE0_NS_13basic_istreamIcNS_11char_traitsIcEEEE D _ZTCNSt3__110ostrstreamE0_NS_13basic_ostreamIcNS_11char_traitsIcEEEE W _ZTCNSt3__114basic_iostreamIcNS_11char_traitsIcEEEE0_NS_13basic_istreamIcS2_EE @@ -2636,6 +2389,7 @@ D _ZTISt15underflow_error D _ZTISt16invalid_argument D _ZTISt16nested_exception + C _ZTISt9exception C _ZTSNSt3__110__stdinbufIcEE C _ZTSNSt3__110__stdinbufIwEE C _ZTSNSt3__110__time_getE @@ -2769,6 +2523,7 @@ D _ZTSSt15underflow_error D _ZTSSt16invalid_argument D _ZTSSt16nested_exception + C _ZTSSt9exception D _ZTTNSt3__110istrstreamE D _ZTTNSt3__110ostrstreamE W _ZTTNSt3__113basic_istreamIcNS_11char_traitsIcEEEE @@ -2843,8 +2598,6 @@ D _ZTVNSt3__120__codecvt_utf8_utf16IDiEE D _ZTVNSt3__120__codecvt_utf8_utf16IDsEE D _ZTVNSt3__120__codecvt_utf8_utf16IwEE - C _ZTVNSt3__120__time_get_c_storageIcEE - C _ZTVNSt3__120__time_get_c_storageIwEE D _ZTVNSt3__123__future_error_categoryE D _ZTVNSt3__123__system_error_categoryE D _ZTVNSt3__124__generic_error_categoryE diff --git a/system/lib/libcxx/system_error.cpp b/system/lib/libcxx/system_error.cpp index 763d62c2..7376b770 100644 --- a/system/lib/libcxx/system_error.cpp +++ b/system/lib/libcxx/system_error.cpp @@ -195,6 +195,9 @@ __throw_system_error(int ev, const char* what_arg) { #ifndef _LIBCPP_NO_EXCEPTIONS throw system_error(error_code(ev, system_category()), what_arg); +#else + (void)ev; + (void)what_arg; #endif } diff --git a/system/lib/libcxx/thread.cpp b/system/lib/libcxx/thread.cpp index 76af3d0c..1fd8bb04 100644 --- a/system/lib/libcxx/thread.cpp +++ b/system/lib/libcxx/thread.cpp @@ -16,11 +16,17 @@ #if !defined(_WIN32) #if !defined(__sun__) && !defined(__linux__) #include <sys/sysctl.h> -#else -#include <unistd.h> #endif // !__sun__ && !__linux__ +#include <unistd.h> #endif // !_WIN32 +#if defined(__NetBSD__) +#pragma weak pthread_create // Do not create libpthread dependency +#endif +#if defined(_WIN32) +#include <windows.h> +#endif + _LIBCPP_BEGIN_NAMESPACE_STD thread::~thread() @@ -36,6 +42,8 @@ thread::join() #ifndef _LIBCPP_NO_EXCEPTIONS if (ec) throw system_error(error_code(ec, system_category()), "thread::join failed"); +#else + (void)ec; #endif // _LIBCPP_NO_EXCEPTIONS __t_ = 0; } @@ -65,7 +73,7 @@ thread::hardware_concurrency() _NOEXCEPT std::size_t s = sizeof(n); sysctl(mib, 2, &n, &s, 0, 0); return n; -#elif (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) && defined(_SC_NPROCESSORS_ONLN)) || defined(EMSCRIPTEN) +#elif defined(_SC_NPROCESSORS_ONLN) long result = sysconf(_SC_NPROCESSORS_ONLN); // sysconf returns -1 if the name is invalid, the option does not exist or // does not have a definite limit. @@ -74,9 +82,14 @@ thread::hardware_concurrency() _NOEXCEPT if (result < 0) return 0; return static_cast<unsigned>(result); +#elif defined(_WIN32) + SYSTEM_INFO info; + GetSystemInfo(&info); + return info.dwNumberOfProcessors; #else // defined(CTL_HW) && defined(HW_NCPU) // TODO: grovel through /proc or check cpuid on x86 and similar // instructions on other architectures. +#warning hardware_concurrency not yet implemented return 0; // Means not computable [thread.thread.static] #endif // defined(CTL_HW) && defined(HW_NCPU) } diff --git a/system/lib/libcxx/typeinfo.cpp b/system/lib/libcxx/typeinfo.cpp index 7b47d741..60828944 100644 --- a/system/lib/libcxx/typeinfo.cpp +++ b/system/lib/libcxx/typeinfo.cpp @@ -53,8 +53,18 @@ std::bad_typeid::what() const _NOEXCEPT #ifdef __APPLE__ // On Darwin, the cxa_bad_* functions cannot be in the lower level library // because bad_cast and bad_typeid are defined in his higher level library - void __cxxabiv1::__cxa_bad_typeid() { throw std::bad_typeid(); } - void __cxxabiv1::__cxa_bad_cast() { throw std::bad_cast(); } + void __cxxabiv1::__cxa_bad_typeid() + { +#ifndef _LIBCPP_NO_EXCEPTIONS + throw std::bad_typeid(); +#endif + } + void __cxxabiv1::__cxa_bad_cast() + { +#ifndef _LIBCPP_NO_EXCEPTIONS + throw std::bad_cast(); +#endif + } #endif #endif // _LIBCPPABI_VERSION |