From fbbfd09214a793f55fea9203760452926de1594d Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Fri, 23 Jan 2015 22:22:36 +0000 Subject: [PATCH] Get libc++ building on Sun Solaris. Patch from C Bergstrom. llvm-svn: 226947 --- libcxx/include/__locale | 1 + libcxx/include/cmath | 2 +- libcxx/include/random | 4 +- libcxx/include/support/solaris/xlocale.h | 96 +------------- libcxx/src/support/solaris/xlocale.c | 213 ++----------------------------- 5 files changed, 20 insertions(+), 296 deletions(-) diff --git a/libcxx/include/__locale b/libcxx/include/__locale index 42cf4d9..c5c38d7 100644 --- a/libcxx/include/__locale +++ b/libcxx/include/__locale @@ -30,6 +30,7 @@ # include # endif #elif defined(__sun__) +# include # include #elif defined(_NEWLIB_VERSION) # include diff --git a/libcxx/include/cmath b/libcxx/include/cmath index d3aa4be..c2c6301 100644 --- a/libcxx/include/cmath +++ b/libcxx/include/cmath @@ -654,7 +654,7 @@ using ::double_t; // abs -#if !defined(_AIX) +#if !defined(_AIX) && !defined(__sun__) inline _LIBCPP_INLINE_VISIBILITY float abs(float __lcpp_x) _NOEXCEPT {return fabsf(__lcpp_x);} diff --git a/libcxx/include/random b/libcxx/include/random index a8d21a2..bccf92a 100644 --- a/libcxx/include/random +++ b/libcxx/include/random @@ -1634,9 +1634,10 @@ class piecewise_linear_distribution #include <__config> #include +#include +#include #include #include -#include #include #include #include @@ -1644,7 +1645,6 @@ class piecewise_linear_distribution #include #include #include -#include #include <__undef_min_max> diff --git a/libcxx/include/support/solaris/xlocale.h b/libcxx/include/support/solaris/xlocale.h index 6b5b544..62b0d74 100644 --- a/libcxx/include/support/solaris/xlocale.h +++ b/libcxx/include/support/solaris/xlocale.h @@ -21,107 +21,16 @@ extern "C" { #endif -typedef struct _LC_locale_t* locale_t; - -#define LC_COLLATE_MASK (1<<0) -#define LC_CTYPE_MASK (1<<1) -#define LC_MESSAGES_MASK (1<<2) -#define LC_MONETARY_MASK (1<<3) -#define LC_NUMERIC_MASK (1<<4) -#define LC_TIME_MASK (1<<5) -#define LC_ALL_MASK (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MESSAGES_MASK | \ - LC_MONETARY_MASK | LC_NUMERIC_MASK | LC_TIME_MASK) - -#define LC_GLOBAL_LOCALE ((locale_t)-1) - -size_t __mb_cur_max(locale_t l); -#define MB_CUR_MAX_L(l) __mb_cur_max(l) - -locale_t newlocale(int mask, const char * locale, locale_t base); -void freelocale(locale_t loc); - -wint_t btowc_l(int __c, locale_t __l); - -int wctob_l(wint_t __c, locale_t __l); - -size_t wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l); - -size_t mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n, - mbstate_t *__ps, locale_t __l); - -int mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l); - -size_t mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l); - -struct lconv *localeconv_l(locale_t __l); - -size_t mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len, - mbstate_t *__ps, locale_t __l); - -int sprintf_l(char *__s, locale_t __l, const char *__format, ...); - int snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...); - int asprintf_l(char **__s, locale_t __l, const char *__format, ...); int sscanf_l(const char *__s, locale_t __l, const char *__format, ...); -int isalnum_l(int,locale_t); -int isalpha_l(int,locale_t); -int isblank_l(int,locale_t); -int iscntrl_l(int,locale_t); -int isdigit_l(int,locale_t); -int isgraph_l(int,locale_t); -int islower_l(int,locale_t); -int isprint_l(int,locale_t); -int ispunct_l(int,locale_t); -int isspace_l(int,locale_t); -int isupper_l(int,locale_t); -int isxdigit_l(int,locale_t); - -int iswalnum_l(wchar_t,locale_t); -int iswalpha_l(wchar_t,locale_t); -int iswblank_l(wchar_t,locale_t); -int iswcntrl_l(wchar_t,locale_t); -int iswdigit_l(wchar_t,locale_t); -int iswgraph_l(wchar_t,locale_t); -int iswlower_l(wchar_t,locale_t); -int iswprint_l(wchar_t,locale_t); -int iswpunct_l(wchar_t,locale_t); -int iswspace_l(wchar_t,locale_t); -int iswupper_l(wchar_t,locale_t); -int iswxdigit_l(wchar_t,locale_t); - -int iswctype_l(wint_t, wctype_t, locale_t); - int toupper_l(int __c, locale_t __l); int tolower_l(int __c, locale_t __l); -wint_t towupper_l(wint_t __c, locale_t __l); -wint_t towlower_l(wint_t __c, locale_t __l); - - -int strcoll_l(const char *__s1, const char *__s2, locale_t __l); -int wcscoll_l(const wchar_t *__s1, const wchar_t *__s2, locale_t __l); -size_t strftime_l(char *__s, size_t __size, const char *__fmt, const struct tm - *__tm, locale_t __l); - -size_t strxfrm_l(char *__s1, const char *__s2, size_t __n, locale_t __l); - -size_t wcsxfrm_l(wchar_t *__ws1, const wchar_t *__ws2, size_t __n, - locale_t __l); - - -size_t -mbsnrtowcs_l(wchar_t * __restrict dst, const char ** __restrict src, - size_t nms, size_t len, mbstate_t * __restrict ps, locale_t loc); - - -size_t -wcsnrtombs_l(char * __restrict dst, const wchar_t ** __restrict src, - size_t nwc, size_t len, mbstate_t * __restrict ps, locale_t loc); - -locale_t __cloc(void); +struct lconv *localeconv(void); +struct lconv *localeconv_l(locale_t __l); // FIXME: These are quick-and-dirty hacks to make things pretend to work static inline @@ -150,6 +59,7 @@ unsigned long strtoul_l(const char *__nptr, char **__endptr, return strtoul(__nptr, __endptr, __base); } + #ifdef __cplusplus } #endif diff --git a/libcxx/src/support/solaris/xlocale.c b/libcxx/src/support/solaris/xlocale.c index 81750a8..9125eea 100644 --- a/libcxx/src/support/solaris/xlocale.c +++ b/libcxx/src/support/solaris/xlocale.c @@ -8,167 +8,25 @@ //===----------------------------------------------------------------------===// #ifdef __sun__ - + +#include "support/solaris/xlocale.h" +#include #include -#include -#include -#include -#include -#include -#include #include -#include "support/solaris/xlocale.h" - -static _LC_locale_t *__C_locale; - -#define FIX_LOCALE(l) l = (l == 0) ? __C_locale : l - -#include "mbsnrtowcs.inc" -#include "wcsnrtombs.inc" - -size_t __mb_cur_max(locale_t __l) { - FIX_LOCALE(__l); - return (__l->lc_ctype->cmapp->cm_mb_cur_max); -} - -wint_t btowc_l(int __c, locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_ctype->cmapp->core.user_api->btowc(__l->lc_ctype->cmapp, __c); -} - -int wctob_l(wint_t __c, locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_ctype->cmapp->core.user_api->wctob(__l->lc_ctype->cmapp, __c); -} - -size_t wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_ctype->cmapp->core.user_api->wcrtomb(__l->lc_ctype->cmapp, - __s, __wc, __ps); -} - -size_t mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n, - mbstate_t *__ps, locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_ctype->cmapp->core.user_api->mbrtowc(__l->lc_ctype->cmapp, - __pwc, __s, __n, __ps); -} - -int mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_ctype->cmapp->core.user_api->mbtowc(__l->lc_ctype->cmapp, - __pwc, __pmb, __max); -} - -size_t mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_ctype->cmapp->core.user_api->mbrlen(__l->lc_ctype->cmapp, __s, - __n, __ps); -} - -struct lconv *localeconv_l(locale_t __l) { - FIX_LOCALE(__l); - return __l->core.user_api->localeconv(__l); -} - -size_t mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len, - mbstate_t *__ps, locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_ctype->cmapp->core.user_api->mbsrtowcs(__l->lc_ctype->cmapp, - __dest, __src, __len, __ps); -} - -int wcscoll_l(const wchar_t *__s1, const wchar_t *__s2, locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_collate->core.user_api->wcscoll(__l->lc_collate, - __s1, __s2); -} - -int strcoll_l(const char *__s1, const char *__s2, locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_collate->core.user_api->strcoll(__l->lc_collate, - __s1, __s2); -} - -size_t strxfrm_l(char *__s1, const char *__s2, size_t __n, locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_collate->core.user_api->strxfrm(__l->lc_collate, - __s1, __s2, __n); -} -size_t strftime_l(char *__s, size_t __size, const char *__fmt, const struct tm - *__tm, locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_time->core.user_api->strftime(__l->lc_time, - __s, __size, __fmt, __tm); -} - -size_t wcsxfrm_l(wchar_t *__ws1, const wchar_t *__ws2, size_t __n, - locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_collate->core.user_api->wcsxfrm(__l->lc_collate, - __ws1, __ws2, __n); -} -#define LOCALE_ISCTYPE(ctype, m) \ - int is##ctype##_l(int __c, locale_t __l) { \ - if ((__c < 0) || (__c > 255)) return 0;\ - FIX_LOCALE(__l);\ - return __l->lc_ctype->mask[__c] & m;\ - }\ - int isw##ctype##_l(wchar_t __c, locale_t __l) { \ - FIX_LOCALE(__l);\ - return __l->lc_ctype->core.user_api->iswctype(__l->lc_ctype, __c, m);\ - } -LOCALE_ISCTYPE(alnum, _ISALNUM) -LOCALE_ISCTYPE(alpha, _ISALPHA) -LOCALE_ISCTYPE(blank, _ISALPHA) -LOCALE_ISCTYPE(cntrl, _ISCNTRL) -LOCALE_ISCTYPE(digit, _ISDIGIT) -LOCALE_ISCTYPE(graph, _ISGRAPH) -LOCALE_ISCTYPE(lower, _ISLOWER) -LOCALE_ISCTYPE(print, _ISPRINT) -LOCALE_ISCTYPE(punct, _ISPUNCT) -LOCALE_ISCTYPE(space, _ISSPACE) -LOCALE_ISCTYPE(upper, _ISUPPER) -LOCALE_ISCTYPE(xdigit, _ISXDIGIT) - -int iswctype_l(wint_t __c, wctype_t __m, locale_t __l) { - FIX_LOCALE(__l);\ - return __l->lc_ctype->core.user_api->iswctype(__l->lc_ctype, __c, __m);\ +int isxdigit_l(int __c, locale_t __l) { + return isxdigit(__c); } -int toupper_l(int __c, locale_t __l) { - FIX_LOCALE(__l); - if ((__c < 0) || (__c > __l->lc_ctype->max_upper)) return __c; - return __l->lc_ctype->upper[__c]; -} -int tolower_l(int __c, locale_t __l) { - FIX_LOCALE(__l); - if ((__c < 0) || (__c > __l->lc_ctype->max_lower)) return __c; - return __l->lc_ctype->lower[__c]; -} -wint_t towupper_l(wint_t __c, locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_ctype->core.user_api->towupper(__l->lc_ctype, __c); -} -wint_t towlower_l(wint_t __c, locale_t __l) { - FIX_LOCALE(__l); - return __l->lc_ctype->core.user_api->towlower(__l->lc_ctype, __c); +int iswxdigit_l(wchar_t __c, locale_t __l) { + return isxdigit(__c); } // FIXME: This disregards the locale, which is Very Wrong #define vsnprintf_l(__s, __n, __l, __format, __va) \ vsnprintf(__s, __n, __format, __va) -int sprintf_l(char *__s, locale_t __l, const char *__format, ...) { - va_list __va; - va_start(__va, __format); - int __res = vsnprintf_l(__s, SIZE_MAX, __l, __format, __va); - va_end(__va); - return __res; -} - int snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) { va_list __va; @@ -196,58 +54,13 @@ int sscanf_l(const char *__s, locale_t __l, const char *__format, ...) { return __res; } -locale_t newlocale(int mask, const char *locale, locale_t base) { - - if ((locale == NULL) || (locale[0] == '\0') || - ((locale[0] == 'C') && (locale[1] == '\0'))) - { - return __C_locale; - } - - // Solaris locales are shared libraries that contain - char *path; -#ifdef __LP64 - asprintf(&path, "/usr/lib/locale/%1$s/amd64/%1$s.so.3", locale); -#else - asprintf(&path, "/usr/lib/locale/%1$s/%1$s.so.3", locale); -#endif - void *handle = dlopen(path, RTLD_LOCAL | RTLD_NOW); - free(path); - if (!handle) - return 0; - _LC_locale_t *(*init)() = dlsym(handle, "instantiate"); - if (!init) - return 0; - _LC_locale_t *p = init(); - if (!p) - return 0; - - if (!base) - base = __C_locale; - - locale_t ret = calloc(1, sizeof(struct _LC_locale_t)); - memcpy(ret, p, sizeof (_LC_locale_t)); - ret->lc_collate = (mask & LC_COLLATE_MASK) ? p->lc_collate : base->lc_collate; - ret->lc_ctype = (mask & LC_CTYPE_MASK) ? p->lc_ctype : base->lc_ctype; - ret->lc_messages = (mask & LC_MESSAGES_MASK) ? p->lc_messages : base->lc_messages; - ret->lc_monetary = (mask & LC_MONETARY_MASK) ? p->lc_monetary : base->lc_monetary; - ret->lc_time = (mask & LC_TIME_MASK) ? p->lc_time : base->lc_time; - return ret; +size_t mbrtowc_l(wchar_t *__pwc, const char *__pmb, + size_t __max, mbstate_t *__ps, locale_t __loc) { + return mbrtowc(__pwc, __pmb, __max, __ps); } -void freelocale(locale_t loc) -{ - if (loc != __C_locale) - free(loc); +struct lconv *localeconv_l(locale_t __l) { + return localeconv(); } -__attribute__((constructor)) -static void setupCLocale(void) { - // The default initial locale is the C locale. This is a statically - // allocated locale inside libc. At program start, __lc_locale will point to - // this. We need to grab a copy because it's not a public symbol. If we had - // access to the source code for libc, then we'd just use it directly... - assert('C' == setlocale(LC_ALL, 0)[0]); - __C_locale = __lc_locale; -} -#endif +#endif // __sun__ -- 2.7.4