[libcxx] r290889 - [libcxx] Add build/test support for the externally threaded libc++abi variant

Asiri Rathnayake via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 25 12:42:53 PST 2017


Hi Nico,

Thanks for the links. I may have a clue to what is going on.

I think in your Mac environment, <pthread.h> does not provide
either pthread_mach_thread_np() function or define the type mach_port_t (is
there a way for you to check this btw? just to make sure).

This was not a problem before (for your builds) because this function was
only used in libcxxabi sources. In my eagerness to get rid of all pthread
dependencies in libcxx/libcxxabi, I have lifted this out into
__threading_support header in libcxx (which is our new threading API for
both libcxx and libcxxabi).

@Eric: would it be OK to leave this Mac-specific pthread dependency in
libcxxabi sources as it was? In that way, libcxx builds like Nico's won't
be affected.

Another option is to try and detect the conditions (on Mac environments)
where pthread_mach_thread_np/mach_port_t is available, and only define the
corresponding libcxx thread-api function (__libcpp_thread_get_port) when
this condition is true. Unfortunately I'm not familiar with Mac enough to
know this. Any thoughts?

Side note:- Btw, if I'm correct with the above analysis, it won't be
possible to build libcxxabi in Nico's environment (even before my changes).
The dependency on pthread_mach_thread_np() was already there
in __cxa_guard_acquire().

Thanks.

/ Asiri


On Wed, Jan 25, 2017 at 7:34 PM, Nico Weber <thakis at chromium.org> wrote:

> Sure! https://build.chromium.org/p/chromium.fyi/builders/
> ClangToTMacASan/builds/8565/steps/gclient%20runhooks/logs/stdio has the
> invocations to build llvm/clang/compiler/rt, and https://build.chromium.
> org/p/chromium.fyi/builders/ClangToTMacASan/builds/8565/
> steps/compile/logs/stdio is the actual build using that setup.
>
> On Wed, Jan 25, 2017 at 1:57 PM, Asiri Rathnayake <
> asiri.rathnayake at gmail.com> wrote:
>
>> @Nico: could you let me know your build configuration? (cmake options)
>>
>> I'm surprised this went unnoticed for so long.
>>
>> Thanks.
>>
>> / Asiri
>>
>> On 25 Jan 2017 5:52 p.m., "Asiri Rathnayake" <asiri.rathnayake at gmail.com>
>> wrote:
>>
>>> (including cfe-commits)
>>>
>>> On Wed, Jan 25, 2017 at 5:51 PM, Asiri Rathnayake <
>>> asiri.rathnayake at gmail.com> wrote:
>>>
>>>> Hi Nico,
>>>>
>>>> On Wed, Jan 25, 2017 at 5:32 PM, Nico Weber via cfe-commits <
>>>> cfe-commits at lists.llvm.org> wrote:
>>>>
>>>>> Is it intentional that this change affects
>>>>> non-LIBCXX_HAS_EXTERNAL_THREAD_API builds at all?#
>>>>>
>>>>
>>>> Nope. But I'm not sure how this got broken on Mac.
>>>>
>>>> IIRC, <pthread.h> defines mach_port_t type on Mac, which gets included
>>>> when _LIBCPP_HAS_THREAD_API_PTHREAD is defined (which is what we
>>>> expect to be the case on Mac, normally).
>>>>
>>>> I'll have to build this on a Mac tomorrow. Hopefully that's OK?
>>>>
>>>> Cheers,
>>>>
>>>> / Asiri
>>>>
>>>>
>>>>
>>>>>
>>>>> On Wed, Jan 25, 2017 at 12:31 PM, Nico Weber <thakis at chromium.org>
>>>>> wrote:
>>>>>
>>>>>> This breaks all our mac builds with:
>>>>>>
>>>>>> /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'
>>>>>> mach_port_t __libcpp_thread_get_port();
>>>>>>
>>>>>> On Tue, Jan 3, 2017 at 7:59 AM, Asiri Rathnayake via cfe-commits <
>>>>>> cfe-commits at lists.llvm.org> wrote:
>>>>>>
>>>>>>> Author: asiri
>>>>>>> Date: Tue Jan  3 06:59:50 2017
>>>>>>> New Revision: 290889
>>>>>>>
>>>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=290889&view=rev
>>>>>>> Log:
>>>>>>> [libcxx] Add build/test support for the externally threaded
>>>>>>> libc++abi variant
>>>>>>>
>>>>>>> Differential revision: https://reviews.llvm.org/D27576
>>>>>>>
>>>>>>> Reviewers: EricWF
>>>>>>>
>>>>>>> Modified:
>>>>>>>     libcxx/trunk/CMakeLists.txt
>>>>>>>     libcxx/trunk/include/__threading_support
>>>>>>>     libcxx/trunk/test/CMakeLists.txt
>>>>>>>     libcxx/trunk/test/libcxx/test/config.py
>>>>>>>     libcxx/trunk/test/lit.site.cfg.in
>>>>>>>
>>>>>>> Modified: libcxx/trunk/CMakeLists.txt
>>>>>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/CMakeLists.
>>>>>>> txt?rev=290889&r1=290888&r2=290889&view=diff
>>>>>>> ============================================================
>>>>>>> ==================
>>>>>>> --- libcxx/trunk/CMakeLists.txt (original)
>>>>>>> +++ libcxx/trunk/CMakeLists.txt Tue Jan  3 06:59:50 2017
>>>>>>> @@ -221,14 +221,21 @@ if(LIBCXX_ENABLE_THREADS AND NOT LIBCXX_
>>>>>>>                        " 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
>>>>>>>
>>>>>>> Modified: libcxx/trunk/include/__threading_support
>>>>>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__t
>>>>>>> hreading_support?rev=290889&r1=290888&r2=290889&view=diff
>>>>>>> ============================================================
>>>>>>> ==================
>>>>>>> --- libcxx/trunk/include/__threading_support (original)
>>>>>>> +++ libcxx/trunk/include/__threading_support Tue Jan  3 06:59:50
>>>>>>> 2017
>>>>>>> @@ -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_
>>>>>>>  _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_co
>>>>>>>    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
>>>>>>>    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
>>>>>>>
>>>>>>> Modified: libcxx/trunk/test/CMakeLists.txt
>>>>>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/CMakeL
>>>>>>> ists.txt?rev=290889&r1=290888&r2=290889&view=diff
>>>>>>> ============================================================
>>>>>>> ==================
>>>>>>> --- libcxx/trunk/test/CMakeLists.txt (original)
>>>>>>> +++ libcxx/trunk/test/CMakeLists.txt Tue Jan  3 06:59:50 2017
>>>>>>> @@ -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)
>>>>>>>
>>>>>>>
>>>>>>> Modified: libcxx/trunk/test/libcxx/test/config.py
>>>>>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx
>>>>>>> /test/config.py?rev=290889&r1=290888&r2=290889&view=diff
>>>>>>> ============================================================
>>>>>>> ==================
>>>>>>> --- libcxx/trunk/test/libcxx/test/config.py (original)
>>>>>>> +++ libcxx/trunk/test/libcxx/test/config.py Tue Jan  3 06:59:50 2017
>>>>>>> @@ -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):
>>>>>>>
>>>>>>> Modified: libcxx/trunk/test/lit.site.cfg.in
>>>>>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/lit.si
>>>>>>> te.cfg.in?rev=290889&r1=290888&r2=290889&view=diff
>>>>>>> ============================================================
>>>>>>> ==================
>>>>>>> --- libcxx/trunk/test/lit.site.cfg.in (original)
>>>>>>> +++ libcxx/trunk/test/lit.site.cfg.in Tue Jan  3 06:59:50 2017
>>>>>>> @@ -28,7 +28,7 @@ config.has_libatomic            = "@LIBC
>>>>>>>  config.use_libatomic            = "@LIBCXX_HAVE_CXX_ATOMICS_WITH
>>>>>>> _LIB@"
>>>>>>>
>>>>>>>  config.libcxxabi_shared         = "@LIBCXXABI_ENABLE_SHARED@"
>>>>>>> -config.libcxx_external_thread_api  = "@LIBCXX_HAS_EXTERNAL_THREAD_A
>>>>>>> PI@"
>>>>>>> +config.cxx_ext_threads          = "@LIBCXX_HAS_EXTERNAL_THREAD_API@
>>>>>>> "
>>>>>>>
>>>>>>>  # Let the main config do the real work.
>>>>>>>  config.loaded_site_config = True
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> cfe-commits mailing list
>>>>>>> cfe-commits at lists.llvm.org
>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> cfe-commits mailing list
>>>>> cfe-commits at lists.llvm.org
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>>
>>>>>
>>>>
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170125/5c2c31d5/attachment-0001.html>


More information about the cfe-commits mailing list