diff --git a/libcxx/src/atomic.cpp b/libcxx/src/atomic.cpp --- a/libcxx/src/atomic.cpp +++ b/libcxx/src/atomic.cpp @@ -16,7 +16,9 @@ #ifdef __linux__ #include -#include +#if __has_include() +# include +#endif #include // libc++ uses SYS_futex as a universal syscall name. However, on 32 bit architectures @@ -35,6 +37,27 @@ #ifdef __linux__ +# ifdef __ve__ && !defined(FUTEX_WAIT) +// VE doesn't distribute linux/futex.h. Hoever, SYS_futex is implemented +// partially as described in "Difference points for system calls", +// https://www.hpc.nec/documents/veos/en/Difference_Point_System_Calls.pdf. +// It describes following futex operations are supported. +// FUTEX_WAIT +// FUTEX_WAKT +// FUTEX_PRIVATE_FLAG +// +// The values of those operations are available in glibc-ve at +// https://github.com/veos-sxarr-NEC/glibc-ve/blob/master/sysdeps/unix/sysv/linux/ve/lowlevellock.h#L30-L43. +// +// So, we copy defined values here as a remedy until linux/futex.h is +// distributed. +# define FUTEX_WAIT 0 +# define FUTEX_WAKE 1 +# define FUTEX_PRIVATE_FLAG 128 +# define FUTEX_WAIT_PRIVATE (FUTEX_WAIT | FUTEX_PRIVATE_FLAG) +# define FUTEX_WAKE_PRIVATE (FUTEX_WAKE | FUTEX_PRIVATE_FLAG) +# endif // __ve__ && !defined(FUTEX_WAIT) + static void __libcpp_platform_wait_on_address(__cxx_atomic_contention_t const volatile* __ptr, __cxx_contention_t __val) {