mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-14 11:39:35 +00:00
[libc++] Take 2: Integrate the PSTL into libc++
Summary: This commit allows specifying LIBCXX_ENABLE_PARALLEL_ALGORITHMS when configuring libc++ in CMake. When that option is enabled, libc++ will assume that the PSTL can be found somewhere on the CMake module path, and it will provide the C++17 parallel algorithms based on the PSTL (that is assumed to be available). The commit also adds support for running the PSTL tests as part of the libc++ test suite. The first attempt to commit this failed because it exposed a bug in the tests for modules. Now that this has been fixed, it should be safe to commit this. Reviewers: EricWF Subscribers: mgorny, christof, jkorous, dexonsmith, libcxx-commits, mclow.lists, EricWF Tags: #libc Differential Revision: https://reviews.llvm.org/D60480 llvm-svn: 367903
This commit is contained in:
parent
3de33245d2
commit
0a06eb911b
@ -80,6 +80,7 @@ endif()
|
|||||||
option(LIBCXX_ENABLE_FILESYSTEM "Build filesystem as part of the main libc++ library"
|
option(LIBCXX_ENABLE_FILESYSTEM "Build filesystem as part of the main libc++ library"
|
||||||
${ENABLE_FILESYSTEM_DEFAULT})
|
${ENABLE_FILESYSTEM_DEFAULT})
|
||||||
option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS})
|
option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS})
|
||||||
|
option(LIBCXX_ENABLE_PARALLEL_ALGORITHMS "Enable the parallel algorithms library. This requires the PSTL to be available." OFF)
|
||||||
|
|
||||||
# Benchmark options -----------------------------------------------------------
|
# Benchmark options -----------------------------------------------------------
|
||||||
option(LIBCXX_INCLUDE_BENCHMARKS "Build the libc++ benchmarks and their dependencies" ON)
|
option(LIBCXX_INCLUDE_BENCHMARKS "Build the libc++ benchmarks and their dependencies" ON)
|
||||||
@ -745,6 +746,7 @@ config_define_if(LIBCXX_HAS_WIN32_THREAD_API _LIBCPP_HAS_THREAD_API_WIN32)
|
|||||||
config_define_if(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY _LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL)
|
config_define_if(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY _LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL)
|
||||||
config_define_if(LIBCXX_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC)
|
config_define_if(LIBCXX_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC)
|
||||||
config_define_if(LIBCXX_NO_VCRUNTIME _LIBCPP_NO_VCRUNTIME)
|
config_define_if(LIBCXX_NO_VCRUNTIME _LIBCPP_NO_VCRUNTIME)
|
||||||
|
config_define_if(LIBCXX_ENABLE_PARALLEL_ALGORITHMS _LIBCPP_HAS_PARALLEL_ALGORITHMS)
|
||||||
|
|
||||||
if (LIBCXX_ABI_DEFINES)
|
if (LIBCXX_ABI_DEFINES)
|
||||||
set(abi_defines)
|
set(abi_defines)
|
||||||
|
@ -62,6 +62,7 @@ set(files
|
|||||||
deque
|
deque
|
||||||
errno.h
|
errno.h
|
||||||
exception
|
exception
|
||||||
|
execution
|
||||||
experimental/__config
|
experimental/__config
|
||||||
experimental/__memory
|
experimental/__memory
|
||||||
experimental/algorithm
|
experimental/algorithm
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#cmakedefine _LIBCPP_NO_VCRUNTIME
|
#cmakedefine _LIBCPP_NO_VCRUNTIME
|
||||||
#cmakedefine01 _LIBCPP_HAS_MERGED_TYPEINFO_NAMES_DEFAULT
|
#cmakedefine01 _LIBCPP_HAS_MERGED_TYPEINFO_NAMES_DEFAULT
|
||||||
#cmakedefine _LIBCPP_ABI_NAMESPACE @_LIBCPP_ABI_NAMESPACE@
|
#cmakedefine _LIBCPP_ABI_NAMESPACE @_LIBCPP_ABI_NAMESPACE@
|
||||||
|
#cmakedefine _LIBCPP_HAS_PARALLEL_ALGORITHMS
|
||||||
|
|
||||||
@_LIBCPP_ABI_DEFINES@
|
@_LIBCPP_ABI_DEFINES@
|
||||||
|
|
||||||
|
@ -5678,4 +5678,8 @@ _LIBCPP_END_NAMESPACE_STD
|
|||||||
|
|
||||||
_LIBCPP_POP_MACROS
|
_LIBCPP_POP_MACROS
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
|
||||||
|
# include <pstl/internal/glue_algorithm_impl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // _LIBCPP_ALGORITHM
|
#endif // _LIBCPP_ALGORITHM
|
||||||
|
19
libcxx/include/execution
Normal file
19
libcxx/include/execution
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===------------------------- execution ---------------------------------===//
|
||||||
|
//
|
||||||
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||||
|
// See https://llvm.org/LICENSE.txt for license information.
|
||||||
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_EXECUTION
|
||||||
|
#define _LIBCPP_EXECUTION
|
||||||
|
|
||||||
|
#include <__config>
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
|
||||||
|
# include <pstl/internal/glue_execution_defs.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _LIBCPP_EXECUTION
|
@ -5590,4 +5590,8 @@ _LIBCPP_END_NAMESPACE_STD
|
|||||||
|
|
||||||
_LIBCPP_POP_MACROS
|
_LIBCPP_POP_MACROS
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
|
||||||
|
# include <pstl/internal/glue_memory_impl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // _LIBCPP_MEMORY
|
#endif // _LIBCPP_MEMORY
|
||||||
|
@ -275,6 +275,10 @@ module std [system] {
|
|||||||
header "exception"
|
header "exception"
|
||||||
export *
|
export *
|
||||||
}
|
}
|
||||||
|
module execution {
|
||||||
|
header "execution"
|
||||||
|
export *
|
||||||
|
}
|
||||||
module filesystem {
|
module filesystem {
|
||||||
header "filesystem"
|
header "filesystem"
|
||||||
export *
|
export *
|
||||||
|
@ -586,4 +586,8 @@ _LIBCPP_END_NAMESPACE_STD
|
|||||||
|
|
||||||
_LIBCPP_POP_MACROS
|
_LIBCPP_POP_MACROS
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
|
||||||
|
# include <pstl/internal/glue_numeric_impl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // _LIBCPP_NUMERIC
|
#endif // _LIBCPP_NUMERIC
|
||||||
|
@ -196,6 +196,10 @@ function(cxx_link_system_libraries target)
|
|||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
if (LIBCXX_ENABLE_PARALLEL_ALGORITHMS AND NOT TARGET pstl::ParallelSTL)
|
||||||
|
message(FATAL_ERROR "Could not find ParallelSTL")
|
||||||
|
endif()
|
||||||
|
|
||||||
function(cxx_set_common_defines name)
|
function(cxx_set_common_defines name)
|
||||||
if(LIBCXX_CXX_ABI_HEADER_TARGET)
|
if(LIBCXX_CXX_ABI_HEADER_TARGET)
|
||||||
add_dependencies(${name} ${LIBCXX_CXX_ABI_HEADER_TARGET})
|
add_dependencies(${name} ${LIBCXX_CXX_ABI_HEADER_TARGET})
|
||||||
@ -222,6 +226,10 @@ function(cxx_set_common_defines name)
|
|||||||
# in printf, scanf.
|
# in printf, scanf.
|
||||||
_CRT_STDIO_ISO_WIDE_SPECIFIERS)
|
_CRT_STDIO_ISO_WIDE_SPECIFIERS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (LIBCXX_ENABLE_PARALLEL_ALGORITHMS)
|
||||||
|
target_link_libraries(${name} PUBLIC pstl::ParallelSTL)
|
||||||
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
split_list(LIBCXX_COMPILE_FLAGS)
|
split_list(LIBCXX_COMPILE_FLAGS)
|
||||||
|
@ -40,6 +40,7 @@ pythonize_bool(LIBCXX_HAS_ATOMIC_LIB)
|
|||||||
pythonize_bool(LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB)
|
pythonize_bool(LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB)
|
||||||
pythonize_bool(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
|
pythonize_bool(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
|
||||||
pythonize_bool(LIBCXX_DEBUG_BUILD)
|
pythonize_bool(LIBCXX_DEBUG_BUILD)
|
||||||
|
pythonize_bool(LIBCXX_ENABLE_PARALLEL_ALGORITHMS)
|
||||||
|
|
||||||
# By default, for non-standalone builds, libcxx and libcxxabi share a library
|
# By default, for non-standalone builds, libcxx and libcxxabi share a library
|
||||||
# directory.
|
# directory.
|
||||||
|
@ -63,6 +63,7 @@
|
|||||||
#include <deque>
|
#include <deque>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
#include <execution>
|
||||||
#include <fenv.h>
|
#include <fenv.h>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
@ -33,6 +33,7 @@ config.use_libatomic = @LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB@
|
|||||||
config.debug_build = @LIBCXX_DEBUG_BUILD@
|
config.debug_build = @LIBCXX_DEBUG_BUILD@
|
||||||
config.libcxxabi_shared = @LIBCXXABI_ENABLE_SHARED@
|
config.libcxxabi_shared = @LIBCXXABI_ENABLE_SHARED@
|
||||||
config.cxx_ext_threads = @LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY@
|
config.cxx_ext_threads = @LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY@
|
||||||
|
config.pstl_root = "@ParallelSTL_SOURCE_DIR@" if @LIBCXX_ENABLE_PARALLEL_ALGORITHMS@ else None
|
||||||
|
|
||||||
# Let the main config do the real work.
|
# Let the main config do the real work.
|
||||||
config.loaded_site_config = True
|
config.loaded_site_config = True
|
||||||
|
1
libcxx/test/std/pstl
Symbolic link
1
libcxx/test/std/pstl
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../../../pstl/test/std
|
@ -581,6 +581,13 @@ class Configuration(object):
|
|||||||
support_path = os.path.join(self.libcxx_src_root, 'test/support')
|
support_path = os.path.join(self.libcxx_src_root, 'test/support')
|
||||||
self.cxx.compile_flags += ['-I' + support_path]
|
self.cxx.compile_flags += ['-I' + support_path]
|
||||||
|
|
||||||
|
# Add includes for the PSTL headers
|
||||||
|
pstl_root = self.get_lit_conf('pstl_root')
|
||||||
|
if pstl_root is not None:
|
||||||
|
self.cxx.compile_flags += ['-I' + os.path.join(pstl_root, 'include')]
|
||||||
|
self.cxx.compile_flags += ['-I' + os.path.join(pstl_root, 'test')]
|
||||||
|
self.config.available_features.add('parallel-algorithms')
|
||||||
|
|
||||||
# FIXME(EricWF): variant_size.pass.cpp requires a slightly larger
|
# FIXME(EricWF): variant_size.pass.cpp requires a slightly larger
|
||||||
# template depth with older Clang versions.
|
# template depth with older Clang versions.
|
||||||
self.cxx.addFlagIfSupported('-ftemplate-depth=270')
|
self.cxx.addFlagIfSupported('-ftemplate-depth=270')
|
||||||
|
@ -147,6 +147,10 @@ if (LLVM_ENABLE_MODULES)
|
|||||||
string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
|
string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (NOT TARGET pstl::ParallelSTL)
|
||||||
|
message(STATUS "Could not find ParallelSTL, libc++abi will not attempt to use it but the build may fail if the libc++ in use needs it to be available.")
|
||||||
|
endif()
|
||||||
|
|
||||||
if ("${CMAKE_OSX_ARCHITECTURES}" MATCHES "^(armv6|armv7|armv7s)$")
|
if ("${CMAKE_OSX_ARCHITECTURES}" MATCHES "^(armv6|armv7|armv7s)$")
|
||||||
set(LIBCXXABI_USE_SJLJ_EXCEPTIONS ON)
|
set(LIBCXXABI_USE_SJLJ_EXCEPTIONS ON)
|
||||||
else()
|
else()
|
||||||
@ -160,6 +164,9 @@ if (LIBCXXABI_ENABLE_SHARED)
|
|||||||
llvm_setup_rpath(cxxabi_shared)
|
llvm_setup_rpath(cxxabi_shared)
|
||||||
endif()
|
endif()
|
||||||
target_link_libraries(cxxabi_shared PRIVATE ${LIBCXXABI_SHARED_LIBRARIES} ${LIBCXXABI_LIBRARIES})
|
target_link_libraries(cxxabi_shared PRIVATE ${LIBCXXABI_SHARED_LIBRARIES} ${LIBCXXABI_LIBRARIES})
|
||||||
|
if (TARGET pstl::ParallelSTL)
|
||||||
|
target_link_libraries(cxxabi_shared PUBLIC pstl::ParallelSTL)
|
||||||
|
endif()
|
||||||
set_target_properties(cxxabi_shared
|
set_target_properties(cxxabi_shared
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
CXX_EXTENSIONS
|
CXX_EXTENSIONS
|
||||||
@ -208,6 +215,9 @@ endif()
|
|||||||
if (LIBCXXABI_ENABLE_STATIC)
|
if (LIBCXXABI_ENABLE_STATIC)
|
||||||
add_library(cxxabi_static STATIC ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS})
|
add_library(cxxabi_static STATIC ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS})
|
||||||
target_link_libraries(cxxabi_static PRIVATE ${LIBCXXABI_STATIC_LIBRARIES} ${LIBCXXABI_LIBRARIES})
|
target_link_libraries(cxxabi_static PRIVATE ${LIBCXXABI_STATIC_LIBRARIES} ${LIBCXXABI_LIBRARIES})
|
||||||
|
if (TARGET pstl::ParallelSTL)
|
||||||
|
target_link_libraries(cxxabi_static PUBLIC pstl::ParallelSTL)
|
||||||
|
endif()
|
||||||
set_target_properties(cxxabi_static
|
set_target_properties(cxxabi_static
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
CXX_EXTENSIONS
|
CXX_EXTENSIONS
|
||||||
|
@ -30,8 +30,8 @@ if(${LLVM_BUILD_RUNTIME})
|
|||||||
# Add the projects in reverse order of their dependencies so that the
|
# Add the projects in reverse order of their dependencies so that the
|
||||||
# dependent projects can see the target names of their dependencies.
|
# dependent projects can see the target names of their dependencies.
|
||||||
add_llvm_external_project(libunwind)
|
add_llvm_external_project(libunwind)
|
||||||
add_llvm_external_project(libcxxabi)
|
|
||||||
add_llvm_external_project(pstl)
|
add_llvm_external_project(pstl)
|
||||||
|
add_llvm_external_project(libcxxabi)
|
||||||
add_llvm_external_project(libcxx)
|
add_llvm_external_project(libcxx)
|
||||||
endif()
|
endif()
|
||||||
if(NOT LLVM_BUILD_EXTERNAL_COMPILER_RT)
|
if(NOT LLVM_BUILD_EXTERNAL_COMPILER_RT)
|
||||||
|
2
pstl/test/std/lit.local.cfg
Normal file
2
pstl/test/std/lit.local.cfg
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
if 'parallel-algorithms' not in config.available_features:
|
||||||
|
config.unsupported = True
|
Loading…
Reference in New Issue
Block a user