diff options
author | Nikolas Klauser <n_klauser@apple.com> | 2023-05-05 08:41:13 -0700 |
---|---|---|
committer | Nikolas Klauser <n_klauser@apple.com> | 2023-05-05 13:53:17 -0700 |
commit | e7e371188513348e493ed8afb1465834ab7afbf5 (patch) | |
tree | e37d8802fd97c24133bce948046171eef58625fd /libcxx/include | |
parent | 42df495114dc75fac4f75babe8f1ed43b15515fc (diff) | |
download | llvm-e7e371188513348e493ed8afb1465834ab7afbf5.tar.gz |
[libc++][PSTL] Make the PSTL available by default under -fexperimental-library
This removes the need for a custom libc++ build to have a basic set of PSTL algorithms.
Reviewed By: ldionne, #libc
Spies: miyuki, libcxx-commits, arichardson
Differential Revision: https://reviews.llvm.org/D149624
Diffstat (limited to 'libcxx/include')
-rw-r--r-- | libcxx/include/__algorithm/pstl_any_all_none_of.h | 5 | ||||
-rw-r--r-- | libcxx/include/__algorithm/pstl_fill.h | 5 | ||||
-rw-r--r-- | libcxx/include/__algorithm/pstl_find.h | 5 | ||||
-rw-r--r-- | libcxx/include/__algorithm/pstl_for_each.h | 5 | ||||
-rw-r--r-- | libcxx/include/__config | 1 | ||||
-rw-r--r-- | libcxx/include/__config_site.in | 1 | ||||
-rw-r--r-- | libcxx/include/__pstl/internal/execution_defs.h | 4 | ||||
-rw-r--r-- | libcxx/include/__pstl/internal/execution_impl.h | 19 | ||||
-rw-r--r-- | libcxx/include/__pstl/internal/parallel_backend.h | 2 | ||||
-rw-r--r-- | libcxx/include/__pstl/internal/parallel_backend_serial.h | 4 | ||||
-rw-r--r-- | libcxx/include/__pstl/internal/parallel_impl.h | 5 | ||||
-rw-r--r-- | libcxx/include/__pstl/internal/unseq_backend_simd.h | 7 | ||||
-rw-r--r-- | libcxx/include/__pstl/internal/utils.h | 4 | ||||
-rw-r--r-- | libcxx/include/__type_traits/is_execution_policy.h | 2 | ||||
-rw-r--r-- | libcxx/include/algorithm | 11 | ||||
-rw-r--r-- | libcxx/include/execution | 6 | ||||
-rw-r--r-- | libcxx/include/module.modulemap.in | 6 |
17 files changed, 67 insertions, 25 deletions
diff --git a/libcxx/include/__algorithm/pstl_any_all_none_of.h b/libcxx/include/__algorithm/pstl_any_all_none_of.h index 6c01634eafdf..49bae753a4bf 100644 --- a/libcxx/include/__algorithm/pstl_any_all_none_of.h +++ b/libcxx/include/__algorithm/pstl_any_all_none_of.h @@ -16,13 +16,14 @@ #include <__pstl/internal/unseq_backend_simd.h> #include <__type_traits/enable_if.h> #include <__type_traits/is_execution_policy.h> +#include <__type_traits/remove_cvref.h> #include <__utility/terminate_on_exception.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif -#if _LIBCPP_STD_VER >= 17 +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 _LIBCPP_BEGIN_NAMESPACE_STD @@ -74,6 +75,6 @@ none_of(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator _LIBCPP_END_NAMESPACE_STD -#endif // _LIBCPP_STD_VER >= 17 +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 #endif // _LIBCPP___ALGORITHM_PSTL_ANY_ALL_NONE_OF_H diff --git a/libcxx/include/__algorithm/pstl_fill.h b/libcxx/include/__algorithm/pstl_fill.h index 0ee14d6c8ee4..c2771b29e1c2 100644 --- a/libcxx/include/__algorithm/pstl_fill.h +++ b/libcxx/include/__algorithm/pstl_fill.h @@ -15,13 +15,14 @@ #include <__pstl/internal/parallel_impl.h> #include <__pstl/internal/unseq_backend_simd.h> #include <__type_traits/is_execution_policy.h> +#include <__type_traits/remove_cvref.h> #include <__utility/terminate_on_exception.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif -#if _LIBCPP_STD_VER >= 17 +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 _LIBCPP_BEGIN_NAMESPACE_STD @@ -66,6 +67,6 @@ fill_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _SizeT __n, const _LIBCPP_END_NAMESPACE_STD -#endif // _LIBCPP_STD_VER >= 17 +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 #endif // _LIBCPP___ALGORITHM_PSTL_FILL_H diff --git a/libcxx/include/__algorithm/pstl_find.h b/libcxx/include/__algorithm/pstl_find.h index 8edb14bc59f7..be53ee29d5f2 100644 --- a/libcxx/include/__algorithm/pstl_find.h +++ b/libcxx/include/__algorithm/pstl_find.h @@ -15,12 +15,15 @@ #include <__pstl/internal/parallel_impl.h> #include <__pstl/internal/unseq_backend_simd.h> #include <__type_traits/is_execution_policy.h> +#include <__type_traits/remove_cvref.h> #include <__utility/terminate_on_exception.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + _LIBCPP_BEGIN_NAMESPACE_STD template <class _ExecutionPolicy, @@ -100,4 +103,6 @@ find_if_not(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardItera _LIBCPP_END_NAMESPACE_STD +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + #endif // _LIBCPP___ALGORITHM_PSTL_FIND_H diff --git a/libcxx/include/__algorithm/pstl_for_each.h b/libcxx/include/__algorithm/pstl_for_each.h index 48bbeff2fc5d..08fd4b887460 100644 --- a/libcxx/include/__algorithm/pstl_for_each.h +++ b/libcxx/include/__algorithm/pstl_for_each.h @@ -16,13 +16,14 @@ #include <__pstl/internal/parallel_backend.h> #include <__pstl/internal/unseq_backend_simd.h> #include <__type_traits/is_execution_policy.h> +#include <__type_traits/remove_cvref.h> #include <__utility/terminate_on_exception.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif -#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17 +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 _LIBCPP_BEGIN_NAMESPACE_STD @@ -68,6 +69,6 @@ for_each_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Size __size, _LIBCPP_END_NAMESPACE_STD -#endif // defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17 +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 #endif // _LIBCPP___ALGORITHM_PSTL_FOR_EACH_H diff --git a/libcxx/include/__config b/libcxx/include/__config index 0dd0814b0db6..20dd4deb19da 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -272,6 +272,7 @@ // easier to grep for target specific flags once the feature is complete. # if !defined(_LIBCPP_ENABLE_EXPERIMENTAL) && !defined(_LIBCPP_BUILDING_LIBRARY) # define _LIBCPP_HAS_NO_INCOMPLETE_FORMAT +# define _LIBCPP_HAS_NO_INCOMPLETE_PSTL # endif // Need to detect which libc we're using if we're on Linux. diff --git a/libcxx/include/__config_site.in b/libcxx/include/__config_site.in index 2ff67254c344..c0f719b357ff 100644 --- a/libcxx/include/__config_site.in +++ b/libcxx/include/__config_site.in @@ -25,7 +25,6 @@ #cmakedefine _LIBCPP_NO_VCRUNTIME #cmakedefine _LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION @_LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION@ #cmakedefine _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY -#cmakedefine _LIBCPP_HAS_PARALLEL_ALGORITHMS #cmakedefine _LIBCPP_HAS_NO_RANDOM_DEVICE #cmakedefine _LIBCPP_HAS_NO_LOCALIZATION #cmakedefine _LIBCPP_HAS_NO_FSTREAM diff --git a/libcxx/include/__pstl/internal/execution_defs.h b/libcxx/include/__pstl/internal/execution_defs.h index af6164bc722c..6abd1ff32938 100644 --- a/libcxx/include/__pstl/internal/execution_defs.h +++ b/libcxx/include/__pstl/internal/execution_defs.h @@ -16,6 +16,8 @@ #include "pstl_config.h" +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + namespace __pstl { namespace execution { inline namespace v1 { @@ -70,4 +72,6 @@ struct __parallel_tag; } // namespace __pstl +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + #endif /* _PSTL_EXECUTION_POLICY_DEFS_H */ diff --git a/libcxx/include/__pstl/internal/execution_impl.h b/libcxx/include/__pstl/internal/execution_impl.h index cc60bce8216b..51ec104db282 100644 --- a/libcxx/include/__pstl/internal/execution_impl.h +++ b/libcxx/include/__pstl/internal/execution_impl.h @@ -11,10 +11,15 @@ #define _PSTL_EXECUTION_IMPL_H #include <__iterator/iterator_traits.h> +#include <__type_traits/conditional.h> +#include <__type_traits/conjunction.h> +#include <__type_traits/is_base_of.h> #include "execution_defs.h" #include "pstl_config.h" +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + namespace __pstl { namespace __internal { @@ -29,15 +34,15 @@ struct __serial_backend_tag {}; struct __tbb_backend_tag {}; struct __openmp_backend_tag {}; -#if defined(_PSTL_PAR_BACKEND_TBB) +# if defined(_PSTL_PAR_BACKEND_TBB) using __par_backend_tag = __tbb_backend_tag; -#elif defined(_PSTL_PAR_BACKEND_OPENMP) +# elif defined(_PSTL_PAR_BACKEND_OPENMP) using __par_backend_tag = __openmp_backend_tag; -#elif defined(_PSTL_PAR_BACKEND_SERIAL) +# elif defined(_PSTL_PAR_BACKEND_SERIAL) using __par_backend_tag = __serial_backend_tag; -#else -# error "A parallel backend must be specified"; -#endif +# else +# error "A parallel backend must be specified"; +# endif template <class _IsVector> struct __serial_tag { @@ -85,4 +90,6 @@ __select_backend(__pstl::execution::parallel_unsequenced_policy, _IteratorTypes& } // namespace __internal } // namespace __pstl +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + #endif /* _PSTL_EXECUTION_IMPL_H */ diff --git a/libcxx/include/__pstl/internal/parallel_backend.h b/libcxx/include/__pstl/internal/parallel_backend.h index 2890581f5aeb..a584df17c39f 100644 --- a/libcxx/include/__pstl/internal/parallel_backend.h +++ b/libcxx/include/__pstl/internal/parallel_backend.h @@ -14,10 +14,12 @@ #if defined(_PSTL_PAR_BACKEND_SERIAL) # include "parallel_backend_serial.h" +# if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 namespace __pstl { namespace __par_backend = __serial_backend; } // namespace __pstl +# endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 #elif defined(_PSTL_PAR_BACKEND_TBB) # include "parallel_backend_tbb.h" namespace __pstl diff --git a/libcxx/include/__pstl/internal/parallel_backend_serial.h b/libcxx/include/__pstl/internal/parallel_backend_serial.h index c73a45c5c483..10c0630fbd5d 100644 --- a/libcxx/include/__pstl/internal/parallel_backend_serial.h +++ b/libcxx/include/__pstl/internal/parallel_backend_serial.h @@ -16,6 +16,8 @@ #include "pstl_config.h" +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + namespace __pstl { namespace __serial_backend @@ -129,4 +131,6 @@ __parallel_invoke(__pstl::__internal::__serial_backend_tag, _ExecutionPolicy&&, } // namespace __serial_backend } // namespace __pstl +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + #endif /* _PSTL_PARALLEL_BACKEND_SERIAL_H */ diff --git a/libcxx/include/__pstl/internal/parallel_impl.h b/libcxx/include/__pstl/internal/parallel_impl.h index 961afd75f512..19ec508cfa29 100644 --- a/libcxx/include/__pstl/internal/parallel_impl.h +++ b/libcxx/include/__pstl/internal/parallel_impl.h @@ -13,8 +13,11 @@ #include "pstl_config.h" #include <__atomic/atomic.h> +#include <__atomic/memory_order.h> #include <__pstl/internal/parallel_backend.h> +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + namespace __pstl { namespace __internal @@ -81,4 +84,6 @@ bool __parallel_or(_BackendTag __tag, _ExecutionPolicy&& __exec, _Index __first, } // namespace __internal } // namespace __pstl +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + #endif /* _PSTL_PARALLEL_IMPL_H */ diff --git a/libcxx/include/__pstl/internal/unseq_backend_simd.h b/libcxx/include/__pstl/internal/unseq_backend_simd.h index 5a2f18c7c191..c68a5b99806f 100644 --- a/libcxx/include/__pstl/internal/unseq_backend_simd.h +++ b/libcxx/include/__pstl/internal/unseq_backend_simd.h @@ -11,7 +11,10 @@ #define _PSTL_UNSEQ_BACKEND_SIMD_H #include <__functional/operations.h> +#include <__type_traits/is_arithmetic.h> #include <__utility/pair.h> +#include <cstddef> +#include <cstdint> #include "pstl_config.h" #include "utils.h" @@ -19,6 +22,8 @@ // This header defines the minimum set of vector routines required // to support parallel STL. +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + namespace __pstl { namespace __unseq_backend @@ -806,4 +811,6 @@ __simd_remove_if(_RandomAccessIterator __first, _DifferenceType __n, _UnaryPredi } // namespace __unseq_backend } // namespace __pstl +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + #endif /* _PSTL_UNSEQ_BACKEND_SIMD_H */ diff --git a/libcxx/include/__pstl/internal/utils.h b/libcxx/include/__pstl/internal/utils.h index 73da2cb0ca9c..6a926663772a 100644 --- a/libcxx/include/__pstl/internal/utils.h +++ b/libcxx/include/__pstl/internal/utils.h @@ -15,6 +15,8 @@ #include <__utility/forward.h> #include <new> +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + namespace __pstl { namespace __internal { @@ -137,4 +139,6 @@ __cmp_iterators_by_values(_ForwardIterator __a, _ForwardIterator __b, _Compare _ } // namespace __internal } // namespace __pstl +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 + #endif /* _PSTL_UTILS_H */ diff --git a/libcxx/include/__type_traits/is_execution_policy.h b/libcxx/include/__type_traits/is_execution_policy.h index b97d94edd269..fabc345b6c09 100644 --- a/libcxx/include/__type_traits/is_execution_policy.h +++ b/libcxx/include/__type_traits/is_execution_policy.h @@ -39,7 +39,7 @@ inline constexpr bool __is_parallel_execution_policy_v = __is_parallel_execution // Removes the "parallel" part of an execution policy. // For example, turns par_unseq into unseq, and par into seq. template <class _ExecutionPolicy> -const auto& __remove_parallel_policy(_ExecutionPolicy&&); +_LIBCPP_HIDE_FROM_ABI const auto& __remove_parallel_policy(_ExecutionPolicy&&); _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/include/algorithm b/libcxx/include/algorithm index 41ce67530943..469bf1706628 100644 --- a/libcxx/include/algorithm +++ b/libcxx/include/algorithm @@ -1788,6 +1788,10 @@ template <class BidirectionalIterator, class Compare> #include <__algorithm/partition_point.h> #include <__algorithm/pop_heap.h> #include <__algorithm/prev_permutation.h> +#include <__algorithm/pstl_any_all_none_of.h> +#include <__algorithm/pstl_fill.h> +#include <__algorithm/pstl_find.h> +#include <__algorithm/pstl_for_each.h> #include <__algorithm/push_heap.h> #include <__algorithm/ranges_adjacent_find.h> #include <__algorithm/ranges_all_of.h> @@ -1908,13 +1912,6 @@ template <class BidirectionalIterator, class Compare> #include <__algorithm/unwrap_iter.h> #include <__algorithm/upper_bound.h> -#ifdef _LIBCPP_HAS_PARALLEL_ALGORITHMS -# include <__algorithm/pstl_any_all_none_of.h> -# include <__algorithm/pstl_fill.h> -# include <__algorithm/pstl_find.h> -# include <__algorithm/pstl_for_each.h> -#endif - // standard-mandated includes // [algorithm.syn] diff --git a/libcxx/include/execution b/libcxx/include/execution index d73445dca112..d20fea0f05c8 100644 --- a/libcxx/include/execution +++ b/libcxx/include/execution @@ -43,7 +43,7 @@ namespace std { # pragma GCC system_header #endif -#if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17 +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 _LIBCPP_BEGIN_NAMESPACE_STD @@ -135,7 +135,7 @@ template <class _Tp> struct is_execution_policy : bool_constant<is_execution_policy_v<_Tp>> {}; template <class _ExecutionPolicy> -const auto& __remove_parallel_policy(_ExecutionPolicy&&) { +_LIBCPP_HIDE_FROM_ABI const auto& __remove_parallel_policy(_ExecutionPolicy&&) { using _ExecPol = __remove_cvref_t<_ExecutionPolicy>; if constexpr (is_same_v<_ExecPol, execution::parallel_policy>) { return execution::seq; @@ -146,6 +146,6 @@ const auto& __remove_parallel_policy(_ExecutionPolicy&&) { _LIBCPP_END_NAMESPACE_STD -#endif // defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17 +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 #endif // _LIBCPP_EXECUTION diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in index 45a22d9d4822..9bbf7ffd810b 100644 --- a/libcxx/include/module.modulemap.in +++ b/libcxx/include/module.modulemap.in @@ -635,7 +635,11 @@ module std [system] { private header "__atomic/aliases.h" export atomic } - module atomic { private header "__atomic/atomic.h" } + module atomic { + private header "__atomic/atomic.h" + + export atomic_base + } module atomic_base { private header "__atomic/atomic_base.h" } module atomic_flag { private header "__atomic/atomic_flag.h" } module atomic_init { private header "__atomic/atomic_init.h" } |