[cfe-commits] [libcxx] r140245 - in /libcxx/trunk: CREDITS.TXT include/__config include/__locale include/locale src/exception.cpp src/locale.cpp
David Chisnall
csdavec at swan.ac.uk
Wed Sep 21 01:39:44 PDT 2011
Author: theraven
Date: Wed Sep 21 03:39:44 2011
New Revision: 140245
URL: http://llvm.org/viewvc/llvm-project?rev=140245&view=rev
Log:
Fixes for FreeBSD, including some fairly obvious copy-and-paste errors.
libc++ now mostly works on FreeBSD with libcxxrt and this patch applied to the base system:
http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20110920/e666632c/xlocale-0001.obj
Summary of tests on FreeBSD:
****************************************************
Results for /root/libcxx/test:
using FreeBSD clang version 3.0 (trunk 135360) 20110717
Target: x86_64-unknown-freebsd9.0
Thread model: posix
with -std=c++0x -stdlib=libc++ -I/root/libcxx/include -L/root/libcxx/build/lib
----------------------------------------------------
sections without tests : 1
sections with failures : 48
sections without failures: 1015
+ ----
total number of sections : 1064
----------------------------------------------------
number of tests failed : 145
number of tests passed : 4179
+ ----
total number of tests : 4324
****************************************************
(Many due to this clang version not supporting C++ atomics)
More fixes to follow...
Modified:
libcxx/trunk/CREDITS.TXT
libcxx/trunk/include/__config
libcxx/trunk/include/__locale
libcxx/trunk/include/locale
libcxx/trunk/src/exception.cpp
libcxx/trunk/src/locale.cpp
Modified: libcxx/trunk/CREDITS.TXT
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/CREDITS.TXT?rev=140245&r1=140244&r2=140245&view=diff
==============================================================================
--- libcxx/trunk/CREDITS.TXT (original)
+++ libcxx/trunk/CREDITS.TXT Wed Sep 21 03:39:44 2011
@@ -21,3 +21,6 @@
E: breese at users.sourceforge.net
D: Initial regex prototype
+N: David Chisnall
+E: theraven at theravensnest dot org
+D: FreeBSD port and libcxxrt support.
Modified: libcxx/trunk/include/__config
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=140245&r1=140244&r2=140245&view=diff
==============================================================================
--- libcxx/trunk/include/__config (original)
+++ libcxx/trunk/include/__config Wed Sep 21 03:39:44 2011
@@ -297,7 +297,7 @@
#define __has_feature(__x) 0
#endif
-#ifdef __APPLE__
+#if __APPLE__ || __FreeBSD__
#define _LIBCPP_LOCALE__L_EXTENSIONS 1
#endif
@@ -305,7 +305,7 @@
#define _LIBCPP_STABLE_APPLE_ABI
#endif
-#ifdef __APPLE__
+#if __APPLE__ || __FreeBSD__
#define _LIBCPP_WCTYPE_IS_MASK
#endif
Modified: libcxx/trunk/include/__locale
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__locale?rev=140245&r1=140244&r2=140245&view=diff
==============================================================================
--- libcxx/trunk/include/__locale (original)
+++ libcxx/trunk/include/__locale Wed Sep 21 03:39:44 2011
@@ -302,13 +302,24 @@
class _LIBCPP_VISIBLE ctype_base
{
public:
-#ifdef __GLIBC__
+#if __GLIBC__
typedef unsigned short mask;
-#else
+ 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__
+#if __APPLE__
typedef __uint32_t mask;
+#elif __FreeBSD__
+ typedef unsigned long mask;
#endif
-
-#if __APPLE__ || __FreeBSD__
static const mask space = _CTYPE_S;
static const mask print = _CTYPE_R;
static const mask cntrl = _CTYPE_C;
@@ -319,18 +330,7 @@
static const mask punct = _CTYPE_P;
static const mask xdigit = _CTYPE_X;
static const mask blank = _CTYPE_B;
-#else // __APPLE__
- 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;
-#endif // __APPLE__
+#endif // __GLIBC__
static const mask alnum = alpha | digit;
static const mask graph = alnum | punct;
Modified: libcxx/trunk/include/locale
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/locale?rev=140245&r1=140244&r2=140245&view=diff
==============================================================================
--- libcxx/trunk/include/locale (original)
+++ libcxx/trunk/include/locale Wed Sep 21 03:39:44 2011
@@ -272,7 +272,7 @@
size_t __len, mbstate_t *__ps, locale_t __l)
{
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
- return mbsnrtowcs_l(__dest, __src, __nms__len, __ps, __l);
+ return mbsnrtowcs_l(__dest, __src, __nms, __len, __ps, __l);
#else
__locale_raii __current(uselocale(__l), uselocale);
return mbsnrtowcs(__dest, __src, __nms, __len, __ps);
@@ -295,7 +295,7 @@
int __mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l)
{
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
- return mbtowc(__pwc, __pmb, __max, __l);
+ return mbtowc_l(__pwc, __pmb, __max, __l);
#else
__locale_raii __current(uselocale(__l), uselocale);
return mbtowc(__pwc, __pmb, __max);
@@ -1754,13 +1754,13 @@
__nc = asprintf_l(&__nb, 0, __fmt, (int)__iob.precision(), __v);
#else
__nc = __asprintf_l(&__nb, __cloc(), __fmt,
- (int)__iob.precision());
+ (int)__iob.precision(), __v);
#endif
else
#ifdef _LIBCPP_STABLE_APPLE_ABI
__nc = asprintf_l(&__nb, 0, __fmt, __v);
#else
- __nc = __asprintf_l(&__nb, __cloc(), __fmt, (int)__iob.precision());
+ __nc = __asprintf_l(&__nb, __cloc(), __fmt, (int)__iob.precision(), __v);
#endif
if (__nb == 0)
__throw_bad_alloc();
@@ -1823,13 +1823,13 @@
__nc = asprintf_l(&__nb, 0, __fmt, (int)__iob.precision(), __v);
#else
__nc = __asprintf_l(&__nb, __cloc(), __fmt,
- (int)__iob.precision());
+ (int)__iob.precision(), __v);
#endif
else
#ifdef _LIBCPP_STABLE_APPLE_ABI
__nc = asprintf_l(&__nb, 0, __fmt, __v);
#else
- __nc = __asprintf_l(&__nb, __cloc(), __fmt, (int)__iob.precision());
+ __nc = __asprintf_l(&__nb, __cloc(), __fmt, __v);
#endif
if (__nb == 0)
__throw_bad_alloc();
Modified: libcxx/trunk/src/exception.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/exception.cpp?rev=140245&r1=140244&r2=140245&view=diff
==============================================================================
--- libcxx/trunk/src/exception.cpp (original)
+++ libcxx/trunk/src/exception.cpp Wed Sep 21 03:39:44 2011
@@ -13,16 +13,24 @@
#if __APPLE__
#include <cxxabi.h>
using namespace __cxxabiv1;
+ using namespace __cxxabiv1::__cxxabiapple;
// On Darwin, there are two STL shared libraries and a lower level ABI
// shared libray. The globals holding the current terminate handler and
// current unexpected handler are in the ABI library.
#define __terminate_handler __cxxabiapple::__cxa_terminate_handler
#define __unexpected_handler __cxxabiapple::__cxa_unexpected_handler
+ #define HAVE_DEPENDENT_EH_ABI 1
+#elif defined(LIBCXXRT)
+ #include <cxxabi.h>
+ using namespace __cxxabiv1;
+ #define HAVE_DEPENDENT_EH_ABI 1
#else // __APPLE__
static std::terminate_handler __terminate_handler;
static std::unexpected_handler __unexpected_handler;
#endif // __APPLE__
+#ifndef LIBCXXRT
+// libcxxrt provides implementations of these functions itself.
std::unexpected_handler
std::set_unexpected(std::unexpected_handler func) _NOEXCEPT
{
@@ -76,18 +84,19 @@
}
#endif // _LIBCPP_NO_EXCEPTIONS
}
+#endif // LIBCXXRT
bool std::uncaught_exception() _NOEXCEPT
{
#if __APPLE__
// on Darwin, there is a helper function so __cxa_get_globals is private
return __cxxabiapple::__cxa_uncaught_exception();
+#elif LIBCXXRT
+ __cxa_eh_globals * globals = __cxa_get_globals();
+ return (globals->uncaughtExceptions != 0);
#else // __APPLE__
#warning uncaught_exception not yet implemented
::abort();
- // Not provided by Ubuntu gcc-4.2.4's cxxabi.h.
- // __cxa_eh_globals * globals = __cxa_get_globals();
- // return (globals->uncaughtExceptions != 0);
#endif // __APPLE__
}
@@ -114,8 +123,8 @@
exception_ptr::~exception_ptr() _NOEXCEPT
{
-#if __APPLE__
- __cxxabiapple::__cxa_decrement_exception_refcount(__ptr_);
+#if HAVE_DEPENDENT_EH_ABI
+ __cxa_decrement_exception_refcount(__ptr_);
#else
#warning exception_ptr not yet implemented
::abort();
@@ -125,8 +134,8 @@
exception_ptr::exception_ptr(const exception_ptr& other) _NOEXCEPT
: __ptr_(other.__ptr_)
{
-#if __APPLE__
- __cxxabiapple::__cxa_increment_exception_refcount(__ptr_);
+#if HAVE_DEPENDENT_EH_ABI
+ __cxa_increment_exception_refcount(__ptr_);
#else
#warning exception_ptr not yet implemented
::abort();
@@ -135,11 +144,11 @@
exception_ptr& exception_ptr::operator=(const exception_ptr& other) _NOEXCEPT
{
-#if __APPLE__
+#if HAVE_DEPENDENT_EH_ABI
if (__ptr_ != other.__ptr_)
{
- __cxxabiapple::__cxa_increment_exception_refcount(other.__ptr_);
- __cxxabiapple::__cxa_decrement_exception_refcount(__ptr_);
+ __cxa_increment_exception_refcount(other.__ptr_);
+ __cxa_decrement_exception_refcount(__ptr_);
__ptr_ = other.__ptr_;
}
return *this;
@@ -171,12 +180,12 @@
std::exception_ptr std::current_exception() _NOEXCEPT
{
-#if __APPLE__
+#if HAVE_DEPENDENT_EH_ABI
// be nicer if there was a constructor that took a ptr, then
// this whole function would be just:
// return exception_ptr(__cxa_current_primary_exception());
std::exception_ptr ptr;
- ptr.__ptr_ = __cxxabiapple::__cxa_current_primary_exception();
+ ptr.__ptr_ = __cxa_current_primary_exception();
return ptr;
#else // __APPLE__
#warning exception_ptr not yet implemented
@@ -186,8 +195,8 @@
void std::rethrow_exception(exception_ptr p)
{
-#if __APPLE__
- __cxxabiapple::__cxa_rethrow_primary_exception(p.__ptr_);
+#if HAVE_DEPENDENT_EH_ABI
+ __cxa_rethrow_primary_exception(p.__ptr_);
// if p.__ptr_ is NULL, above returns so we terminate
terminate();
#else // __APPLE__
Modified: libcxx/trunk/src/locale.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/locale.cpp?rev=140245&r1=140244&r2=140245&view=diff
==============================================================================
--- libcxx/trunk/src/locale.cpp (original)
+++ libcxx/trunk/src/locale.cpp Wed Sep 21 03:39:44 2011
@@ -733,7 +733,7 @@
wchar_t
ctype<wchar_t>::do_toupper(char_type c) const
{
-#ifndef _LIBCPP_STABLE_APPLE_ABI
+#if !(defined(_LIBCPP_STABLE_APPLE_ABI) || defined(__FreeBSD__))
return isascii(c) ? ctype<char>::__classic_upper_table()[c] : c;
#else
return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c;
@@ -744,7 +744,7 @@
ctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const
{
for (; low != high; ++low)
-#ifndef _LIBCPP_STABLE_APPLE_ABI
+#if !(defined(_LIBCPP_STABLE_APPLE_ABI) || defined(__FreeBSD__))
*low = isascii(*low) ? ctype<char>::__classic_upper_table()[*low]
: *low;
#else
@@ -908,11 +908,12 @@
const ctype<char>::mask*
ctype<char>::classic_table() _NOEXCEPT
{
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__FreeBSD__)
return _DefaultRuneLocale.__runetype;
#elif defined(__GLIBC__)
return __cloc()->__ctype_b;
-// This is assumed to be safe.
+// This is assumed to be safe, which is a nonsense assumption because we're
+// going to end up dereferencing it later...
#else
return NULL;
#endif
@@ -922,7 +923,7 @@
const int*
ctype<char>::__classic_lower_table() _NOEXCEPT
{
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__FreeBSD__)
return _DefaultRuneLocale.__maplower;
#elif defined(__GLIBC__)
return __cloc()->__ctype_tolower;
@@ -934,7 +935,7 @@
const int*
ctype<char>::__classic_upper_table() _NOEXCEPT
{
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__FreeBSD__)
return _DefaultRuneLocale.__mapupper;
#elif defined(__GLIBC__)
return __cloc()->__ctype_toupper;
@@ -1036,6 +1037,7 @@
#ifdef _LIBCPP_WCTYPE_IS_MASK
return static_cast<bool>(iswctype_l(c, m, __l));
#else
+ // FIXME: This is broken for things that test more than one flag.
if (m & space && !iswspace_l(c, __l)) return false;
if (m & print && !iswprint_l(c, __l)) return false;
if (m & cntrl && !iswcntrl_l(c, __l)) return false;
More information about the cfe-commits
mailing list