From 804f9116e5ed05b5a9f2a3f955c480480967c269 Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Thu, 7 Feb 2013 15:27:39 +0000 Subject: [PATCH] Michael van der Westhuizen: The attached patch add support for building against libc++abi and libcxxrt to CMake builds of libc++. Usage (with the appropriate CC and CXX environment variables) is: $ cmake -DLIBCXX_CXX_ABI=libcxxabi '-DLIBCXX_LIBCXXABI_INCLUDE_PATHS=/home/michael/libcxxabi/include' ../libcxx and: $ cmake -DLIBCXX_CXX_ABI=libcxxrt '-DLIBCXX_LIBCXXRT_INCLUDE_PATHS=/home/michael/libcxxrt/src' ../libcxx llvm-svn: 174623 --- libcxx/CMakeLists.txt | 83 +++++++++++++++++++++++++++++++++++++++++++ libcxx/include/__split_buffer | 4 +-- libcxx/include/functional | 24 +++++++++++++ libcxx/include/string | 9 +++-- libcxx/include/vector | 6 ++-- 5 files changed, 118 insertions(+), 8 deletions(-) diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt index 96d17fb..0711fab 100644 --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -114,6 +114,89 @@ if ("${LIBCXX_CXX_ABI}" STREQUAL "libsupc++") FILES_MATCHING PATTERN "*" ) +elseif ("${LIBCXX_CXX_ABI}" STREQUAL "libcxxabi") + set(LIBCXX_LIBCXXABI_INCLUDE_PATHS "${LIBCXX_LIBCXXABI_INCLUDE_PATHS}" + CACHE STRINGS + "Paths to libc++abi include directories separate by ';'.") + set(LIBCXX_CXX_ABI_LIBRARIES c++abi) + set(LIBCXX_LIBCXXABI_FILES + cxxabi.h + cxa_demangle.h + ) + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include") + set(LIBCXX_LIBCXXABI_FILE_PATHS) + foreach(path ${LIBCXX_LIBCXXABI_FILES}) + set(found FALSE) + foreach(incpath ${LIBCXX_LIBCXXABI_INCLUDE_PATHS}) + if (EXISTS "${incpath}/${path}") + set(found TRUE) + get_filename_component(file ${path} NAME) + add_custom_command( + OUTPUT "${CMAKE_BINARY_DIR}/include/${file}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${incpath}/${path}" + "${CMAKE_BINARY_DIR}/include" + MAIN_DEPENDENCY "${incpath}/${path}" + ) + list(APPEND LIBCXX_CXX_ABI_DEPS + "${CMAKE_BINARY_DIR}/include/${file}") + endif() + endforeach() + if (NOT found) + message(FATAL_ERROR "Failed to find ${path}") + endif() + endforeach() + add_custom_target(cxxabi_headers DEPENDS ${LIBCXX_CXX_ABI_DEPS}) + set(LIBCXX_CXX_ABI_DEPS cxxabi_headers) + include_directories("${CMAKE_BINARY_DIR}/include") + install(DIRECTORY "${CMAKE_BINARY_DIR}/include/" + DESTINATION include/c++/v1 + FILES_MATCHING + PATTERN "*" + ) +elseif ("${LIBCXX_CXX_ABI}" STREQUAL "libcxxrt") + set(LIBCXX_LIBCXXRT_INCLUDE_PATHS "${LIBCXX_LIBCXXRT_INCLUDE_PATHS}" + CACHE STRINGS + "Paths to libcxxrt include directories separate by ';'.") + set(LIBCXX_CXX_ABI_LIBRARIES cxxrt) + set(LIBCXX_LIBCXXRT_FILES + cxxabi.h + unwind.h + unwind-arm.h + unwind-itanium.h + ) + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include") + set(LIBCXX_LIBCXXRT_FILE_PATHS) + foreach(path ${LIBCXX_LIBCXXRT_FILES}) + set(found FALSE) + foreach(incpath ${LIBCXX_LIBCXXRT_INCLUDE_PATHS}) + if (EXISTS "${incpath}/${path}") + set(found TRUE) + get_filename_component(file ${path} NAME) + add_custom_command( + OUTPUT "${CMAKE_BINARY_DIR}/include/${file}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${incpath}/${path}" + "${CMAKE_BINARY_DIR}/include" + MAIN_DEPENDENCY "${incpath}/${path}" + ) + list(APPEND LIBCXX_CXX_ABI_DEPS + "${CMAKE_BINARY_DIR}/include/${file}") + endif() + endforeach() + if (NOT found) + message(FATAL_ERROR "Failed to find ${path}") + endif() + endforeach() + add_custom_target(cxxrt_headers DEPENDS ${LIBCXX_CXX_ABI_DEPS}) + set(LIBCXX_CXX_ABI_DEPS cxxrt_headers) + include_directories("${CMAKE_BINARY_DIR}/include") + install(DIRECTORY "${CMAKE_BINARY_DIR}/include/" + DESTINATION include/c++/v1 + FILES_MATCHING + PATTERN "*" + ) + list(APPEND LIBCXX_CXX_FEATURE_FLAGS -DLIBCXXRT) elseif (NOT "${LIBCXX_CXX_ABI}" STREQUAL "none") message(FATAL_ERROR "Currently only none and libsupc++ are supported for c++ abi.") diff --git a/libcxx/include/__split_buffer b/libcxx/include/__split_buffer index e0aa13b..d498b21 100644 --- a/libcxx/include/__split_buffer +++ b/libcxx/include/__split_buffer @@ -290,7 +290,7 @@ void __split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, false_type) { while (__begin_ != __new_begin) - __alloc_traits::destroy(__alloc(), __begin_++); + __alloc_traits::destroy(__alloc(), _VSTD::__to_raw_pointer(__begin_++)); } template @@ -307,7 +307,7 @@ void __split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, false_type) _NOEXCEPT { while (__new_last != __end_) - __alloc_traits::destroy(__alloc(), --__end_); + __alloc_traits::destroy(__alloc(), _VSTD::__to_raw_pointer(--__end_)); } template diff --git a/libcxx/include/functional b/libcxx/include/functional index 3bee1ed..9837a18 100644 --- a/libcxx/include/functional +++ b/libcxx/include/functional @@ -465,6 +465,10 @@ POLICY: For non-variadic implementations, the number of arguments is limited #include #include +#if __OBJC__ +# include +#endif + #include <__functional_base> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -2020,6 +2024,26 @@ struct _LIBCPP_VISIBLE hash } }; +#if __OBJC__ + +template <> +struct _LIBCPP_VISIBLE hash + : public unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(id __v) const _NOEXCEPT {return [__v hash];} +}; + +template <> +struct _LIBCPP_VISIBLE equal_to + : public binary_function +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(id __x, id __y) const + {return __x == __y || [__x isEqual: __y];} +}; + +#endif // __OBJC__ + // struct hash in _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/include/string b/libcxx/include/string index 1a70467..c99eaea 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -2067,10 +2067,13 @@ basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_t pointer __p = __alloc_traits::allocate(__alloc(), __cap+1); __invalidate_all_iterators(); if (__n_copy != 0) - traits_type::copy(__p, __old_p, __n_copy); + traits_type::copy(_VSTD::__to_raw_pointer(__p), + _VSTD::__to_raw_pointer(__old_p), __n_copy); size_type __sec_cp_sz = __old_sz - __n_del - __n_copy; if (__sec_cp_sz != 0) - traits_type::copy(__p + __n_copy + __n_add, __old_p + __n_copy + __n_del, __sec_cp_sz); + traits_type::copy(_VSTD::__to_raw_pointer(__p + __n_copy + __n_add), + _VSTD::__to_raw_pointer(__old_p + __n_copy + __n_del), + __sec_cp_sz); if (__old_cap+1 != __min_cap) __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1); __set_long_pointer(__p); @@ -2303,7 +2306,7 @@ basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c) if (__cap - __sz < __n) __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0); pointer __p = __get_pointer(); - traits_type::assign(__p + __sz, __n, __c); + traits_type::assign(_VSTD::__to_raw_pointer(__p + __sz), __n, __c); __sz += __n; __set_size(__sz); traits_type::assign(__p[__sz], value_type()); diff --git a/libcxx/include/vector b/libcxx/include/vector index 876b7e5..f4a41d6 100644 --- a/libcxx/include/vector +++ b/libcxx/include/vector @@ -440,7 +440,7 @@ void __vector_base<_Tp, _Allocator>::__destruct_at_end(const_pointer __new_last, false_type) _NOEXCEPT { while (__new_last != __end_) - __alloc_traits::destroy(__alloc(), const_cast(--__end_)); + __alloc_traits::destroy(__alloc(), _VSTD::__to_raw_pointer(--__end_)); } template @@ -448,7 +448,7 @@ _LIBCPP_INLINE_VISIBILITY inline void __vector_base<_Tp, _Allocator>::__destruct_at_end(const_pointer __new_last, true_type) _NOEXCEPT { - __end_ = const_cast(__new_last); + __end_ = static_cast(__new_last); } template @@ -1550,7 +1550,7 @@ vector<_Tp, _Allocator>::erase(const_iterator __position) "vector::erase(iterator) called with an iterator not" " referring to this vector"); #endif - pointer __p = const_cast(&*__position); + pointer __p = this->__begin_ + (__position - cbegin()); iterator __r = __make_iter(__p); this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p)); return __r; -- 2.7.4