summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CREDITS.TXT2
-rw-r--r--include/__config15
-rw-r--r--include/__locale16
-rw-r--r--include/cmath34
-rw-r--r--include/cstdlib3
-rw-r--r--include/cstring2
-rw-r--r--src/locale.cpp11
-rw-r--r--src/random.cpp3
-rw-r--r--src/thread.cpp2
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