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/src/locale.cpp b/src/locale.cpp
index ba68658..089fae6 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 @@
     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 eca97bc..6140b74 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 cc8c327..f27136a 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