summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAsiri Rathnayake <asiri.rathnayake@arm.com>2017-01-03 12:59:50 +0000
committerAsiri Rathnayake <asiri.rathnayake@arm.com>2017-01-03 12:59:50 +0000
commit205d7d3f6878fa05037e1355ff2f552bdbbd9637 (patch)
tree96d1bd0963334f4fe3a5fb6512f13b2ba342a49a
parent97ba9fae1f536778b1aaff4220512626e6170728 (diff)
downloadbcm5719-llvm-205d7d3f6878fa05037e1355ff2f552bdbbd9637.tar.gz
bcm5719-llvm-205d7d3f6878fa05037e1355ff2f552bdbbd9637.zip
[libcxx] Add build/test support for the externally threaded libc++abi variant
Differential revision: https://reviews.llvm.org/D27576 Reviewers: EricWF llvm-svn: 290889
-rw-r--r--libcxx/CMakeLists.txt19
-rw-r--r--libcxx/include/__threading_support37
-rw-r--r--libcxx/test/CMakeLists.txt8
-rw-r--r--libcxx/test/libcxx/test/config.py6
-rw-r--r--libcxx/test/lit.site.cfg.in2
5 files changed, 53 insertions, 19 deletions
diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt
index 21d7ded33d9..803e8f717a8 100644
--- a/libcxx/CMakeLists.txt
+++ b/libcxx/CMakeLists.txt
@@ -221,14 +221,21 @@ if(LIBCXX_ENABLE_THREADS AND NOT LIBCXX_ENABLE_MONOTONIC_CLOCK)
" when LIBCXX_ENABLE_THREADS is also set to OFF.")
endif()
-if(LIBCXX_HAS_PTHREAD_API AND NOT LIBCXX_ENABLE_THREADS)
- message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON"
- " when LIBCXX_ENABLE_THREADS is also set to ON.")
+if(NOT LIBCXX_ENABLE_THREADS)
+ if(LIBCXX_HAS_PTHREAD_API)
+ 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()
-if(LIBCXX_HAS_EXTERNAL_THREAD_API AND NOT LIBCXX_ENABLE_THREADS)
- message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON"
- " when LIBCXX_ENABLE_THREADS is also set to ON.")
+if(LIBCXX_HAS_PTHREAD_API AND LIBCXX_HAS_EXTERNAL_THREAD_API)
+ message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_API"
+ "and LIBCXX_HAS_PTHREAD_API cannot be both"
+ "set to ON at the same time.")
endif()
# Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE
diff --git a/libcxx/include/__threading_support b/libcxx/include/__threading_support
index 0064c7d598b..b1eaf25ae8a 100644
--- a/libcxx/include/__threading_support
+++ b/libcxx/include/__threading_support
@@ -67,7 +67,11 @@ typedef pthread_mutex_t __libcpp_mutex_t;
typedef pthread_cond_t __libcpp_condvar_t;
#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;
// Thread
@@ -110,7 +114,17 @@ int __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m,
_LIBCPP_THREAD_ABI_VISIBILITY
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
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);
_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) || \
defined(_LIBCPP_BUILDING_THREAD_API_EXTERNAL_PTHREAD)
@@ -221,6 +235,19 @@ int __libcpp_condvar_destroy(__libcpp_condvar_t *__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
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);
}
-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
diff --git a/libcxx/test/CMakeLists.txt b/libcxx/test/CMakeLists.txt
index edebaee5540..d174ec72ca0 100644
--- a/libcxx/test/CMakeLists.txt
+++ b/libcxx/test/CMakeLists.txt
@@ -55,18 +55,20 @@ configure_file(
${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg
@ONLY)
+set(LIBCXX_TEST_DEPS "")
+
if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY)
- set(experimental_dep cxx_experimental)
+ set(LIBCXX_TEST_DEPS cxx_experimental)
endif()
if (LIBCXX_HAS_EXTERNAL_THREAD_API)
- set(external_threads_dep cxx_external_threads)
+ list(APPEND LIBCXX_TEST_DEPS cxx_external_threads)
endif()
add_lit_testsuite(check-cxx
"Running libcxx tests"
${CMAKE_CURRENT_BINARY_DIR}
- DEPENDS cxx ${experimental_dep} ${external_threads_dep})
+ DEPENDS cxx ${LIBCXX_TEST_DEPS})
add_custom_target(check-libcxx DEPENDS check-cxx)
diff --git a/libcxx/test/libcxx/test/config.py b/libcxx/test/libcxx/test/config.py
index e5f4173d1cb..dd90e7a3743 100644
--- a/libcxx/test/libcxx/test/config.py
+++ b/libcxx/test/libcxx/test/config.py
@@ -579,10 +579,6 @@ class Configuration(object):
self.cxx.link_flags += [abs_path]
else:
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):
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)
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)
def configure_color_diagnostics(self):
diff --git a/libcxx/test/lit.site.cfg.in b/libcxx/test/lit.site.cfg.in
index 741e9c89ac4..c89af09ddbf 100644
--- a/libcxx/test/lit.site.cfg.in
+++ b/libcxx/test/lit.site.cfg.in
@@ -28,7 +28,7 @@ config.has_libatomic = "@LIBCXX_HAS_ATOMIC_LIB@"
config.use_libatomic = "@LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB@"
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.
config.loaded_site_config = True
OpenPOWER on IntegriCloud