[OpenMP] Add support for Haiku (#133034)

Co-authored-by: Jérôme Duval <jerome.duval@gmail.com>
This commit is contained in:
Brad Smith 2025-03-26 15:16:55 -04:00 committed by GitHub
parent 3bc8aa7823
commit 9b7a7e4b9e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 50 additions and 23 deletions

View File

@ -1354,6 +1354,10 @@ extern kmp_uint64 __kmp_now_nsec();
/* TODO: tune for KMP_OS_OPENBSD */
#define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
#define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
#elif KMP_OS_HAIKU
/* TODO: tune for KMP_OS_HAIKU */
#define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
#define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
#elif KMP_OS_HURD
/* TODO: tune for KMP_OS_HURD */
#define KMP_INIT_WAIT 1024U /* initial number of spin-tests */

View File

@ -582,7 +582,8 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_THREAD_NUM)(void) {
int gtid;
#if KMP_OS_DARWIN || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
KMP_OS_OPENBSD || KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_AIX
KMP_OS_OPENBSD || KMP_OS_HAIKU || KMP_OS_HURD || KMP_OS_SOLARIS || \
KMP_OS_AIX
gtid = __kmp_entry_gtid();
#elif KMP_OS_WINDOWS
if (!__kmp_init_parallel ||

View File

@ -22,6 +22,7 @@
#define KMP_OS_OPENBSD 0
#define KMP_OS_DARWIN 0
#define KMP_OS_WINDOWS 0
#define KMP_OS_HAIKU 0
#define KMP_OS_HURD 0
#define KMP_OS_SOLARIS 0
#define KMP_OS_WASI 0
@ -73,6 +74,11 @@
#define KMP_OS_OPENBSD 1
#endif
#if (defined __HAIKU__)
#undef KMP_OS_HAIKU
#define KMP_OS_HAIKU 1
#endif
#if (defined __GNU__)
#undef KMP_OS_HURD
#define KMP_OS_HURD 1
@ -94,14 +100,14 @@
#endif
#if (1 != KMP_OS_LINUX + KMP_OS_DRAGONFLY + KMP_OS_FREEBSD + KMP_OS_NETBSD + \
KMP_OS_OPENBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS + KMP_OS_HURD + \
KMP_OS_SOLARIS + KMP_OS_WASI + KMP_OS_AIX)
KMP_OS_OPENBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS + KMP_OS_HAIKU + \
KMP_OS_HURD + KMP_OS_SOLARIS + KMP_OS_WASI + KMP_OS_AIX)
#error Unknown OS
#endif
#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
KMP_OS_OPENBSD || KMP_OS_DARWIN || KMP_OS_HURD || KMP_OS_SOLARIS || \
KMP_OS_WASI || KMP_OS_AIX
KMP_OS_OPENBSD || KMP_OS_DARWIN || KMP_OS_HAIKU || KMP_OS_HURD || \
KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX
#undef KMP_OS_UNIX
#define KMP_OS_UNIX 1
#endif

View File

@ -8949,8 +8949,8 @@ __kmp_determine_reduction_method(
KMP_ARCH_VE || KMP_ARCH_S390X || KMP_ARCH_WASM
#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN || KMP_OS_HURD || \
KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX
KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN || KMP_OS_HAIKU || \
KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX
int teamsize_cutoff = 4;
@ -8974,15 +8974,15 @@ __kmp_determine_reduction_method(
#else
#error "Unknown or unsupported OS"
#endif // KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD ||
// KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN || KMP_OS_HURD ||
// KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX
// KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN || KMP_OS_HAIKU ||
// KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX
#elif KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_AARCH || KMP_ARCH_MIPS || \
KMP_ARCH_WASM || KMP_ARCH_PPC || KMP_ARCH_AARCH64_32
#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_HURD || KMP_OS_SOLARIS || \
KMP_OS_WASI || KMP_OS_AIX
KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_HAIKU || KMP_OS_HURD || \
KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX
// basic tuning

View File

@ -17,7 +17,7 @@
// On Unix-like systems (Linux* OS and OS X*) getpid() is declared in standard
// headers.
#if !defined(KMP_OS_AIX)
#if !defined(KMP_OS_AIX) && !defined(KMP_OS_HAIKU)
#include <sys/syscall.h>
#endif
#include <sys/types.h>
@ -36,6 +36,9 @@
#elif KMP_OS_AIX
#include <pthread.h>
#define __kmp_gettid() pthread_self()
#elif KMP_OS_HAIKU
#include <OS.h>
#define __kmp_gettid() find_thread(NULL)
#elif defined(SYS_gettid)
// Hopefully other Unix systems define SYS_gettid syscall for getting os thread
// id

View File

@ -32,7 +32,7 @@
#if KMP_OS_AIX
#include <sys/ldr.h>
#include <libperfstat.h>
#else
#elif !KMP_OS_HAIKU
#include <sys/syscall.h>
#endif
#include <sys/time.h>
@ -465,7 +465,7 @@ void __kmp_terminate_thread(int gtid) {
static kmp_int32 __kmp_set_stack_info(int gtid, kmp_info_t *th) {
int stack_data;
#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_AIX
KMP_OS_HAIKU || KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_AIX
int status;
size_t size = 0;
void *addr = 0;
@ -517,7 +517,7 @@ static kmp_int32 __kmp_set_stack_info(int gtid, kmp_info_t *th) {
return TRUE;
}
#endif /* KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD \
|| KMP_OS_HURD || KMP_OS_SOLARIS */
|| KMP_OS_HAIKU || KMP_OS_HURD || KMP_OS_SOLARIS */
/* Use incremental refinement starting from initial conservative estimate */
TCW_PTR(th->th.th_info.ds.ds_stacksize, 0);
TCW_PTR(th->th.th_info.ds.ds_stackbase, &stack_data);
@ -532,7 +532,8 @@ static void *__kmp_launch_worker(void *thr) {
#endif /* KMP_BLOCK_SIGNALS */
void *exit_val;
#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
KMP_OS_OPENBSD || KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_AIX
KMP_OS_OPENBSD || KMP_OS_HAIKU || KMP_OS_HURD || KMP_OS_SOLARIS || \
KMP_OS_AIX
void *volatile padding = 0;
#endif
int gtid;
@ -581,7 +582,8 @@ static void *__kmp_launch_worker(void *thr) {
#endif /* KMP_BLOCK_SIGNALS */
#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
KMP_OS_OPENBSD || KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_AIX
KMP_OS_OPENBSD || KMP_OS_HAIKU || KMP_OS_HURD || KMP_OS_SOLARIS || \
KMP_OS_AIX
if (__kmp_stkoffset > 0 && gtid > 0) {
padding = KMP_ALLOCA(gtid * __kmp_stkoffset);
(void)padding;
@ -1902,7 +1904,7 @@ static int __kmp_get_xproc(void) {
__kmp_type_convert(sysconf(_SC_NPROCESSORS_CONF), &(r));
#elif KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_OPENBSD || \
KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX
KMP_OS_HAIKU || KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX
__kmp_type_convert(sysconf(_SC_NPROCESSORS_ONLN), &(r));
@ -2400,6 +2402,9 @@ int __kmp_is_address_mapped(void *addr) {
}
KMP_INTERNAL_FREE(loadQueryBuf);
#elif KMP_OS_HAIKU
found = 1;
#else
#error "Unknown or unsupported OS"
@ -2515,7 +2520,9 @@ int __kmp_get_load_balance(int max) {
glb_running_threads = running_threads;
return running_threads;
}
#elif KMP_OS_HAIKU
int __kmp_get_load_balance(int max) { return -1; }
#else // Linux* OS

View File

@ -19,6 +19,9 @@ def prepend_dynamic_library_path(path):
elif config.operating_system == 'Darwin':
name = 'DYLD_LIBRARY_PATH'
sep = ':'
elif config.operating_system == 'Haiku':
name = 'LIBRARY_PATH'
sep = ':'
elif target_arch == 've':
name = 'VE_LD_LIBRARY_PATH'
sep = ':'
@ -60,10 +63,11 @@ config.test_flags_use_compiler_omp_h = flags
# extra libraries
libs = ""
if config.has_libm:
libs += " -lm"
if config.has_libatomic:
libs += " -latomic"
if config.operating_system != 'Haiku':
if config.has_libm:
libs += " -lm"
if config.has_libatomic:
libs += " -latomic"
# Allow REQUIRES / UNSUPPORTED / XFAIL to work
config.target_triple = [ ]

View File

@ -21,7 +21,9 @@
#endif
#include <dlfcn.h>
#include <errno.h>
#ifndef __HAIKU__
#include <execinfo.h>
#endif
#include <inttypes.h>
#include <omp-tools.h>
#include <omp.h>