Skip to content
  1. Aug 05, 2012
    • Howard Hinnant's avatar
      Andrew Morrow: The current CMake setup for libc++ incorrectly uses the variable · 73984be0
      Howard Hinnant authored
      LLVM_ENABLE_ASSERTIONS instead of LIBCXX_ENABLE_ASSERTIONS when
      figuring out what _DEBUG/NDEBUG defines to set. It also tries to test
      the non-existent variable 'uppercase_CMAKE_BUILD_TYPE', which the top
      level LLVM CMakeLists.txt sets up, but which the top level libc++
      CMakeLists.txt currently does not. Changing the variable name tested
      and creating the uppercase release name variable allows libc++ to
      honor the LIBCXX_ENABLE_ASSERTIONS option correctly.
      
      llvm-svn: 161308
      73984be0
  2. Aug 04, 2012
  3. Aug 03, 2012
    • Howard Hinnant's avatar
      Performance tweaking rotate. · aca09de3
      Howard Hinnant authored
      rotate is a critical algorithm because it is often used by other algorithms,
      both std and non-std.  The main thrust of this optimization is a specialized
      algorithm when the 'distance' to be shifted is 1 (either left or right).  To my
      surprise, this 'optimization' was not effective for types like std::string.
      std::string favors rotate algorithms which only use swap.  But for types like
      scalars, and especially when the sequence is random access, these new
      specializations are a big win.  If it is a vector<size_t> for example, the
      rotate is done via a memmove and can be several times faster than the gcd
      algorithm.
      
      I'm using is_trivially_move_assignable to distinguish between types like int and
      types like string.  This is obviously an ad-hoc approximation, but I haven't
      found a case where it doesn't give good results.
      
      I've used a 'static if' (with is_trivially_move_assignable) in three places. 
      Testing with both -Os and -O3 showed that clang eliminated all code not be
      executed by the 'static if' (including the 'static if' itself).
      
      llvm-svn: 161247
      aca09de3
  4. Aug 02, 2012
    • Howard Hinnant's avatar
      Andrew Morrow: The attached patch updates the initialization of the 'struct tm' in · 0cbea7fa
      Howard Hinnant authored
      __time_get_storage<char> to match the initialization behavior in
      __time_get_storage<wchar>. Without the initialization, valgrind
      reports errors in the subsequent calls to strftime_l.
      
      llvm-svn: 161196
      0cbea7fa
    • Howard Hinnant's avatar
      Andrew Morrow: There are two tests under test/utilities/memory that heap allocate two · fb2f0a5e
      Howard Hinnant authored
      integers which remain unused and are subsequently leaked, so the test
      fail when run under valgrind. Unless I'm overlooking a subtle reason
      why they are needed I think they can be removed, allowing these tests
      to pass under valgrind. The attached patch removes the variables. If
      there is a reason for them to exist, I can change this to just delete
      them at the end of the test.
      
      llvm-svn: 161195
      fb2f0a5e
    • Howard Hinnant's avatar
      Andrew Morrow: The attached patch updates the lit.config for libc++ unit tests so · c1a45fb7
      Howard Hinnant authored
      that the valgrind configuration passed to lit.py is used to run .pass
      tests.
      
      llvm-svn: 161193
      c1a45fb7
    • Howard Hinnant's avatar
      Andrew Morrow: Among the various libc++ tests that currently don't pass on Linux are · 4df0a6ad
      Howard Hinnant authored
      localization/locale.categories/category.collate/category.ctype/locale.ctype.byname/is_1.pass.cpp
      and scan_is.pass.cpp. The tests fail when the character class being
      tested is compound, like ctype_base::alnum or ctype_base::graph,
      because the existing series of conditionals in do_is an do_scan_is
      will abort too early. For instance, if the character class being
      tested is alnum, and the character is numeric, do_is will return false
      because iswalpha_l will return false, 'result' becomes false, and the
      'true' result from the later call to iswdigit_l ends up being ignored
      . A similar problem exists in do_scan_is.
      
      llvm-svn: 161192
      4df0a6ad
    • Howard Hinnant's avatar
      Andrew Morrow: The attached patch is an attempt to implement · d3673eb4
      Howard Hinnant authored
      std::thread::hardware_concurrency for platforms that don't offer
      sysctl, but do provide a POSIX sysconf and _SC_NPROCESSORS_ONLN.
      
      llvm-svn: 161190
      d3673eb4
    • Howard Hinnant's avatar
      Andrew Morrow: This patch fixes · a30af5f7
      Howard Hinnant authored
      test/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.arithmetic/pointer.pass.cpp
      to accept '(nil)' as a valid representation for NULL so that the test
      passes on Linux. The same thing is already done in some other tests,
      like in /test/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_pointer.pass.cpp.
      
      llvm-svn: 161188
      a30af5f7
  5. Jul 31, 2012
    • Howard Hinnant's avatar
      Andrew Morrow: Attached is a writeup of the current state of the libc++ test suite on Linux. · 8eb04fe5
      Howard Hinnant authored
      There are a few tests that are listed as failing here for which I have
      a patch in the works. I'll be sending those along soon. There are
      others where I know what is going on but don't yet have a solution,
      and I've included some notes for those. Several still need to be
      investigated, mostly in localization and the regex test suite. I think
      that many of these failures are due to locale implementation
      variations that make the expected test results not match the actual
      results. I'm not sure what the best way to make the tests accomodate
      this sort of variation might be.
      
      The failures in the unique_ptr test suite are very new and are caused
      by a clang crash which I've not yet looked into.
      
      llvm-svn: 161079
      8eb04fe5
  6. Jul 30, 2012
    • Howard Hinnant's avatar
      Despite my pathological distrust of spin locks, the number just don't lie. ... · 088e37c7
      Howard Hinnant authored
      Despite my pathological distrust of spin locks, the number just don't lie.  I've put a small spin in __sp_mut::lock() on std::mutex::try_lock(), which is testing quite well.  In my experience, putting in a yield for every failed iteration is also a major performance booster.  This change makes one of the performance tests I was using (a highly contended one) run about 20 times faster.
      
      llvm-svn: 160967
      088e37c7
    • Howard Hinnant's avatar
      Updated status · 355b660a
      Howard Hinnant authored
      llvm-svn: 160959
      355b660a
    • Howard Hinnant's avatar
      Updated the complete by-chapter graph · fe9fe2de
      Howard Hinnant authored
      llvm-svn: 160943
      fe9fe2de
    • Howard Hinnant's avatar
      Implement [util.smartptr.shared.atomic]. This is the last unimplemented · d77851e8
      Howard Hinnant authored
      section in libc++.  This requires a recompiled dylib.  Failure to rebuild
      the dylib will result in a link-time error if and only if the functions from
      [util.smartptr.shared.atomic] are used.
      
      The implementation is not lock free.  After considerable thought, I know of no
      way to make the implementation lock free.  Ideas welcome along that front.  But
      changing the ABI of shared_ptr is not on the table at this point.
      
      The mutex used to lock these function is encapsulated by std::__sp_mut.  The
      only thing the client knows about std::__sp_mut is that it has a void* data
      member, can't be constructed, and has lock and unlock members.  Within the
      binary __sp_mut is currently implemented as a pointer to a std::mutex.  That can
      change in the future without disturbing the ABI (as long as sizeof(__sp_mut)
      remains constant.
      
      I specifically did not make __sp_mut a spin lock as I have a pathological
      distrust of spin locks.  Testing on OS X reveals that the use of std::mutex in
      this role is not a large performance penalty as long as the contention for the
      mutex is low (more likely to get the lock than to have to wait).  In the future
      we can still make __sp_mut a spin lock if that is what is desired (without ABI
      damage).
      
      The dylib contains 16 __sp_mut's to be chosen based on the hash of the address
      of the shared_ptr.  The constant 16 is a ball-park reasonable space/time
      tradeoff.
      
      std::hash<T*> was changed to call __murmur2_or_cityhash, instead of the identity
      function.  I had thought we had already done this, but I was mistaken.
      
      All of this is under #if __has_feature(cxx_atomic) even though the
      implementation is not lock free, because the signatures require access to
      std::memory_order, which is currently available only under
      __has_feature(cxx_atomic).
      
      llvm-svn: 160940
      d77851e8
  7. Jul 26, 2012
  8. Jul 21, 2012
  9. Jul 20, 2012
  10. Jul 19, 2012
  11. Jul 16, 2012
  12. Jul 13, 2012
  13. Jul 12, 2012
Loading