<div dir="ltr">This breaks all our mac builds with:<div><br></div><div><div>/b/c/b/ClangToTMac__dbg_/src/third_party/llvm-build/Release+Asserts/bin/../include/c++/v1/__threading_support:154:1: error: unknown type name 'mach_port_t'</div><div>mach_port_t __libcpp_thread_get_port();</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 3, 2017 at 7:59 AM, Asiri Rathnayake via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: asiri<br>
Date: Tue Jan  3 06:59:50 2017<br>
New Revision: 290889<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=290889&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=290889&view=rev</a><br>
Log:<br>
[libcxx] Add build/test support for the externally threaded libc++abi variant<br>
<br>
Differential revision: <a href="https://reviews.llvm.org/D27576" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D27576</a><br>
<br>
Reviewers: EricWF<br>
<br>
Modified:<br>
    libcxx/trunk/CMakeLists.txt<br>
    libcxx/trunk/include/__<wbr>threading_support<br>
    libcxx/trunk/test/CMakeLists.<wbr>txt<br>
    libcxx/trunk/test/libcxx/test/<wbr>config.py<br>
    libcxx/trunk/test/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.<wbr>cfg.in</a><br>
<br>
Modified: libcxx/trunk/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/CMakeLists.txt?rev=290889&r1=290888&r2=290889&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxx/trunk/<wbr>CMakeLists.txt?rev=290889&r1=<wbr>290888&r2=290889&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/CMakeLists.txt (original)<br>
+++ libcxx/trunk/CMakeLists.txt Tue Jan  3 06:59:50 2017<br>
@@ -221,14 +221,21 @@ if(LIBCXX_ENABLE_THREADS AND NOT LIBCXX_<br>
                       " when LIBCXX_ENABLE_THREADS is also set to OFF.")<br>
 endif()<br>
<br>
-if(LIBCXX_HAS_PTHREAD_API AND NOT LIBCXX_ENABLE_THREADS)<br>
-  message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON"<br>
-                      " when LIBCXX_ENABLE_THREADS is also set to ON.")<br>
+if(NOT LIBCXX_ENABLE_THREADS)<br>
+  if(LIBCXX_HAS_PTHREAD_API)<br>
+    message(FATAL_ERROR "LIBCXX_HAS_PTHREAD_API can only be set to ON"<br>
+                        " when LIBCXX_ENABLE_THREADS is also set to ON.")<br>
+  endif()<br>
+  if(LIBCXX_HAS_EXTERNAL_THREAD_<wbr>API)<br>
+    message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_<wbr>API can only be set to ON"<br>
+                        " when LIBCXX_ENABLE_THREADS is also set to ON.")<br>
+  endif()<br>
 endif()<br>
<br>
-if(LIBCXX_HAS_EXTERNAL_<wbr>THREAD_API AND NOT LIBCXX_ENABLE_THREADS)<br>
-  message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_<wbr>API can only be set to ON"<br>
-                      " when LIBCXX_ENABLE_THREADS is also set to ON.")<br>
+if(LIBCXX_HAS_PTHREAD_API AND LIBCXX_HAS_EXTERNAL_THREAD_<wbr>API)<br>
+  message(FATAL_ERROR "The options LIBCXX_HAS_EXTERNAL_THREAD_<wbr>API"<br>
+                      "and LIBCXX_HAS_PTHREAD_API cannot be both"<br>
+                      "set to ON at the same time.")<br>
 endif()<br>
<br>
 # Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE<br>
<br>
Modified: libcxx/trunk/include/__<wbr>threading_support<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__threading_support?rev=290889&r1=290888&r2=290889&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxx/trunk/include/_<wbr>_threading_support?rev=290889&<wbr>r1=290888&r2=290889&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/include/__<wbr>threading_support (original)<br>
+++ libcxx/trunk/include/__<wbr>threading_support Tue Jan  3 06:59:50 2017<br>
@@ -67,7 +67,11 @@ typedef pthread_mutex_t __libcpp_mutex_t<br>
 typedef pthread_cond_t __libcpp_condvar_t;<br>
 #define _LIBCPP_CONDVAR_INITIALIZER PTHREAD_COND_INITIALIZER<br>
<br>
-// THread ID<br>
+// Execute once<br>
+typedef pthread_once_t __libcpp_exec_once_flag;<br>
+#define _LIBCPP_EXEC_ONCE_INITIALIZER PTHREAD_ONCE_INIT<br>
+<br>
+// Thread id<br>
 typedef pthread_t __libcpp_thread_id;<br>
<br>
 // Thread<br>
@@ -110,7 +114,17 @@ int __libcpp_condvar_timedwait(__<wbr>libcpp_<br>
 _LIBCPP_THREAD_ABI_VISIBILITY<br>
 int __libcpp_condvar_destroy(__<wbr>libcpp_condvar_t* __cv);<br>
<br>
-// Thread ID<br>
+// Execute once<br>
+_LIBCPP_THREAD_ABI_VISIBILITY<br>
+int __libcpp_execute_once(__<wbr>libcpp_exec_once_flag *flag,<br>
+                          void (*init_routine)(void));<br>
+<br>
+// Thread id<br>
+#if defined(__APPLE__) && !defined(__arm__)<br>
+_LIBCPP_THREAD_ABI_VISIBILITY<br>
+mach_port_t __libcpp_thread_get_port();<br>
+#endif<br>
+<br>
 _LIBCPP_THREAD_ABI_VISIBILITY<br>
 bool __libcpp_thread_id_equal(__<wbr>libcpp_thread_id t1, __libcpp_thread_id t2);<br>
<br>
@@ -145,7 +159,7 @@ _LIBCPP_THREAD_ABI_VISIBILITY<br>
 void *__libcpp_tls_get(__libcpp_<wbr>tls_key __key);<br>
<br>
 _LIBCPP_THREAD_ABI_VISIBILITY<br>
-void __libcpp_tls_set(__libcpp_tls_<wbr>key __key, void *__p);<br>
+int __libcpp_tls_set(__libcpp_tls_<wbr>key __key, void *__p);<br>
<br>
 #if defined(_LIBCPP_HAS_THREAD_<wbr>API_PTHREAD) || \<br>
     defined(_LIBCPP_BUILDING_<wbr>THREAD_API_EXTERNAL_PTHREAD)<br>
@@ -221,6 +235,19 @@ int __libcpp_condvar_destroy(__<wbr>libcpp_co<br>
   return pthread_cond_destroy(__cv);<br>
 }<br>
<br>
+// Execute once<br>
+int __libcpp_execute_once(__<wbr>libcpp_exec_once_flag *flag,<br>
+                          void (*init_routine)(void)) {<br>
+  return pthread_once(flag, init_routine);<br>
+}<br>
+<br>
+// Thread id<br>
+#if defined(__APPLE__) && !defined(__arm__)<br>
+mach_port_t __libcpp_thread_get_port() {<br>
+    return pthread_mach_thread_np(<wbr>pthread_self());<br>
+}<br>
+#endif<br>
+<br>
 // Returns non-zero if the thread ids are equal, otherwise 0<br>
 bool __libcpp_thread_id_equal(__<wbr>libcpp_thread_id t1, __libcpp_thread_id t2)<br>
 {<br>
@@ -276,9 +303,9 @@ void *__libcpp_tls_get(__libcpp_<wbr>tls_key<br>
   return pthread_getspecific(__key);<br>
 }<br>
<br>
-void __libcpp_tls_set(__libcpp_tls_<wbr>key __key, void *__p)<br>
+int __libcpp_tls_set(__libcpp_tls_<wbr>key __key, void *__p)<br>
 {<br>
-  pthread_setspecific(__key, __p);<br>
+    return pthread_setspecific(__key, __p);<br>
 }<br>
<br>
 #endif // _LIBCPP_HAS_THREAD_API_PTHREAD<br>
<br>
Modified: libcxx/trunk/test/CMakeLists.<wbr>txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/CMakeLists.txt?rev=290889&r1=290888&r2=290889&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxx/trunk/test/<wbr>CMakeLists.txt?rev=290889&r1=<wbr>290888&r2=290889&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/CMakeLists.<wbr>txt (original)<br>
+++ libcxx/trunk/test/CMakeLists.<wbr>txt Tue Jan  3 06:59:50 2017<br>
@@ -55,18 +55,20 @@ configure_file(<br>
   ${CMAKE_CURRENT_BINARY_DIR}/<wbr>lit.site.cfg<br>
   @ONLY)<br>
<br>
+set(LIBCXX_TEST_DEPS "")<br>
+<br>
 if (LIBCXX_ENABLE_EXPERIMENTAL_<wbr>LIBRARY)<br>
-  set(experimental_dep cxx_experimental)<br>
+  set(LIBCXX_TEST_DEPS cxx_experimental)<br>
 endif()<br>
<br>
 if (LIBCXX_HAS_EXTERNAL_THREAD_<wbr>API)<br>
-  set(external_threads_dep cxx_external_threads)<br>
+  list(APPEND LIBCXX_TEST_DEPS cxx_external_threads)<br>
 endif()<br>
<br>
 add_lit_testsuite(check-cxx<br>
   "Running libcxx tests"<br>
   ${CMAKE_CURRENT_BINARY_DIR}<br>
-  DEPENDS cxx ${experimental_dep} ${external_threads_dep})<br>
+  DEPENDS cxx ${LIBCXX_TEST_DEPS})<br>
<br>
 add_custom_target(check-libcxx DEPENDS check-cxx)<br>
<br>
<br>
Modified: libcxx/trunk/test/libcxx/test/<wbr>config.py<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/test/config.py?rev=290889&r1=290888&r2=290889&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxx/trunk/test/<wbr>libcxx/test/config.py?rev=<wbr>290889&r1=290888&r2=290889&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/libcxx/test/<wbr>config.py (original)<br>
+++ libcxx/trunk/test/libcxx/test/<wbr>config.py Tue Jan  3 06:59:50 2017<br>
@@ -579,10 +579,6 @@ class Configuration(object):<br>
                 self.cxx.link_flags += [abs_path]<br>
             else:<br>
                 self.cxx.link_flags += ['-lc++']<br>
-        # This needs to come after -lc++ as we want its unresolved thread-api symbols<br>
-        # to be picked up from this one.<br>
-        if self.get_lit_bool('libcxx_<wbr>external_thread_api', default=False):<br>
-            self.cxx.link_flags += ['-lc++external_threads']<br>
<br>
     def configure_link_flags_abi_<wbr>library(self):<br>
         cxx_abi = self.get_lit_conf('cxx_abi', 'libcxxabi')<br>
@@ -611,6 +607,8 @@ class Configuration(object):<br>
                 'C++ ABI setting %s unsupported for tests' % cxx_abi)<br>
<br>
     def configure_extra_library_flags(<wbr>self):<br>
+        if self.get_lit_bool('cxx_ext_<wbr>threads', default=False):<br>
+            self.cxx.link_flags += ['-lc++external_threads']<br>
         self.target_info.add_cxx_link_<wbr>flags(self.cxx.link_flags)<br>
<br>
     def configure_color_diagnostics(<wbr>self):<br>
<br>
Modified: libcxx/trunk/test/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.<wbr>cfg.in</a><br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/lit.site.cfg.in?rev=290889&r1=290888&r2=290889&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/libcxx/trunk/test/lit.<wbr>site.cfg.in?rev=290889&r1=<wbr>290888&r2=290889&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.<wbr>cfg.in</a> (original)<br>
+++ libcxx/trunk/test/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.<wbr>cfg.in</a> Tue Jan  3 06:59:50 2017<br>
@@ -28,7 +28,7 @@ config.has_libatomic            = "@LIBC<br>
 config.use_libatomic            = "@LIBCXX_HAVE_CXX_ATOMICS_<wbr>WITH_LIB@"<br>
<br>
 config.libcxxabi_shared         = "@LIBCXXABI_ENABLE_SHARED@"<br>
-config.libcxx_external_<wbr>thread_api  = "@LIBCXX_HAS_EXTERNAL_THREAD_<wbr>API@"<br>
+config.cxx_ext_threads          = "@LIBCXX_HAS_EXTERNAL_THREAD_<wbr>API@"<br>
<br>
 # Let the main config do the real work.<br>
 config.loaded_site_config = True<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>