diff options
-rw-r--r-- | CREDITS.TXT | 2 | ||||
-rw-r--r-- | include/__config | 15 | ||||
-rw-r--r-- | include/__locale | 16 | ||||
-rw-r--r-- | include/cmath | 34 | ||||
-rw-r--r-- | include/cstdlib | 3 | ||||
-rw-r--r-- | include/cstring | 2 | ||||
-rw-r--r-- | src/locale.cpp | 11 | ||||
-rw-r--r-- | src/random.cpp | 3 | ||||
-rw-r--r-- | src/thread.cpp | 2 |
9 files changed, 79 insertions, 9 deletions
diff --git a/CREDITS.TXT b/CREDITS.TXT index 1256bf1cc..378e66173 100644 --- a/CREDITS.TXT +++ b/CREDITS.TXT @@ -23,7 +23,7 @@ D: Initial regex prototype N: David Chisnall E: theraven at theravensnest dot org -D: FreeBSD port and libcxxrt support. +D: FreeBSD and Solaris ports, libcxxrt support, some atomics work. N: Ruben Van Boxem E: vanboxem dot ruben at gmail dot com diff --git a/include/__config b/include/__config index 6d551c943..e0b9582cd 100644 --- a/include/__config +++ b/include/__config @@ -58,6 +58,17 @@ # endif #endif // _WIN32 +#ifdef __sun__ +# include <sys/isa_defs.h> +# ifdef _LITTLE_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN 1 +# define _LIBCPP_BIG_ENDIAN 0 +# else +# define _LIBCPP_LITTLE_ENDIAN 0 +# define _LIBCPP_BIG_ENDIAN 1 +# endif +#endif // __sun__ + #if !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN) # include <endian.h> # if __BYTE_ORDER == __LITTLE_ENDIAN @@ -394,7 +405,7 @@ template <unsigned> struct __static_assert_check {}; #define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) #endif // _LIBCPP_HAS_NO_STRONG_ENUMS -#if __APPLE__ || __FreeBSD__ || _WIN32 +#if __APPLE__ || __FreeBSD__ || _WIN32 || __sun__ #define _LIBCPP_LOCALE__L_EXTENSIONS 1 #endif #if __FreeBSD__ @@ -405,7 +416,7 @@ template <unsigned> struct __static_assert_check {}; #define _LIBCPP_HAS_DEFAULTRUNELOCALE #endif -#if __APPLE__ || __FreeBSD__ +#if __APPLE__ || __FreeBSD__ || __sun__ #define _LIBCPP_WCTYPE_IS_MASK #endif diff --git a/include/__locale b/include/__locale index 54afdf9a5..b1e07113e 100644 --- a/include/__locale +++ b/include/__locale @@ -21,7 +21,7 @@ #include <locale.h> #if _WIN32 # include <support/win32/locale_win32.h> -#elif (__GLIBC__ || __APPLE__ || __FreeBSD__) +#elif (__GLIBC__ || __APPLE__ || __FreeBSD__ || __sun__) # include <xlocale.h> #endif // _WIN32 || __GLIBC__ || __APPLE__ || __FreeBSD_ @@ -348,7 +348,19 @@ public: static const mask punct = _CTYPE_P; static const mask xdigit = _CTYPE_X; static const mask blank = _CTYPE_B; -#else // __GLIBC__ || _WIN32 || __APPLE__ || __FreeBSD__ +#elif __sun__ + typedef unsigned int mask; + static const mask space = _ISSPACE; + static const mask print = _ISPRINT; + static const mask cntrl = _ISCNTRL; + static const mask upper = _ISUPPER; + static const mask lower = _ISLOWER; + static const mask alpha = _ISALPHA; + static const mask digit = _ISDIGIT; + static const mask punct = _ISPUNCT; + static const mask xdigit = _ISXDIGIT; + static const mask blank = _ISBLANK; +#else // __GLIBC__ || _WIN32 || __APPLE__ || __FreeBSD__ || __sun__ typedef unsigned long mask; static const mask space = 1<<0; static const mask print = 1<<1; diff --git a/include/cmath b/include/cmath index f0b985c8b..50316bd5e 100644 --- a/include/cmath +++ b/include/cmath @@ -646,13 +646,17 @@ using ::isunordered; using ::float_t; using ::double_t; +#ifndef __sun__ // abs +#endif // __sun__ template <class _A1> inline _LIBCPP_INLINE_VISIBILITY typename enable_if<is_floating_point<_A1>::value, _A1>::type abs(_A1 __x) {return fabs(__x);} +#ifndef __sun__ + // acos using ::acos; @@ -769,16 +773,20 @@ inline _LIBCPP_INLINE_VISIBILITY typename enable_if<is_integral<_A1>::value, double>::type cosh(_A1 __x) {return cosh((double)__x);} +#endif // __sun__ // exp using ::exp; using ::expf; +#ifndef __sun__ + #ifndef _MSC_VER inline _LIBCPP_INLINE_VISIBILITY float exp(float __x) {return expf(__x);} inline _LIBCPP_INLINE_VISIBILITY long double exp(long double __x) {return expl(__x);} #endif + template <class _A1> inline _LIBCPP_INLINE_VISIBILITY typename enable_if<is_integral<_A1>::value, double>::type @@ -816,8 +824,10 @@ floor(_A1 __x) {return floor((double)__x);} // fmod +#endif //__sun__ using ::fmod; using ::fmodf; +#ifndef __sun__ #ifndef _MSC_VER inline _LIBCPP_INLINE_VISIBILITY float fmod(float __x, float __y) {return fmodf(__x, __y);} @@ -840,6 +850,7 @@ fmod(_A1 __x, _A2 __y) return fmod((__result_type)__x, (__result_type)__y); } + // frexp using ::frexp; @@ -872,8 +883,10 @@ ldexp(_A1 __x, int __e) {return ldexp((double)__x, __e);} // log +#endif // __sun__ using ::log; using ::logf; +#ifndef __sun__ #ifndef _MSC_VER inline _LIBCPP_INLINE_VISIBILITY float log(float __x) {return logf(__x);} @@ -885,6 +898,7 @@ inline _LIBCPP_INLINE_VISIBILITY typename enable_if<is_integral<_A1>::value, double>::type log(_A1 __x) {return log((double)__x);} + // log10 using ::log10; @@ -912,9 +926,12 @@ inline _LIBCPP_INLINE_VISIBILITY long double modf(long double __x, long double* // pow +#endif // __sun__ using ::pow; using ::powf; +#ifndef __sun__ + #ifndef _MSC_VER inline _LIBCPP_INLINE_VISIBILITY float pow(float __x, float __y) {return powf(__x, __y);} inline _LIBCPP_INLINE_VISIBILITY long double pow(long double __x, long double __y) {return powl(__x, __y);} @@ -936,6 +953,7 @@ pow(_A1 __x, _A2 __y) return pow((__result_type)__x, (__result_type)__y); } + // sin using ::sin; @@ -968,10 +986,12 @@ sinh(_A1 __x) {return sinh((double)__x);} // sqrt +#endif // __sun__ using ::sqrt; using ::sqrtf; -#ifndef _MSC_VER + +#if !(defined(_MSC_VER) || defined(__sun__)) inline _LIBCPP_INLINE_VISIBILITY float sqrt(float __x) {return sqrtf(__x);} inline _LIBCPP_INLINE_VISIBILITY long double sqrt(long double __x) {return sqrtl(__x);} #endif @@ -981,10 +1001,14 @@ inline _LIBCPP_INLINE_VISIBILITY typename enable_if<is_integral<_A1>::value, double>::type sqrt(_A1 __x) {return sqrt((double)__x);} +#ifndef __sun__ + // tan +#endif // __sun__ using ::tan; using ::tanf; +#ifndef __sun__ #ifndef _MSC_VER inline _LIBCPP_INLINE_VISIBILITY float tan(float __x) {return tanf(__x);} @@ -1294,11 +1318,13 @@ using ::lgammaf; inline _LIBCPP_INLINE_VISIBILITY float lgamma(float __x) {return lgammaf(__x);} inline _LIBCPP_INLINE_VISIBILITY long double lgamma(long double __x) {return lgammal(__x);} + template <class _A1> inline _LIBCPP_INLINE_VISIBILITY typename enable_if<is_integral<_A1>::value, double>::type lgamma(_A1 __x) {return lgamma((double)__x);} + // llrint using ::llrint; @@ -1392,8 +1418,10 @@ lround(_A1 __x) {return lround((double)__x);} // nan +#endif // __sun__ using ::nan; using ::nanf; +#ifndef __sun__ // nearbyint @@ -1635,6 +1663,10 @@ using ::tgammal; using ::truncl; #endif // !_MSC_VER +#else +using ::lgamma; +using ::lgammaf; +#endif // __sun__ _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP_CMATH diff --git a/include/cstdlib b/include/cstdlib index 5d8a9d734..1158db2c0 100644 --- a/include/cstdlib +++ b/include/cstdlib @@ -132,7 +132,8 @@ using ::wctomb; using ::mbstowcs; using ::wcstombs; -#ifndef _MSC_VER // MSVC already has the correct prototype in <stdlib.h.h> #ifdef __cplusplus +// MSVC already has the correct prototype in <stdlib.h.h> #ifdef __cplusplus +#if !defined(_MSC_VER) && !defined(__sun__) inline _LIBCPP_INLINE_VISIBILITY long abs( long __x) {return labs(__x);} inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) {return llabs(__x);} diff --git a/include/cstring b/include/cstring index dd49d802d..13bb11892 100644 --- a/include/cstring +++ b/include/cstring @@ -94,7 +94,7 @@ using ::strspn; using ::strstr; // MSVC, GNU libc and its derivates already have the correct prototype in <string.h> #ifdef __cplusplus -#if !defined(__GLIBC__) && !defined(_MSC_VER) +#if !defined(__GLIBC__) && !defined(_MSC_VER) && !defined(__sun__) inline _LIBCPP_INLINE_VISIBILITY char* strchr( char* __s, int __c) {return ::strchr(__s, __c);} inline _LIBCPP_INLINE_VISIBILITY char* strpbrk( char* __s1, const char* __s2) {return ::strpbrk(__s1, __s2);} inline _LIBCPP_INLINE_VISIBILITY char* strrchr( char* __s, int __c) {return ::strrchr(__s, __c);} diff --git a/src/locale.cpp b/src/locale.cpp index ba6865881..089fae6a3 100644 --- a/src/locale.cpp +++ b/src/locale.cpp @@ -7,6 +7,12 @@ // //===----------------------------------------------------------------------===// +// On Solaris, we need to define something to make the C99 parts of localeconv +// visible. +#ifdef __sun__ +#define _LCONV_C99 +#endif + #include "string" #include "locale" #include "codecvt" @@ -925,11 +931,16 @@ ctype<char>::classic_table() _NOEXCEPT return _DefaultRuneLocale.__runetype; #elif defined(__GLIBC__) return __cloc()->__ctype_b; +#elif __sun__ + return __ctype_mask; #elif _WIN32 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... #else + // Platform not supported: abort so the person doing the port knows what to + // fix + abort(); return NULL; #endif } diff --git a/src/random.cpp b/src/random.cpp index eca97bc81..6140b74ec 100644 --- a/src/random.cpp +++ b/src/random.cpp @@ -10,6 +10,9 @@ #include "random" #include "system_error" +#ifdef __sun__ +#define rename solaris_headers_are_broken +#endif #include <fcntl.h> #include <unistd.h> #include <errno.h> diff --git a/src/thread.cpp b/src/thread.cpp index cc8c3274b..f27136a53 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -12,7 +12,7 @@ #include "vector" #include "future" #include <sys/types.h> -#if !_WIN32 +#if !_WIN32 && !__sun__ #include <sys/sysctl.h> #endif // _WIN32 |