eugenis removed rL LLVM as the repository for this revision. eugenis updated this revision to Diff 33246. eugenis added a comment.
Introduced cmake options for specifying the desired ABI version. ABI version affects library soname and include path (include/c++/vN). Baked ABI version into the headers (autogenerated __config_version) so that, ex. with -I/usr/include/c++/v2 you get major abi version=2 w/o additional -D settings. Clang support for selecting vN include path is coming as a separate change. http://reviews.llvm.org/D11740 Files: CMakeLists.txt docs/Abi.rst docs/BuildingLibcxx.rst include/CMakeLists.txt include/__config include/__config_version.cmake include/string lib/CMakeLists.txt
Index: lib/CMakeLists.txt =================================================================== --- lib/CMakeLists.txt +++ lib/CMakeLists.txt @@ -129,8 +129,8 @@ COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}" LINK_FLAGS "${LIBCXX_LINK_FLAGS}" OUTPUT_NAME "c++" - VERSION "1.0" - SOVERSION "1" + VERSION "${LIBCXX_ABI_MAJOR_VERSION}.${LIBCXX_ABI_MINOR_VERSION}" + SOVERSION "${LIBCXX_ABI_MAJOR_VERSION}" ) install(TARGETS cxx Index: include/string =================================================================== --- include/string +++ include/string @@ -1185,7 +1185,7 @@ #pragma warning( pop ) #endif // _LIBCPP_MSVC -#ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT +#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT template <class _CharT, size_t = sizeof(_CharT)> struct __padding @@ -1198,7 +1198,7 @@ { }; -#endif // _LIBCPP_ALTERNATE_STRING_LAYOUT +#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT template<class _CharT, class _Traits, class _Allocator> class _LIBCPP_TYPE_VIS_ONLY basic_string @@ -1234,7 +1234,7 @@ private: -#ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT +#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT struct __long { @@ -1294,7 +1294,7 @@ value_type __data_[__min_cap]; }; -#endif // _LIBCPP_ALTERNATE_STRING_LAYOUT +#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT union __ulx{__long __lx; __short __lxx;}; @@ -1696,7 +1696,7 @@ const allocator_type& __alloc() const _NOEXCEPT {return __r_.second();} -#ifdef _LIBCPP_ALTERNATE_STRING_LAYOUT +#ifdef _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT _LIBCPP_INLINE_VISIBILITY void __set_short_size(size_type __s) _NOEXCEPT @@ -1714,7 +1714,7 @@ {return __r_.first().__s.__size_;} # endif -#else // _LIBCPP_ALTERNATE_STRING_LAYOUT +#else // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT _LIBCPP_INLINE_VISIBILITY void __set_short_size(size_type __s) _NOEXCEPT @@ -1732,7 +1732,7 @@ {return __r_.first().__s.__size_ >> 1;} # endif -#endif // _LIBCPP_ALTERNATE_STRING_LAYOUT +#endif // _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT _LIBCPP_INLINE_VISIBILITY void __set_long_size(size_type __s) _NOEXCEPT Index: include/__config_version.cmake =================================================================== --- include/__config_version.cmake +++ include/__config_version.cmake @@ -0,0 +1,19 @@ +// -*- C++ -*- +//===--------------------------- __config_version -------------------------===// +// +// 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_CONFIG_VERSION +#define _LIBCPP_CONFIG_VERSION + +#define _LIBCPP_ABI_MAJOR_VERSION ${LIBCXX_ABI_MAJOR_VERSION} +#define _LIBCPP_ABI_MINOR_VERSION ${LIBCXX_ABI_MINOR_VERSION} + +#define _LIBCPP_ABI_VERSION (_LIBCPP_ABI_MAJOR_VERSION * 100 + _LIBCPP_ABI_MINOR_VERSION) + +#endif Index: include/__config =================================================================== --- include/__config +++ include/__config @@ -11,6 +11,8 @@ #ifndef _LIBCPP_CONFIG #define _LIBCPP_CONFIG +#include <__config_version> + #if !defined(_MSC_VER) || defined(__clang__) #pragma GCC system_header #endif @@ -23,12 +25,14 @@ #define _LIBCPP_VERSION 3800 -#define _LIBCPP_ABI_VERSION 1 +#if _LIBCPP_ABI_VERSION >= 200 +#define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT +#endif #define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y #define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) -#define _LIBCPP_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION) +#define _LIBCPP_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_MAJOR_VERSION) #ifndef __has_attribute @@ -230,9 +234,10 @@ #if defined(__clang__) -#if defined(__APPLE__) && !defined(__i386__) && !defined(__x86_64__) && \ - !defined(__arm__) -#define _LIBCPP_ALTERNATE_STRING_LAYOUT +#if (defined(__APPLE__) && !defined(__i386__) && !defined(__x86_64__) && \ + !defined(__arm__)) || \ + defined(_LIBCPP_ALTERNATE_STRING_LAYOUT) +#define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT #endif #if __has_feature(cxx_alignas) Index: include/CMakeLists.txt =================================================================== --- include/CMakeLists.txt +++ include/CMakeLists.txt @@ -3,20 +3,25 @@ endif() set(LIBCXX_HEADER_PATTERN PATTERN "*" + PATTERN "__config_version.cmake" EXCLUDE PATTERN "CMakeLists.txt" EXCLUDE PATTERN ".svn" EXCLUDE ${LIBCXX_SUPPORT_HEADER_PATTERN} ) file(COPY . - DESTINATION "${CMAKE_BINARY_DIR}/include/c++/v1" + DESTINATION "${CMAKE_BINARY_DIR}/include/c++/v${LIBCXX_ABI_MAJOR_VERSION}" FILES_MATCHING ${LIBCXX_HEADER_PATTERN} ) +configure_file( + __config_version.cmake + "${CMAKE_BINARY_DIR}/include/c++/v${LIBCXX_ABI_MAJOR_VERSION}/__config_version") + if (LIBCXX_INSTALL_HEADERS) - install(DIRECTORY . - DESTINATION include/c++/v1 + install(DIRECTORY ${CMAKE_BINARY_DIR}/include/c++/v${LIBCXX_ABI_MAJOR_VERSION} + DESTINATION include/c++ COMPONENT libcxx FILES_MATCHING ${LIBCXX_HEADER_PATTERN} Index: docs/BuildingLibcxx.rst =================================================================== --- docs/BuildingLibcxx.rst +++ docs/BuildingLibcxx.rst @@ -193,6 +193,21 @@ Build libc++ with run time type information. + +libc++ Feature options +---------------------- + +The following options allow building libc++ for a different ABI version. + +.. option:: LIBCXX_ABI_MAJOR_VERSION:STRING + + **Default**: ``1`` + +.. option:: LIBCXX_ABI_MINOR_VERSION:STRING + + **Default**: ``0`` + + .. _LLVM-specific variables: LLVM-specific options Index: docs/Abi.rst =================================================================== --- docs/Abi.rst +++ docs/Abi.rst @@ -0,0 +1,23 @@ + +==================== +Libc++ ABI stability +==================== + +Libc++ aims to preserve stable ABI to avoid subtle bugs when code built to the old ABI +is linked with the code build to the new ABI. At the same time, libc++ allows ABI-breaking +improvements and bugfixes for the scenarios when ABI change is not a issue. + +To support both cases, libc++ allows specifying the ABI version at the build time. +The version is defined with 2 cmake options, LIBCXX_ABI_MAJOR_VERSION and LIBCXX_ABI_MINOR_VERSION, +which translate into C++ macro definitions _LIBCPP_ABI_MAJOR_VERSION, _LIBCPP_ABI_MINOR_VERSION and _LIBCPP_ABI_VERSION. + +Any ABI-changing feature is placed under it's own macro, _LIBCPP_ABI_XXX, which is enabled +based on the value of _LIBCPP_ABI_VERSION. + +Changes are classified based on their importance and the scope of the ABI break they create into "major" and "minor" +breaks. + +Major breaks are opt-in. They are enabled in the next (future) major ABI version. +Minor breaks are enabled in the next minor ABI version, and the default minor ABI version is bumped. Users that can not take +this breakage must build with the appropriate LIBCXX_ABI_MINOR_VERSION to opt out. + Index: CMakeLists.txt =================================================================== --- CMakeLists.txt +++ CMakeLists.txt @@ -57,6 +57,8 @@ "Define suffix of library directory name (32/64)") option(LIBCXX_INSTALL_HEADERS "Install the libc++ headers." ON) option(LIBCXX_INSTALL_SUPPORT_HEADERS "Install libc++ support headers." ON) +set(LIBCXX_ABI_MAJOR_VERSION 1 CACHE STRING "Major ABI version of libc++.") +set(LIBCXX_ABI_MINOR_VERSION 0 CACHE STRING "Minor ABI version of libc++.") # ABI Library options --------------------------------------------------------- set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING @@ -287,6 +289,7 @@ # Setup Source Code And Tests #=============================================================================== include_directories(include) +include_directories("${CMAKE_BINARY_DIR}/include/c++/v${LIBCXX_ABI_MAJOR_VERSION}") add_subdirectory(include) add_subdirectory(lib)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits