Solaris port.  Currently sees around 200 test failures, mostly related to
Solaris not providing some of the locales that the test suite uses.

Note: This depends on an xlocale (partial) implementation for Solaris and a
couple of fixed standard headers.  These will be committed to a branch later
today.

llvm-svn: 151720
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 14c25b80e9be5aab9b503a53f810c5bbffe4d632
diff --git a/include/cmath b/include/cmath
index f0b985c..50316bd 100644
--- a/include/cmath
+++ b/include/cmath
@@ -646,13 +646,17 @@
 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 @@
 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 @@
 
 // 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 @@
     return fmod((__result_type)__x, (__result_type)__y);
 }
 
+
 // frexp
 
 using ::frexp;
@@ -872,8 +883,10 @@
 
 // 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 @@
 typename enable_if<is_integral<_A1>::value, double>::type
 log(_A1 __x) {return log((double)__x);}
 
+
 // log10
 
 using ::log10;
@@ -912,9 +926,12 @@
 
 // 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 @@
     return pow((__result_type)__x, (__result_type)__y);
 }
 
+
 // sin
 
 using ::sin;
@@ -968,10 +986,12 @@
 
 // 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 @@
 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 @@
 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 @@
 
 // nan
 
+#endif // __sun__
 using ::nan;
 using ::nanf;
+#ifndef __sun__
 
 // nearbyint
 
@@ -1635,6 +1663,10 @@
 using ::truncl;
 #endif // !_MSC_VER
 
+#else 
+using ::lgamma;
+using ::lgammaf;
+#endif // __sun__
 _LIBCPP_END_NAMESPACE_STD
 
 #endif  // _LIBCPP_CMATH