[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