Author: ericwf Date: Tue Jul 11 18:38:35 2017 New Revision: 307749 URL: http://llvm.org/viewvc/llvm-project?rev=307749&view=rev Log: Remove <__refstring> header; Move it into source directory.
The libc++ <__refstring> headers has no real reason why it should be a public header that libc++ ships. The only reason it was in the include directory was because libc++abi needed it to build the library. However keeping <__refstring> a header had other problems, like requiring its dependancies to also be in the headers. For that reason this patch moves it into the source directory. To work around libc++abi's need for this header a duplicated copy was added to libc++abi in r307748. While duplicating the code is an unfortunate solution it's the best solution that's currently possible. In the future I would like to start a discussion on the mailing lists about making libc++abi build as a sub-project of libc++, requiring the libc++ sources always be present. Added: libcxx/trunk/src/include/refstring.h - copied, changed from r307746, libcxx/trunk/include/__refstring Removed: libcxx/trunk/include/__refstring Modified: libcxx/trunk/src/stdexcept.cpp Removed: libcxx/trunk/include/__refstring URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__refstring?rev=307748&view=auto ============================================================================== --- libcxx/trunk/include/__refstring (original) +++ libcxx/trunk/include/__refstring (removed) @@ -1,127 +0,0 @@ -//===------------------------ __refstring ---------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___REFSTRING -#define _LIBCPP___REFSTRING - -#include <__config> -#include <stdexcept> -#include <cstddef> -#include <cstring> -#ifdef __APPLE__ -#include <dlfcn.h> -#include <mach-o/dyld.h> -#endif - -_LIBCPP_BEGIN_NAMESPACE_STD - -namespace __refstring_imp { namespace { -typedef int count_t; - -struct _Rep_base { - std::size_t len; - std::size_t cap; - count_t count; -}; - -inline _Rep_base* rep_from_data(const char *data_) noexcept { - char *data = const_cast<char *>(data_); - return reinterpret_cast<_Rep_base *>(data - sizeof(_Rep_base)); -} - -inline char * data_from_rep(_Rep_base *rep) noexcept { - char *data = reinterpret_cast<char *>(rep); - return data + sizeof(*rep); -} - -#if defined(__APPLE__) -inline -const char* compute_gcc_empty_string_storage() _NOEXCEPT -{ - void* handle = dlopen("/usr/lib/libstdc++.6.dylib", RTLD_NOLOAD); - if (handle == nullptr) - return nullptr; - void* sym = dlsym(handle, "_ZNSs4_Rep20_S_empty_rep_storageE"); - if (sym == nullptr) - return nullptr; - return data_from_rep(reinterpret_cast<_Rep_base *>(sym)); -} - -inline -const char* -get_gcc_empty_string_storage() _NOEXCEPT -{ - static const char* p = compute_gcc_empty_string_storage(); - return p; -} -#endif - -}} // namespace __refstring_imp - -using namespace __refstring_imp; - -inline -__libcpp_refstring::__libcpp_refstring(const char* msg) { - std::size_t len = strlen(msg); - _Rep_base* rep = static_cast<_Rep_base *>(::operator new(sizeof(*rep) + len + 1)); - rep->len = len; - rep->cap = len; - rep->count = 0; - char *data = data_from_rep(rep); - std::memcpy(data, msg, len + 1); - __imp_ = data; -} - -inline -__libcpp_refstring::__libcpp_refstring(const __libcpp_refstring &s) _NOEXCEPT - : __imp_(s.__imp_) -{ - if (__uses_refcount()) - __sync_add_and_fetch(&rep_from_data(__imp_)->count, 1); -} - -inline -__libcpp_refstring& __libcpp_refstring::operator=(__libcpp_refstring const& s) _NOEXCEPT { - bool adjust_old_count = __uses_refcount(); - struct _Rep_base *old_rep = rep_from_data(__imp_); - __imp_ = s.__imp_; - if (__uses_refcount()) - __sync_add_and_fetch(&rep_from_data(__imp_)->count, 1); - if (adjust_old_count) - { - if (__sync_add_and_fetch(&old_rep->count, count_t(-1)) < 0) - { - ::operator delete(old_rep); - } - } - return *this; -} - -inline -__libcpp_refstring::~__libcpp_refstring() { - if (__uses_refcount()) { - _Rep_base* rep = rep_from_data(__imp_); - if (__sync_add_and_fetch(&rep->count, count_t(-1)) < 0) { - ::operator delete(rep); - } - } -} - -inline -bool __libcpp_refstring::__uses_refcount() const { -#ifdef __APPLE__ - return __imp_ != get_gcc_empty_string_storage(); -#else - return true; -#endif -} - -_LIBCPP_END_NAMESPACE_STD - -#endif //_LIBCPP___REFSTRING Copied: libcxx/trunk/src/include/refstring.h (from r307746, libcxx/trunk/include/__refstring) URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/include/refstring.h?p2=libcxx/trunk/src/include/refstring.h&p1=libcxx/trunk/include/__refstring&r1=307746&r2=307749&rev=307749&view=diff ============================================================================== --- libcxx/trunk/include/__refstring (original) +++ libcxx/trunk/src/include/refstring.h Tue Jul 11 18:38:35 2017 @@ -7,8 +7,8 @@ // //===----------------------------------------------------------------------===// -#ifndef _LIBCPP___REFSTRING -#define _LIBCPP___REFSTRING +#ifndef _LIBCPP_REFSTRING_H +#define _LIBCPP_REFSTRING_H #include <__config> #include <stdexcept> @@ -124,4 +124,4 @@ bool __libcpp_refstring::__uses_refcount _LIBCPP_END_NAMESPACE_STD -#endif //_LIBCPP___REFSTRING +#endif //_LIBCPP_REFSTRING_H Modified: libcxx/trunk/src/stdexcept.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/stdexcept.cpp?rev=307749&r1=307748&r2=307749&view=diff ============================================================================== --- libcxx/trunk/src/stdexcept.cpp (original) +++ libcxx/trunk/src/stdexcept.cpp Tue Jul 11 18:38:35 2017 @@ -11,7 +11,7 @@ #include "new" #include "string" #include "system_error" -#include "__refstring" +#include "include/refstring.h" /* For _LIBCPPABI_VERSION */ #if !defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY) && \ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits