summaryrefslogtreecommitdiff
path: root/libcxx/include
diff options
context:
space:
mode:
authorNikolas Klauser <n_klauser@apple.com>2023-05-05 08:41:13 -0700
committerNikolas Klauser <n_klauser@apple.com>2023-05-05 13:53:17 -0700
commite7e371188513348e493ed8afb1465834ab7afbf5 (patch)
treee37d8802fd97c24133bce948046171eef58625fd /libcxx/include
parent42df495114dc75fac4f75babe8f1ed43b15515fc (diff)
downloadllvm-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.h5
-rw-r--r--libcxx/include/__algorithm/pstl_fill.h5
-rw-r--r--libcxx/include/__algorithm/pstl_find.h5
-rw-r--r--libcxx/include/__algorithm/pstl_for_each.h5
-rw-r--r--libcxx/include/__config1
-rw-r--r--libcxx/include/__config_site.in1
-rw-r--r--libcxx/include/__pstl/internal/execution_defs.h4
-rw-r--r--libcxx/include/__pstl/internal/execution_impl.h19
-rw-r--r--libcxx/include/__pstl/internal/parallel_backend.h2
-rw-r--r--libcxx/include/__pstl/internal/parallel_backend_serial.h4
-rw-r--r--libcxx/include/__pstl/internal/parallel_impl.h5
-rw-r--r--libcxx/include/__pstl/internal/unseq_backend_simd.h7
-rw-r--r--libcxx/include/__pstl/internal/utils.h4
-rw-r--r--libcxx/include/__type_traits/is_execution_policy.h2
-rw-r--r--libcxx/include/algorithm11
-rw-r--r--libcxx/include/execution6
-rw-r--r--libcxx/include/module.modulemap.in6
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" }