forked from OSchip/llvm-project
Add support for FreeBSD
Port the OpenMP runtime to FreeBSD along with associated build system changes. Also begin to generalize affinity capabilities so they aren't tied explicitly to Windows and Linux. The port builds with stock clang and gmake and has no additional runtime dependencies. All but a handful of the validation suite tests are now passing on FreeBSD 10 x86_64. llvm-svn: 202478
This commit is contained in:
parent
6c6af852f9
commit
763b93965c
|
@ -78,6 +78,7 @@ Intel(R) Many Integrated Core Architecture
|
|||
| icc/icl | gcc | clang |
|
||||
--------------|---------------|--------------------------|
|
||||
| Linux* OS | Yes(1,5) | Yes(2,4) | Yes(4,6,7) |
|
||||
| FreeBSD* | No | No | Yes(4,6,7) |
|
||||
| OS X* | Yes(1,3,4) | No | Yes(4,6,7) |
|
||||
| Windows* OS | Yes(1,4) | No | No |
|
||||
----------------------------------------------------------
|
||||
|
|
|
@ -88,7 +88,7 @@
|
|||
#include "kmp_lock.h"
|
||||
#include "kmp_i18n.h"
|
||||
|
||||
#define KMP_HANDLE_SIGNALS (KMP_OS_LINUX || KMP_OS_WINDOWS || KMP_OS_DARWIN)
|
||||
#define KMP_HANDLE_SIGNALS (KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN)
|
||||
|
||||
#ifdef KMP_SETVERSION
|
||||
/* from factory/Include, to get VERSION_STRING embedded for 'what' */
|
||||
|
@ -460,6 +460,15 @@ typedef int PACKED_REDUCTION_METHOD_T;
|
|||
* Only Linux* OS and Windows* OS support thread affinity.
|
||||
*/
|
||||
#if KMP_OS_LINUX || KMP_OS_WINDOWS
|
||||
# define KMP_AFFINITY_SUPPORTED 1
|
||||
#elif KMP_OS_DARWIN || KMP_OS_FREEBSD
|
||||
// affinity not supported
|
||||
# define KMP_AFFINITY_SUPPORTED 0
|
||||
#else
|
||||
# error "Unknown or unsupported OS"
|
||||
#endif
|
||||
|
||||
#if KMP_AFFINITY_SUPPORTED
|
||||
|
||||
extern size_t __kmp_affin_mask_size;
|
||||
# define KMP_AFFINITY_CAPABLE() (__kmp_affin_mask_size > 0)
|
||||
|
@ -719,11 +728,7 @@ extern kmp_affin_mask_t *__kmp_affinity_get_fullMask();
|
|||
# endif /* KMP_OS_LINUX */
|
||||
extern char const * __kmp_cpuinfo_file;
|
||||
|
||||
#elif KMP_OS_DARWIN
|
||||
// affinity not supported
|
||||
#else
|
||||
#error "Unknown or unsupported OS"
|
||||
#endif /* KMP_OS_LINUX || KMP_OS_WINDOWS */
|
||||
#endif /* KMP_AFFINITY_SUPPORTED */
|
||||
|
||||
#if OMP_40_ENABLED
|
||||
|
||||
|
@ -944,10 +949,12 @@ extern unsigned int __kmp_place_core_offset;
|
|||
#elif KMP_OS_LINUX
|
||||
# define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
|
||||
# define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
|
||||
#elif KMP_OS_DARWIN
|
||||
/* TODO: tune for KMP_OS_DARWIN */
|
||||
#elif KMP_OS_DARWIN || KMP_OS_FREEBSD
|
||||
/* TODO: tune for OS */
|
||||
# define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
|
||||
# define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
|
||||
#else
|
||||
# error "Unknown or unsupported OS"
|
||||
#endif
|
||||
|
||||
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
|
||||
|
@ -2971,7 +2978,7 @@ extern void __kmp_initialize_system_tick( void ); /* Initialize timer tick valu
|
|||
extern void __kmp_runtime_initialize( void ); /* machine specific initialization */
|
||||
extern void __kmp_runtime_destroy( void );
|
||||
|
||||
#if KMP_OS_LINUX || KMP_OS_WINDOWS
|
||||
#if KMP_AFFINITY_SUPPORTED
|
||||
extern char *__kmp_affinity_print_mask(char *buf, int buf_len, kmp_affin_mask_t *mask);
|
||||
extern void __kmp_affinity_initialize(void);
|
||||
extern void __kmp_affinity_uninitialize(void);
|
||||
|
@ -2989,7 +2996,7 @@ extern int __kmp_aux_unset_affinity_mask_proc(int proc, void **mask);
|
|||
extern int __kmp_aux_get_affinity_mask_proc(int proc, void **mask);
|
||||
extern void __kmp_balanced_affinity( int tid, int team_size );
|
||||
|
||||
#endif /* KMP_OS_LINUX || KMP_OS_WINDOWS */
|
||||
#endif /* KMP_AFFINITY_SUPPORTED */
|
||||
|
||||
#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#include "kmp_str.h"
|
||||
|
||||
|
||||
#if KMP_OS_WINDOWS || KMP_OS_LINUX
|
||||
#if KMP_AFFINITY_SUPPORTED
|
||||
|
||||
//
|
||||
// Print the affinity mask to the character array in a pretty format.
|
||||
|
@ -4543,9 +4543,4 @@ void __kmp_balanced_affinity( int tid, int nthreads )
|
|||
|
||||
# endif /* KMP_MIC */
|
||||
|
||||
#elif KMP_OS_DARWIN
|
||||
// affinity not supported
|
||||
#else
|
||||
#error "Unknown or unsupported OS"
|
||||
#endif // KMP_OS_WINDOWS || KMP_OS_LINUX
|
||||
|
||||
#endif // KMP_AFFINITY_SUPPORTED
|
||||
|
|
|
@ -66,7 +66,7 @@
|
|||
#if KMP_OS_UNIX
|
||||
#include <stdlib.h> // getenv, setenv, unsetenv.
|
||||
#include <string.h> // strlen, strcpy.
|
||||
#if KMP_OS_LINUX
|
||||
#if KMP_OS_LINUX || KMP_OS_FREEBSD
|
||||
extern char * * environ;
|
||||
#elif KMP_OS_DARWIN
|
||||
#include <crt_externs.h>
|
||||
|
|
|
@ -222,7 +222,7 @@ FTN_GET_LIBRARY (void)
|
|||
int FTN_STDCALL
|
||||
FTN_SET_AFFINITY( void **mask )
|
||||
{
|
||||
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
|
||||
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
|
||||
return -1;
|
||||
#else
|
||||
if ( ! TCR_4(__kmp_init_middle) ) {
|
||||
|
@ -235,7 +235,7 @@ FTN_SET_AFFINITY( void **mask )
|
|||
int FTN_STDCALL
|
||||
FTN_GET_AFFINITY( void **mask )
|
||||
{
|
||||
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
|
||||
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
|
||||
return -1;
|
||||
#else
|
||||
if ( ! TCR_4(__kmp_init_middle) ) {
|
||||
|
@ -248,7 +248,7 @@ FTN_GET_AFFINITY( void **mask )
|
|||
int FTN_STDCALL
|
||||
FTN_GET_AFFINITY_MAX_PROC( void )
|
||||
{
|
||||
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
|
||||
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
|
||||
return 0;
|
||||
#else
|
||||
//
|
||||
|
@ -273,7 +273,7 @@ FTN_GET_AFFINITY_MAX_PROC( void )
|
|||
void FTN_STDCALL
|
||||
FTN_CREATE_AFFINITY_MASK( void **mask )
|
||||
{
|
||||
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
|
||||
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
|
||||
*mask = NULL;
|
||||
#else
|
||||
//
|
||||
|
@ -290,7 +290,7 @@ FTN_CREATE_AFFINITY_MASK( void **mask )
|
|||
void FTN_STDCALL
|
||||
FTN_DESTROY_AFFINITY_MASK( void **mask )
|
||||
{
|
||||
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
|
||||
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
|
||||
// Nothing
|
||||
#else
|
||||
//
|
||||
|
@ -312,7 +312,7 @@ FTN_DESTROY_AFFINITY_MASK( void **mask )
|
|||
int FTN_STDCALL
|
||||
FTN_SET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
|
||||
{
|
||||
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
|
||||
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
|
||||
return -1;
|
||||
#else
|
||||
if ( ! TCR_4(__kmp_init_middle) ) {
|
||||
|
@ -325,7 +325,7 @@ FTN_SET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
|
|||
int FTN_STDCALL
|
||||
FTN_UNSET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
|
||||
{
|
||||
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
|
||||
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
|
||||
return -1;
|
||||
#else
|
||||
if ( ! TCR_4(__kmp_init_middle) ) {
|
||||
|
@ -338,7 +338,7 @@ FTN_UNSET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
|
|||
int FTN_STDCALL
|
||||
FTN_GET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
|
||||
{
|
||||
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
|
||||
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
|
||||
return -1;
|
||||
#else
|
||||
if ( ! TCR_4(__kmp_init_middle) ) {
|
||||
|
@ -408,7 +408,7 @@ xexpand(FTN_GET_THREAD_NUM)( void )
|
|||
#else
|
||||
int gtid;
|
||||
|
||||
#if KMP_OS_DARWIN
|
||||
#if KMP_OS_DARWIN || KMP_OS_FREEBSD
|
||||
gtid = __kmp_entry_gtid();
|
||||
#elif KMP_OS_WINDOWS
|
||||
if (!__kmp_init_parallel ||
|
||||
|
|
|
@ -815,7 +815,7 @@ sys_error(
|
|||
// not issue warning if strerror_r() returns `int' instead of expected `char *'.
|
||||
message = __kmp_str_format( "%s", err_msg );
|
||||
|
||||
#else // OS X*
|
||||
#else // OS X*, FreeBSD etc.
|
||||
|
||||
// XSI version of strerror_r.
|
||||
|
||||
|
|
|
@ -63,9 +63,10 @@
|
|||
/* ---------------------- Operating system recognition ------------------- */
|
||||
|
||||
#define KMP_OS_LINUX 0
|
||||
#define KMP_OS_FREEBSD 0
|
||||
#define KMP_OS_DARWIN 0
|
||||
#define KMP_OS_WINDOWS 0
|
||||
#define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX with KMP_OS_DARWIN */
|
||||
#define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX, KMP_OS_DARWIN etc. */
|
||||
|
||||
#define KMP_ARCH_X86 0
|
||||
#define KMP_ARCH_X86_64 0
|
||||
|
@ -85,11 +86,16 @@
|
|||
# define KMP_OS_LINUX 1
|
||||
#endif
|
||||
|
||||
#if (1 != KMP_OS_LINUX + KMP_OS_DARWIN + KMP_OS_WINDOWS)
|
||||
#if ( defined __FreeBSD__ )
|
||||
# undef KMP_OS_FREEBSD
|
||||
# define KMP_OS_FREEBSD 1
|
||||
#endif
|
||||
|
||||
#if (1 != KMP_OS_LINUX + KMP_OS_FREEBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS)
|
||||
# error Unknown OS
|
||||
#endif
|
||||
|
||||
#if KMP_OS_LINUX || KMP_OS_DARWIN
|
||||
#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_DARWIN
|
||||
# undef KMP_OS_UNIX
|
||||
# define KMP_OS_UNIX 1
|
||||
#endif
|
||||
|
@ -498,7 +504,7 @@ extern kmp_real64 __kmp_xchg_real64( volatile kmp_real64 *p, kmp_real64 v );
|
|||
# define KMP_XCHG_REAL64(p, v) __kmp_xchg_real64( (p), (v) );
|
||||
|
||||
|
||||
#elif (KMP_ASM_INTRINS && (KMP_OS_LINUX || KMP_OS_DARWIN)) || !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
|
||||
#elif (KMP_ASM_INTRINS && (KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_DARWIN)) || !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
|
||||
|
||||
/* cast p to correct type so that proper intrinsic will be used */
|
||||
# define KMP_TEST_THEN_INC32(p) __sync_fetch_and_add( (kmp_int32 *)(p), 1 )
|
||||
|
@ -780,7 +786,7 @@ typedef void (*microtask_t)( int *gtid, int *npr, ... );
|
|||
// Warning levels
|
||||
enum kmp_warnings_level {
|
||||
kmp_warnings_off = 0, /* No warnings */
|
||||
kmp_warnings_low, /* Minimal warmings (default) */
|
||||
kmp_warnings_low, /* Minimal warnings (default) */
|
||||
kmp_warnings_explicit = 6, /* Explicitly set to ON - more warnings */
|
||||
kmp_warnings_verbose /* reserved */
|
||||
};
|
||||
|
|
|
@ -4558,11 +4558,11 @@ __kmp_register_root( int initial_thread )
|
|||
KMP_DEBUG_ASSERT( root->r.r_hot_team->t.t_bar[ bs_forkjoin_barrier ].b_arrived == KMP_INIT_BARRIER_STATE );
|
||||
|
||||
|
||||
#if KMP_OS_WINDOWS || KMP_OS_LINUX
|
||||
#if KMP_AFFINITY_SUPPORTED
|
||||
if ( TCR_4(__kmp_init_middle) ) {
|
||||
__kmp_affinity_set_init_mask( gtid, TRUE );
|
||||
}
|
||||
#endif /* KMP_OS_WINDOWS || KMP_OS_LINUX */
|
||||
#endif /* KMP_AFFINITY_SUPPORTED */
|
||||
|
||||
__kmp_root_counter ++;
|
||||
|
||||
|
@ -8150,9 +8150,9 @@ __kmp_cleanup( void )
|
|||
}
|
||||
|
||||
if (TCR_4(__kmp_init_middle)) {
|
||||
#if KMP_OS_WINDOWS || KMP_OS_LINUX
|
||||
#if KMP_AFFINITY_SUPPORTED
|
||||
__kmp_affinity_uninitialize();
|
||||
#endif /* KMP_OS_WINDOWS || KMP_OS_LINUX */
|
||||
#endif /* KMP_AFFINITY_SUPPORTED */
|
||||
TCW_4(__kmp_init_middle, FALSE);
|
||||
}
|
||||
|
||||
|
@ -8452,7 +8452,7 @@ __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid,
|
|||
|
||||
#if KMP_ARCH_X86_64
|
||||
|
||||
#if KMP_OS_LINUX || KMP_OS_WINDOWS || KMP_OS_DARWIN
|
||||
#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN
|
||||
#if KMP_MIC
|
||||
#define REDUCTION_TEAMSIZE_CUTOFF 8
|
||||
#else // KMP_MIC
|
||||
|
@ -8471,7 +8471,7 @@ __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid,
|
|||
}
|
||||
#else
|
||||
#error "Unknown or unsupported OS"
|
||||
#endif // KMP_OS_LINUX || KMP_OS_WINDOWS || KMP_OS_DARWIN
|
||||
#endif // KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN
|
||||
|
||||
#elif KMP_ARCH_X86 || KMP_ARCH_ARM
|
||||
|
||||
|
|
|
@ -1579,7 +1579,7 @@ __kmp_stg_parse_cpuinfo_file( char const * name, char const * value, void * data
|
|||
#if KMP_OS_LINUX || KMP_OS_WINDOWS
|
||||
__kmp_stg_parse_str( name, value, & __kmp_cpuinfo_file );
|
||||
K_DIAG( 1, ( "__kmp_cpuinfo_file == %s\n", __kmp_cpuinfo_file ) );
|
||||
#elif KMP_OS_DARWIN
|
||||
#elif !KMP_AFFINITY_SUPPORTED
|
||||
// affinity not supported
|
||||
#else
|
||||
#error "Unknown or unsupported OS"
|
||||
|
@ -3068,7 +3068,7 @@ __kmp_stg_print_topology_method( kmp_str_buf_t * buffer, char const * name,
|
|||
# endif /* KMP_DEBUG */
|
||||
} // __kmp_stg_print_topology_method
|
||||
|
||||
#elif KMP_OS_DARWIN
|
||||
#elif !KMP_AFFINITY_SUPPORTED
|
||||
// affinity not supported
|
||||
#else
|
||||
#error "Unknown or unsupported OS"
|
||||
|
@ -4429,7 +4429,7 @@ static kmp_setting_t __kmp_stg_table[] = {
|
|||
|
||||
{ "KMP_TOPOLOGY_METHOD", __kmp_stg_parse_topology_method, __kmp_stg_print_topology_method, NULL, 0, 0 },
|
||||
|
||||
#elif KMP_OS_DARWIN
|
||||
#elif !KMP_AFFINITY_SUPPORTED
|
||||
|
||||
//
|
||||
// KMP_AFFINITY is not supported on OS X*, nor is OMP_PLACES.
|
||||
|
@ -4686,7 +4686,7 @@ __kmp_stg_init( void
|
|||
rivals[ i ++ ] = NULL;
|
||||
}
|
||||
|
||||
#elif KMP_OS_DARWIN
|
||||
#elif !KMP_AFFINITY_SUPPORTED
|
||||
// KMP_AFFINITY not supported, so OMP_PROC_BIND has no rivals.
|
||||
// OMP_PLACES not supported yet.
|
||||
#else
|
||||
|
@ -4768,7 +4768,7 @@ __kmp_stg_check_rivals( // 0 -- Ok, 1 -- errors found.
|
|||
for ( ; strcmp( rivals[ i ]->name, name ) != 0; i++ ) {
|
||||
KMP_DEBUG_ASSERT( rivals[ i ] != NULL );
|
||||
|
||||
#if KMP_OS_LINUX || KMP_OS_WINDOWS
|
||||
#if KMP_AFFINITY_SUPPORTED
|
||||
if ( rivals[ i ] == __kmp_affinity_notype ) {
|
||||
//
|
||||
// If KMP_AFFINITY is specified without a type name,
|
||||
|
@ -4885,7 +4885,7 @@ __kmp_env_initialize( char const * string ) {
|
|||
__kmp_stg_parse( name, value );
|
||||
}; // if
|
||||
|
||||
#if KMP_OS_LINUX || KMP_OS_WINDOWS
|
||||
#if KMP_AFFINITY_SUPPORTED
|
||||
//
|
||||
// Special case. KMP_AFFINITY is not a rival to other affinity env vars
|
||||
// if no affinity type is specified. We want to allow
|
||||
|
@ -4928,7 +4928,7 @@ __kmp_env_initialize( char const * string ) {
|
|||
}
|
||||
# undef FIND
|
||||
}
|
||||
#endif /* KMP_OS_LINUX || KMP_OS_WINDOWS */
|
||||
#endif /* KMP_AFFINITY_SUPPORTED */
|
||||
|
||||
#if OMP_40_ENABLED
|
||||
//
|
||||
|
@ -4967,7 +4967,7 @@ __kmp_env_initialize( char const * string ) {
|
|||
KMP_DEBUG_ASSERT( __kmp_user_lock_kind != lk_default );
|
||||
}
|
||||
|
||||
#if KMP_OS_LINUX || KMP_OS_WINDOWS
|
||||
#if KMP_AFFINITY_SUPPORTED
|
||||
if ( ! TCR_4(__kmp_init_middle) ) {
|
||||
//
|
||||
// Determine if the machine/OS is actually capable of supporting
|
||||
|
@ -4999,10 +4999,10 @@ __kmp_env_initialize( char const * string ) {
|
|||
}
|
||||
else if ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_default ) {
|
||||
//
|
||||
// On Windows* OS & Linux* OS, the default is to use the KMP_AFFINITY
|
||||
// mechanism. On OS X*, it is none.
|
||||
// Where supported the default is to use the KMP_AFFINITY
|
||||
// mechanism. On OS X* etc. it is none.
|
||||
//
|
||||
# if KMP_OS_WINDOWS || KMP_OS_LINUX
|
||||
# if KMP_AFFINITY_SUPPORTED
|
||||
__kmp_nested_proc_bind.bind_types[0] = proc_bind_intel;
|
||||
# else
|
||||
__kmp_nested_proc_bind.bind_types[0] = proc_bind_false;
|
||||
|
@ -5136,11 +5136,7 @@ __kmp_env_initialize( char const * string ) {
|
|||
# endif
|
||||
}
|
||||
|
||||
#elif KMP_OS_DARWIN
|
||||
// affinity not supported
|
||||
#else
|
||||
#error "Unknown or unsupported OS"
|
||||
#endif /* KMP_OS_LINUX || KMP_OS_WINDOWS */
|
||||
#endif /* KMP_AFFINITY_SUPPORTED */
|
||||
|
||||
if ( __kmp_version ) {
|
||||
__kmp_print_version_1();
|
||||
|
|
|
@ -169,7 +169,7 @@ __kmp_print_version_1( void )
|
|||
& buffer,
|
||||
"%sthread affinity support: %s\n",
|
||||
KMP_VERSION_PREF_STR,
|
||||
#if KMP_OS_WINDOWS || KMP_OS_LINUX
|
||||
#if KMP_AFFINITY_SUPPORTED
|
||||
(
|
||||
KMP_AFFINITY_CAPABLE()
|
||||
?
|
||||
|
|
|
@ -105,6 +105,8 @@
|
|||
#if KMP_OS_WINDOWS
|
||||
#include <malloc.h> // Windows* OS: _alloca() declared in "malloc.h".
|
||||
#define alloca _alloca // Allow to use alloca() with no underscore.
|
||||
#elif KMP_OS_FREEBSD
|
||||
// Declared in "stdlib.h".
|
||||
#elif KMP_OS_UNIX
|
||||
#include <alloca.h> // Linux* OS and OS X*: alloc() declared in "alloca".
|
||||
#else
|
||||
|
|
|
@ -355,10 +355,14 @@ ifeq "$(os)" "lin"
|
|||
# to remove dependency on libgcc_s:
|
||||
ifeq "$(c)" "gcc"
|
||||
ld-flags-dll += -static-libgcc
|
||||
ld-flags-extra += -Wl,-ldl
|
||||
ifneq "$(omp_os)" "freebsd"
|
||||
ld-flags-extra += -Wl,-ldl
|
||||
endif
|
||||
endif
|
||||
ifeq "$(c)" "clang"
|
||||
ld-flags-extra += -Wl,-ldl
|
||||
ifneq "$(omp_os)" "freebsd"
|
||||
ld-flags-extra += -Wl,-ldl
|
||||
endif
|
||||
endif
|
||||
ifeq "$(arch)" "32"
|
||||
ifeq "$(filter gcc clang,$(c))" ""
|
||||
|
@ -1247,7 +1251,7 @@ ifneq "$(os)" "lrb"
|
|||
# On Linux* OS and OS X* the test is good enough because GNU compiler knows nothing
|
||||
# about libirc and Intel compiler private lib directories, but we will grep verbose linker
|
||||
# output just in case.
|
||||
tt-c = gcc
|
||||
tt-c = cc
|
||||
ifeq "$(os)" "lin" # GCC on OS X* does not recognize -pthread.
|
||||
tt-c-flags += -pthread
|
||||
endif
|
||||
|
@ -1261,12 +1265,12 @@ ifneq "$(os)" "lrb"
|
|||
# Explicitly add dl library to avoid failure.
|
||||
tt-ld-flags += -ldl
|
||||
endif
|
||||
ifeq "$(os)" "lin"
|
||||
tt-ld-flags-v += -Wl,--verbose
|
||||
tt-env += LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)"
|
||||
else # mac
|
||||
ifeq "$(os)" "mac"
|
||||
tt-ld-flags-v += -Wl,-t
|
||||
tt-env += DYLD_LIBRARY_PATH=".:$(DYLD_LIBRARY_PATH)"
|
||||
else # lin
|
||||
tt-ld-flags-v += -Wl,--verbose
|
||||
tt-env += LD_LIBRARY_PATH=".:$(LD_LIBRARY_PATH)"
|
||||
endif
|
||||
endif
|
||||
tt-c-flags += $(tt-c-flags-rt)
|
||||
|
@ -1430,6 +1434,12 @@ ifneq "$(filter %-dyna win-%,$(os)-$(LINK_TYPE))" ""
|
|||
td_exp += uuid
|
||||
endif
|
||||
endif
|
||||
ifeq "$(omp_os)" "freebsd"
|
||||
td_exp =
|
||||
td_exp += libc.so.7
|
||||
td_exp += libthr.so.3
|
||||
td_exp += libunwind.so.5
|
||||
endif
|
||||
|
||||
test-deps/.test : $(lib_file) $(tools_dir)check-depends.pl test-deps/.dir .rebuild
|
||||
$(target)
|
||||
|
|
|
@ -22,7 +22,9 @@
|
|||
#include "kmp_i18n.h"
|
||||
#include "kmp_io.h"
|
||||
|
||||
#include <alloca.h>
|
||||
#if !KMP_OS_FREEBSD
|
||||
# include <alloca.h>
|
||||
#endif
|
||||
#include <unistd.h>
|
||||
#include <math.h> // HUGE_VAL.
|
||||
#include <sys/time.h>
|
||||
|
@ -48,6 +50,9 @@
|
|||
#elif KMP_OS_DARWIN
|
||||
# include <sys/sysctl.h>
|
||||
# include <mach/mach.h>
|
||||
#elif KMP_OS_FREEBSD
|
||||
# include <sys/sysctl.h>
|
||||
# include <pthread_np.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -596,7 +601,7 @@ static kmp_int32
|
|||
__kmp_set_stack_info( int gtid, kmp_info_t *th )
|
||||
{
|
||||
int stack_data;
|
||||
#if KMP_OS_LINUX
|
||||
#if KMP_OS_LINUX || KMP_OS_FREEBSD
|
||||
/* Linux* OS only -- no pthread_getattr_np support on OS X* */
|
||||
pthread_attr_t attr;
|
||||
int status;
|
||||
|
@ -611,8 +616,13 @@ __kmp_set_stack_info( int gtid, kmp_info_t *th )
|
|||
/* Fetch the real thread attributes */
|
||||
status = pthread_attr_init( &attr );
|
||||
KMP_CHECK_SYSFAIL( "pthread_attr_init", status );
|
||||
#if KMP_OS_FREEBSD
|
||||
status = pthread_attr_get_np( pthread_self(), &attr );
|
||||
KMP_CHECK_SYSFAIL( "pthread_attr_get_np", status );
|
||||
#else
|
||||
status = pthread_getattr_np( pthread_self(), &attr );
|
||||
KMP_CHECK_SYSFAIL( "pthread_getattr_np", status );
|
||||
#endif
|
||||
status = pthread_attr_getstack( &attr, &addr, &size );
|
||||
KMP_CHECK_SYSFAIL( "pthread_attr_getstack", status );
|
||||
KA_TRACE( 60, ( "__kmp_set_stack_info: T#%d pthread_attr_getstack returned size: %lu, "
|
||||
|
@ -629,16 +639,14 @@ __kmp_set_stack_info( int gtid, kmp_info_t *th )
|
|||
TCW_PTR(th->th.th_info.ds.ds_stacksize, size);
|
||||
TCW_4(th->th.th_info.ds.ds_stackgrow, FALSE);
|
||||
return TRUE;
|
||||
} else {
|
||||
#endif /* KMP_OS_LINUX */
|
||||
/* 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);
|
||||
TCW_4(th->th.th_info.ds.ds_stackgrow, TRUE);
|
||||
return FALSE;
|
||||
#if KMP_OS_LINUX
|
||||
}
|
||||
#endif /* KMP_OS_LINUX */
|
||||
#endif /* KMP_OS_LINUX || KMP_OS_FREEBSD */
|
||||
|
||||
/* 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);
|
||||
TCW_4(th->th.th_info.ds.ds_stackgrow, TRUE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void*
|
||||
|
@ -663,12 +671,8 @@ __kmp_launch_worker( void *thr )
|
|||
__kmp_itt_thread_name( gtid );
|
||||
#endif /* USE_ITT_BUILD */
|
||||
|
||||
#if KMP_OS_LINUX
|
||||
#if KMP_AFFINITY_SUPPORTED
|
||||
__kmp_affinity_set_init_mask( gtid, FALSE );
|
||||
#elif KMP_OS_DARWIN
|
||||
// affinity not supported
|
||||
#else
|
||||
#error "Unknown or unsupported OS"
|
||||
#endif
|
||||
|
||||
#ifdef KMP_CANCEL_THREADS
|
||||
|
@ -696,7 +700,7 @@ __kmp_launch_worker( void *thr )
|
|||
KMP_CHECK_SYSFAIL( "pthread_sigmask", status );
|
||||
#endif /* KMP_BLOCK_SIGNALS */
|
||||
|
||||
#if KMP_OS_LINUX
|
||||
#if KMP_OS_LINUX || KMP_OS_FREEBSD
|
||||
if ( __kmp_stkoffset > 0 && gtid > 0 ) {
|
||||
padding = alloca( gtid * __kmp_stkoffset );
|
||||
}
|
||||
|
@ -2000,6 +2004,16 @@ __kmp_get_xproc( void ) {
|
|||
KMP_INFORM( AssumedNumCPU );
|
||||
}; // if
|
||||
|
||||
#elif KMP_OS_FREEBSD
|
||||
|
||||
int mib[] = { CTL_HW, HW_NCPU };
|
||||
size_t len = sizeof( r );
|
||||
if ( sysctl( mib, 2, &r, &len, NULL, 0 ) < 0 ) {
|
||||
r = 0;
|
||||
KMP_WARNING( CantGetNumAvailCPU );
|
||||
KMP_INFORM( AssumedNumCPU );
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#error "Unknown or unsupported OS."
|
||||
|
@ -2121,12 +2135,8 @@ __kmp_runtime_destroy( void )
|
|||
if ( status != 0 && status != EBUSY ) {
|
||||
KMP_SYSFAIL( "pthread_cond_destroy", status );
|
||||
}
|
||||
#if KMP_OS_LINUX
|
||||
#if KMP_AFFINITY_SUPPORTED
|
||||
__kmp_affinity_uninitialize();
|
||||
#elif KMP_OS_DARWIN
|
||||
// affinity not supported
|
||||
#else
|
||||
#error "Unknown or unsupported OS"
|
||||
#endif
|
||||
|
||||
__kmp_init_runtime = FALSE;
|
||||
|
@ -2243,6 +2253,11 @@ __kmp_is_address_mapped( void * addr ) {
|
|||
found = 1;
|
||||
}; // if
|
||||
|
||||
#elif KMP_OS_FREEBSD
|
||||
|
||||
// FIXME(FreeBSD): Implement this.
|
||||
found = 1;
|
||||
|
||||
#else
|
||||
|
||||
#error "Unknown or unsupported OS"
|
||||
|
|
|
@ -26,6 +26,9 @@ ifndef omp_os
|
|||
ifeq ($(OS), Linux)
|
||||
export omp_os=linux
|
||||
endif
|
||||
ifeq ($(OS), FreeBSD)
|
||||
export omp_os=freebsd
|
||||
endif
|
||||
ifeq ($(OS), Darwin)
|
||||
export omp_os=macos
|
||||
endif
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
#
|
||||
#//===----------------------------------------------------------------------===//
|
||||
#//
|
||||
#// The LLVM Compiler Infrastructure
|
||||
#//
|
||||
#// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
#// Source Licenses. See LICENSE.txt for details.
|
||||
#//
|
||||
#//===----------------------------------------------------------------------===//
|
||||
#
|
||||
|
||||
include tools/linux.inc
|
||||
|
|
@ -170,6 +170,9 @@ sub target_options() {
|
|||
if ( 0 ) {
|
||||
} elsif ( $operating_system eq "GNU/Linux" ) {
|
||||
$_host_os = "lin";
|
||||
} elsif ( $operating_system eq "FreeBSD" ) {
|
||||
# Host OS resembles Linux.
|
||||
$_host_os = "lin";
|
||||
} elsif ( $operating_system eq "Darwin" ) {
|
||||
$_host_os = "mac";
|
||||
} elsif ( $operating_system eq "MS Windows" ) {
|
||||
|
|
|
@ -139,11 +139,11 @@ $values{ processor } = $values{ machine };
|
|||
|
||||
# hardware_platform.
|
||||
if ( 0 ) {
|
||||
} elsif ( $^O eq "linux" ) {
|
||||
} elsif ( $^O eq "linux" or $^O eq "freebsd" ) {
|
||||
if ( 0 ) {
|
||||
} elsif ( $values{ machine } =~ m{\Ai[3456]86\z} ) {
|
||||
$values{ hardware_platform } = "i386";
|
||||
} elsif ( $values{ machine } =~ m{\Ax86_64\z} ) {
|
||||
} elsif ( $values{ machine } =~ m{\A(x86_64|amd64)\z} ) {
|
||||
$values{ hardware_platform } = "x86_64";
|
||||
} elsif ( $values{ machine } =~ m{\Aarmv7\D*\z} ) {
|
||||
$values{ hardware_platform } = "arm";
|
||||
|
@ -370,8 +370,10 @@ if ( 0 ) {
|
|||
# $values{ operating_system_update } = $os_name[ 1 ];
|
||||
} elsif ( $values{ kernel_name } =~ m{\ACYGWIN_NT-} ) {
|
||||
$values{ operating_system } = "MS Windows";
|
||||
} elsif ( $values{ kernel_name } =~ m{\AFreeBSD} ) {
|
||||
$values{ operating_system } = "FreeBSD";
|
||||
} else {
|
||||
die "Unsuppoprted kernel_name (\"$values{ kernel_name }\") returned by POSIX::uname(); stopped";
|
||||
die "Unsupported kernel_name (\"$values{ kernel_name }\") returned by POSIX::uname(); stopped";
|
||||
}; # if
|
||||
|
||||
# host_name and domain_name
|
||||
|
|
Loading…
Reference in New Issue