[libcxx] Add build/test support for the externally threaded libc++abi variant
Differential revision: https://reviews.llvm.org/D27576 Reviewers: EricWF git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@290889 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -221,14 +221,21 @@ if(LIBCXX_ENABLE_THREADS AND NOT LIBCXX_ENABLE_MONOTONIC_CLOCK)
|
|||||||
" when LIBCXX_ENABLE_THREADS is also set to OFF.")
|
" when LIBCXX_ENABLE_THREADS is also set to OFF.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(LIBCXX_HAS_PTHREAD_API AND NOT LIBCXX_ENABLE_THREADS)
|
if(NOT LIBCXX_ENABLE_THREADS)
|
||||||
message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON"
|
if(LIBCXX_HAS_PTHREAD_API)
|
||||||
" when LIBCXX_ENABLE_THREADS is also set to ON.")
|
message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON"
|
||||||
|
" when LIBCXX_ENABLE_THREADS is also set to ON.")
|
||||||
|
endif()
|
||||||
|
if(LIBCXX_HAS_EXTERNAL_THREAD_API)
|
||||||
|
message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON"
|
||||||
|
" when LIBCXX_ENABLE_THREADS is also set to ON.")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(LIBCXX_HAS_EXTERNAL_THREAD_API AND NOT LIBCXX_ENABLE_THREADS)
|
if(LIBCXX_HAS_PTHREAD_API AND LIBCXX_HAS_EXTERNAL_THREAD_API)
|
||||||
message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON"
|
message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
|
||||||
" when LIBCXX_ENABLE_THREADS is also set to ON.")
|
"and LIBCXX_HAS_PTHREAD_API cannot be both"
|
||||||
|
"set to ON at the same time.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE
|
# Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE
|
||||||
|
|||||||
@@ -67,7 +67,11 @@ typedef pthread_mutex_t __libcpp_mutex_t;
|
|||||||
typedef pthread_cond_t __libcpp_condvar_t;
|
typedef pthread_cond_t __libcpp_condvar_t;
|
||||||
#define _LIBCPP_CONDVAR_INITIALIZER PTHREAD_COND_INITIALIZER
|
#define _LIBCPP_CONDVAR_INITIALIZER PTHREAD_COND_INITIALIZER
|
||||||
|
|
||||||
// THread ID
|
// Execute once
|
||||||
|
typedef pthread_once_t __libcpp_exec_once_flag;
|
||||||
|
#define _LIBCPP_EXEC_ONCE_INITIALIZER PTHREAD_ONCE_INIT
|
||||||
|
|
||||||
|
// Thread id
|
||||||
typedef pthread_t __libcpp_thread_id;
|
typedef pthread_t __libcpp_thread_id;
|
||||||
|
|
||||||
// Thread
|
// Thread
|
||||||
@@ -110,7 +114,17 @@ int __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m,
|
|||||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||||
int __libcpp_condvar_destroy(__libcpp_condvar_t* __cv);
|
int __libcpp_condvar_destroy(__libcpp_condvar_t* __cv);
|
||||||
|
|
||||||
// Thread ID
|
// Execute once
|
||||||
|
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||||
|
int __libcpp_execute_once(__libcpp_exec_once_flag *flag,
|
||||||
|
void (*init_routine)(void));
|
||||||
|
|
||||||
|
// Thread id
|
||||||
|
#if defined(__APPLE__) && !defined(__arm__)
|
||||||
|
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||||
|
mach_port_t __libcpp_thread_get_port();
|
||||||
|
#endif
|
||||||
|
|
||||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||||
bool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2);
|
bool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2);
|
||||||
|
|
||||||
@@ -145,7 +159,7 @@ _LIBCPP_THREAD_ABI_VISIBILITY
|
|||||||
void *__libcpp_tls_get(__libcpp_tls_key __key);
|
void *__libcpp_tls_get(__libcpp_tls_key __key);
|
||||||
|
|
||||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||||
void __libcpp_tls_set(__libcpp_tls_key __key, void *__p);
|
int __libcpp_tls_set(__libcpp_tls_key __key, void *__p);
|
||||||
|
|
||||||
#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) || \
|
#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) || \
|
||||||
defined(_LIBCPP_BUILDING_THREAD_API_EXTERNAL_PTHREAD)
|
defined(_LIBCPP_BUILDING_THREAD_API_EXTERNAL_PTHREAD)
|
||||||
@@ -221,6 +235,19 @@ int __libcpp_condvar_destroy(__libcpp_condvar_t *__cv)
|
|||||||
return pthread_cond_destroy(__cv);
|
return pthread_cond_destroy(__cv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Execute once
|
||||||
|
int __libcpp_execute_once(__libcpp_exec_once_flag *flag,
|
||||||
|
void (*init_routine)(void)) {
|
||||||
|
return pthread_once(flag, init_routine);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Thread id
|
||||||
|
#if defined(__APPLE__) && !defined(__arm__)
|
||||||
|
mach_port_t __libcpp_thread_get_port() {
|
||||||
|
return pthread_mach_thread_np(pthread_self());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Returns non-zero if the thread ids are equal, otherwise 0
|
// Returns non-zero if the thread ids are equal, otherwise 0
|
||||||
bool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2)
|
bool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2)
|
||||||
{
|
{
|
||||||
@@ -276,9 +303,9 @@ void *__libcpp_tls_get(__libcpp_tls_key __key)
|
|||||||
return pthread_getspecific(__key);
|
return pthread_getspecific(__key);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __libcpp_tls_set(__libcpp_tls_key __key, void *__p)
|
int __libcpp_tls_set(__libcpp_tls_key __key, void *__p)
|
||||||
{
|
{
|
||||||
pthread_setspecific(__key, __p);
|
return pthread_setspecific(__key, __p);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_THREAD_API_PTHREAD
|
#endif // _LIBCPP_HAS_THREAD_API_PTHREAD
|
||||||
|
|||||||
@@ -55,18 +55,20 @@ configure_file(
|
|||||||
${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
|
${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
|
||||||
@ONLY)
|
@ONLY)
|
||||||
|
|
||||||
|
set(LIBCXX_TEST_DEPS "")
|
||||||
|
|
||||||
if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY)
|
if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY)
|
||||||
set(experimental_dep cxx_experimental)
|
set(LIBCXX_TEST_DEPS cxx_experimental)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (LIBCXX_HAS_EXTERNAL_THREAD_API)
|
if (LIBCXX_HAS_EXTERNAL_THREAD_API)
|
||||||
set(external_threads_dep cxx_external_threads)
|
list(APPEND LIBCXX_TEST_DEPS cxx_external_threads)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_lit_testsuite(check-cxx
|
add_lit_testsuite(check-cxx
|
||||||
"Running libcxx tests"
|
"Running libcxx tests"
|
||||||
${CMAKE_CURRENT_BINARY_DIR}
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
DEPENDS cxx ${experimental_dep} ${external_threads_dep})
|
DEPENDS cxx ${LIBCXX_TEST_DEPS})
|
||||||
|
|
||||||
add_custom_target(check-libcxx DEPENDS check-cxx)
|
add_custom_target(check-libcxx DEPENDS check-cxx)
|
||||||
|
|
||||||
|
|||||||
@@ -579,10 +579,6 @@ class Configuration(object):
|
|||||||
self.cxx.link_flags += [abs_path]
|
self.cxx.link_flags += [abs_path]
|
||||||
else:
|
else:
|
||||||
self.cxx.link_flags += ['-lc++']
|
self.cxx.link_flags += ['-lc++']
|
||||||
# This needs to come after -lc++ as we want its unresolved thread-api symbols
|
|
||||||
# to be picked up from this one.
|
|
||||||
if self.get_lit_bool('libcxx_external_thread_api', default=False):
|
|
||||||
self.cxx.link_flags += ['-lc++external_threads']
|
|
||||||
|
|
||||||
def configure_link_flags_abi_library(self):
|
def configure_link_flags_abi_library(self):
|
||||||
cxx_abi = self.get_lit_conf('cxx_abi', 'libcxxabi')
|
cxx_abi = self.get_lit_conf('cxx_abi', 'libcxxabi')
|
||||||
@@ -611,6 +607,8 @@ class Configuration(object):
|
|||||||
'C++ ABI setting %s unsupported for tests' % cxx_abi)
|
'C++ ABI setting %s unsupported for tests' % cxx_abi)
|
||||||
|
|
||||||
def configure_extra_library_flags(self):
|
def configure_extra_library_flags(self):
|
||||||
|
if self.get_lit_bool('cxx_ext_threads', default=False):
|
||||||
|
self.cxx.link_flags += ['-lc++external_threads']
|
||||||
self.target_info.add_cxx_link_flags(self.cxx.link_flags)
|
self.target_info.add_cxx_link_flags(self.cxx.link_flags)
|
||||||
|
|
||||||
def configure_color_diagnostics(self):
|
def configure_color_diagnostics(self):
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ config.has_libatomic = "@LIBCXX_HAS_ATOMIC_LIB@"
|
|||||||
config.use_libatomic = "@LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB@"
|
config.use_libatomic = "@LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB@"
|
||||||
|
|
||||||
config.libcxxabi_shared = "@LIBCXXABI_ENABLE_SHARED@"
|
config.libcxxabi_shared = "@LIBCXXABI_ENABLE_SHARED@"
|
||||||
config.libcxx_external_thread_api = "@LIBCXX_HAS_EXTERNAL_THREAD_API@"
|
config.cxx_ext_threads = "@LIBCXX_HAS_EXTERNAL_THREAD_API@"
|
||||||
|
|
||||||
# Let the main config do the real work.
|
# Let the main config do the real work.
|
||||||
config.loaded_site_config = True
|
config.loaded_site_config = True
|
||||||
|
|||||||
Reference in New Issue
Block a user