Skip to content

Commit

Permalink
[libc++] Integrate the PSTL into libc++
Browse files Browse the repository at this point in the history
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.

Reviewers: rodgert, EricWF

Subscribers: mgorny, christof, jkorous, dexonsmith, libcxx-commits, mclow.lists, EricWF

Tags: #libc

Differential Revision: https://reviews.llvm.org/D60480

llvm-svn: 366593
  • Loading branch information
ldionne committed Jul 19, 2019
1 parent 86383e6 commit 910323e
Show file tree
Hide file tree
Showing 17 changed files with 73 additions and 1 deletion.
2 changes: 2 additions & 0 deletions libcxx/CMakeLists.txt
Expand Up @@ -80,6 +80,7 @@ endif()
option(LIBCXX_ENABLE_FILESYSTEM "Build filesystem as part of the main libc++ library"
${ENABLE_FILESYSTEM_DEFAULT})
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 -----------------------------------------------------------
option(LIBCXX_INCLUDE_BENCHMARKS "Build the libc++ benchmarks and their dependencies" ON)
Expand Down Expand Up @@ -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_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC)
config_define_if(LIBCXX_NO_VCRUNTIME _LIBCPP_NO_VCRUNTIME)
config_define_if_not(LIBCXX_ENABLE_PARALLEL_ALGORITHMS _LIBCPP_HAS_NO_PARALLEL_ALGORITHMS)

if (LIBCXX_ABI_DEFINES)
set(abi_defines)
Expand Down
1 change: 1 addition & 0 deletions libcxx/include/CMakeLists.txt
Expand Up @@ -62,6 +62,7 @@ set(files
deque
errno.h
exception
execution
experimental/__config
experimental/__memory
experimental/algorithm
Expand Down
1 change: 1 addition & 0 deletions libcxx/include/__config_site.in
Expand Up @@ -29,6 +29,7 @@
#cmakedefine _LIBCPP_NO_VCRUNTIME
#cmakedefine01 _LIBCPP_HAS_MERGED_TYPEINFO_NAMES_DEFAULT
#cmakedefine _LIBCPP_ABI_NAMESPACE @_LIBCPP_ABI_NAMESPACE@
#cmakedefine _LIBCPP_HAS_NO_PARALLEL_ALGORITHMS

@_LIBCPP_ABI_DEFINES@

Expand Down
4 changes: 4 additions & 0 deletions libcxx/include/algorithm
Expand Up @@ -5678,4 +5678,8 @@ _LIBCPP_END_NAMESPACE_STD

_LIBCPP_POP_MACROS

#if !defined(_LIBCPP_HAS_NO_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
# include <pstl/internal/glue_algorithm_impl.h>
#endif

#endif // _LIBCPP_ALGORITHM
19 changes: 19 additions & 0 deletions libcxx/include/execution
@@ -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_NO_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
# include <pstl/internal/glue_execution_defs.h>
#endif

#endif // _LIBCPP_EXECUTION
4 changes: 4 additions & 0 deletions libcxx/include/memory
Expand Up @@ -5590,4 +5590,8 @@ _LIBCPP_END_NAMESPACE_STD

_LIBCPP_POP_MACROS

#if !defined(_LIBCPP_HAS_NO_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
# include <pstl/internal/glue_memory_impl.h>
#endif

#endif // _LIBCPP_MEMORY
4 changes: 4 additions & 0 deletions libcxx/include/module.modulemap
Expand Up @@ -275,6 +275,10 @@ module std [system] {
header "exception"
export *
}
module execution {
header "execution"
export *
}
module filesystem {
header "filesystem"
export *
Expand Down
4 changes: 4 additions & 0 deletions libcxx/include/numeric
Expand Up @@ -586,4 +586,8 @@ _LIBCPP_END_NAMESPACE_STD

_LIBCPP_POP_MACROS

#if !defined(_LIBCPP_HAS_NO_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
# include <pstl/internal/glue_numeric_impl.h>
#endif

#endif // _LIBCPP_NUMERIC
9 changes: 9 additions & 0 deletions libcxx/src/CMakeLists.txt
Expand Up @@ -196,6 +196,11 @@ function(cxx_link_system_libraries target)
endif()
endfunction()

find_package(ParallelSTL QUIET)
if (LIBCXX_ENABLE_PARALLEL_ALGORITHMS AND NOT TARGET pstl::ParallelSTL)
message(FATAL_ERROR "Could not find ParallelSTL")
endif()

function(cxx_set_common_defines name)
if(LIBCXX_CXX_ABI_HEADER_TARGET)
add_dependencies(${name} ${LIBCXX_CXX_ABI_HEADER_TARGET})
Expand All @@ -222,6 +227,10 @@ function(cxx_set_common_defines name)
# in printf, scanf.
_CRT_STDIO_ISO_WIDE_SPECIFIERS)
endif()

if (LIBCXX_ENABLE_PARALLEL_ALGORITHMS)
target_link_libraries(${name} PUBLIC pstl::ParallelSTL)
endif()
endfunction()

split_list(LIBCXX_COMPILE_FLAGS)
Expand Down
1 change: 1 addition & 0 deletions libcxx/test/CMakeLists.txt
Expand Up @@ -40,6 +40,7 @@ pythonize_bool(LIBCXX_HAS_ATOMIC_LIB)
pythonize_bool(LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB)
pythonize_bool(LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
pythonize_bool(LIBCXX_DEBUG_BUILD)
pythonize_bool(LIBCXX_ENABLE_PARALLEL_ALGORITHMS)

# By default, for non-standalone builds, libcxx and libcxxabi share a library
# directory.
Expand Down
1 change: 1 addition & 0 deletions libcxx/test/libcxx/double_include.sh.cpp
Expand Up @@ -63,6 +63,7 @@
#include <deque>
#include <errno.h>
#include <exception>
#include <execution>
#include <fenv.h>
#include <filesystem>
#include <float.h>
Expand Down
1 change: 1 addition & 0 deletions libcxx/test/lit.site.cfg.in
Expand Up @@ -33,6 +33,7 @@ config.use_libatomic = @LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB@
config.debug_build = @LIBCXX_DEBUG_BUILD@
config.libcxxabi_shared = @LIBCXXABI_ENABLE_SHARED@
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.
config.loaded_site_config = True
Expand Down
1 change: 1 addition & 0 deletions libcxx/test/std/pstl
7 changes: 7 additions & 0 deletions libcxx/utils/libcxx/test/config.py
Expand Up @@ -580,6 +580,13 @@ def configure_default_compile_flags(self):
support_path = os.path.join(self.libcxx_src_root, 'test/support')
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
# template depth with older Clang versions.
self.cxx.addFlagIfSupported('-ftemplate-depth=270')
Expand Down
11 changes: 11 additions & 0 deletions libcxxabi/src/CMakeLists.txt
Expand Up @@ -147,6 +147,11 @@ if (LLVM_ENABLE_MODULES)
string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
endif()

find_package(ParallelSTL QUIET)
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)$")
set(LIBCXXABI_USE_SJLJ_EXCEPTIONS ON)
else()
Expand All @@ -160,6 +165,9 @@ if (LIBCXXABI_ENABLE_SHARED)
llvm_setup_rpath(cxxabi_shared)
endif()
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
PROPERTIES
CXX_EXTENSIONS
Expand Down Expand Up @@ -208,6 +216,9 @@ endif()
if (LIBCXXABI_ENABLE_STATIC)
add_library(cxxabi_static STATIC ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS})
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
PROPERTIES
CXX_EXTENSIONS
Expand Down
2 changes: 1 addition & 1 deletion llvm/projects/CMakeLists.txt
Expand Up @@ -30,8 +30,8 @@ if(${LLVM_BUILD_RUNTIME})
# Add the projects in reverse order of their dependencies so that the
# dependent projects can see the target names of their dependencies.
add_llvm_external_project(libunwind)
add_llvm_external_project(libcxxabi)
add_llvm_external_project(pstl)
add_llvm_external_project(libcxxabi)
add_llvm_external_project(libcxx)
endif()
if(NOT LLVM_BUILD_EXTERNAL_COMPILER_RT)
Expand Down
2 changes: 2 additions & 0 deletions pstl/test/std/lit.local.cfg
@@ -0,0 +1,2 @@
if 'parallel-algorithms' not in config.available_features:
config.unsupported = True

0 comments on commit 910323e

Please sign in to comment.