[libcxxabi] r208246 - Make libc++abi use the implementation of __numstr from libc++. No functionality change, just removal of duplicated code.
Stepan Dyatkovskiy
stpworld at narod.ru
Wed May 14 23:58:31 PDT 2014
Hi Marshall,
I can't build libcxxabi after this commit (using lib/buildit script).
This commit supposes that libcxx/include should be added to -I compiler
flags.
I have fixed 'buildit' script, so now it asks LIBCXX_INCLUDE environment
variable to be set.
Please review my patch in attachment.
Thanks!
Truly yours,
Stepan Dyatkovskiy
08.05.2014, 00:31, "Marshall Clow" <mclow.lists at gmail.com>:
> Author: marshall
> Date: Wed May 7 15:17:41 2014
> New Revision: 208246
>
> URL: http://llvm.org/viewvc/llvm-project?rev=208246&view=rev
> Log:
> Make libc++abi use the implementation of __numstr from libc++. No functionality change, just removal of duplicated code.
>
> Modified:
> libcxxabi/trunk/src/stdexcept.cpp
>
> Modified: libcxxabi/trunk/src/stdexcept.cpp
> URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/stdexcept.cpp?rev=208246&r1=208245&r2=208246&view=diff
> ==============================================================================
> --- libcxxabi/trunk/src/stdexcept.cpp (original)
> +++ libcxxabi/trunk/src/stdexcept.cpp Wed May 7 15:17:41 2014
> @@ -7,6 +7,7 @@
> //
> //===----------------------------------------------------------------------===//
>
> +#include "__refstring"
> #include "stdexcept"
> #include "new"
> #include <cstdlib>
> @@ -14,147 +15,25 @@
> #include <cstdint>
> #include <cstddef>
>
> -#if __APPLE__
> -#include <dlfcn.h>
> -#include <mach-o/dyld.h>
> -#endif
> -
> -// Note: optimize for size
> -
> -#pragma GCC visibility push(hidden)
> -
> -namespace
> -{
> -
> -class __libcpp_nmstr
> -{
> -private:
> - const char* str_;
> -
> - typedef int count_t;
> -
> - struct _Rep_base
> - {
> - std::size_t len;
> - std::size_t cap;
> - count_t count;
> - };
> -
> - static const std::ptrdiff_t offset = static_cast<std::ptrdiff_t>(sizeof(_Rep_base));
> -
> - count_t& count() const _NOEXCEPT {return ((_Rep_base*)(str_ - offset))->count;}
> -
> -#if __APPLE__
> - static
> - const void*
> - compute_gcc_empty_string_storage() _NOEXCEPT
> - {
> - void* handle = dlopen("/usr/lib/libstdc++.6.dylib", RTLD_NOLOAD);
> - if (handle == 0)
> - return 0;
> - return (const char*)dlsym(handle, "_ZNSs4_Rep20_S_empty_rep_storageE") + offset;
> - }
> -
> - static
> - const void*
> - get_gcc_empty_string_storage() _NOEXCEPT
> - {
> - static const void* p = compute_gcc_empty_string_storage();
> - return p;
> - }
> -#endif
> -
> -public:
> - explicit __libcpp_nmstr(const char* msg);
> - __libcpp_nmstr(const __libcpp_nmstr& s) _NOEXCEPT;
> - __libcpp_nmstr& operator=(const __libcpp_nmstr& s) _NOEXCEPT;
> - ~__libcpp_nmstr();
> - const char* c_str() const _NOEXCEPT {return str_;}
> -};
> -
> -__libcpp_nmstr::__libcpp_nmstr(const char* msg)
> -{
> - std::size_t len = strlen(msg);
> - str_ = static_cast<const char*>(::operator new(len + 1 + offset));
> - _Rep_base* c = (_Rep_base*)str_;
> - c->len = c->cap = len;
> - str_ += offset;
> - count() = 0;
> - std::memcpy(const_cast<char*>(c_str()), msg, len + 1);
> -}
> -
> -inline
> -__libcpp_nmstr::__libcpp_nmstr(const __libcpp_nmstr& s) _NOEXCEPT
> - : str_(s.str_)
> -{
> -#if __APPLE__
> - if (str_ != get_gcc_empty_string_storage())
> -#endif
> - __sync_add_and_fetch(&count(), 1);
> -}
> -
> -__libcpp_nmstr&
> -__libcpp_nmstr::operator=(const __libcpp_nmstr& s) _NOEXCEPT
> -{
> - const char* p = str_;
> - str_ = s.str_;
> -#if __APPLE__
> - if (str_ != get_gcc_empty_string_storage())
> -#endif
> - __sync_add_and_fetch(&count(), 1);
> -#if __APPLE__
> - if (p != get_gcc_empty_string_storage())
> -#endif
> - if (__sync_add_and_fetch((count_t*)(p-sizeof(count_t)), count_t(-1)) < 0)
> - {
> - ::operator delete(const_cast<char*>(p-offset));
> - }
> - return *this;
> -}
> -
> -inline
> -__libcpp_nmstr::~__libcpp_nmstr()
> -{
> -#if __APPLE__
> - if (str_ != get_gcc_empty_string_storage())
> -#endif
> - if (__sync_add_and_fetch(&count(), count_t(-1)) < 0)
> - {
> - ::operator delete(const_cast<char*>(str_ - offset));
> - }
> -}
> -
> -}
> -
> -#pragma GCC visibility pop
> +static_assert(sizeof(std::__libcpp_refstring) == sizeof(const char *), "");
>
> namespace std // purposefully not using versioning namespace
> {
>
> -logic_error::~logic_error() _NOEXCEPT
> -{
> - __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_;
> - s.~__libcpp_nmstr();
> -}
> +logic_error::~logic_error() _NOEXCEPT {}
>
> const char*
> logic_error::what() const _NOEXCEPT
> {
> - __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_;
> - return s.c_str();
> + return __imp_.c_str();
> }
>
> -runtime_error::~runtime_error() _NOEXCEPT
> -{
> - __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_;
> - s.~__libcpp_nmstr();
> -}
> +runtime_error::~runtime_error() _NOEXCEPT {}
>
> const char*
> runtime_error::what() const _NOEXCEPT
> {
> - __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_;
> - return s.c_str();
> + return __imp_.c_str();
> }
>
> domain_error::~domain_error() _NOEXCEPT {}
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
-------------- next part --------------
A non-text attachment was scrubbed...
Name: libcxx-include-2014-05-15.patch
Type: text/x-diff
Size: 759 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140515/aa7d0deb/attachment.patch>
More information about the cfe-commits
mailing list