<div dir="ltr">Can we can just check for glibc version inside of the #ifdef __linux__ branch and then do nothing if the glibc version is too small?  </div><br><div class="gmail_quote"><div dir="ltr">On Fri, Mar 3, 2017 at 12:52 PM Krzysztof Parzyszek <<a href="mailto:kparzysz@codeaurora.org">kparzysz@codeaurora.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">These are our local builds on SUSE 11.4 (glibc 2.11.3). The functions<br class="gmail_msg">
are pthread_setname_np and pthread_getname_np.<br class="gmail_msg">
<br class="gmail_msg">
It should be fine if the functions you added do nothing on that system,<br class="gmail_msg">
as long as the code compiles.<br class="gmail_msg">
<br class="gmail_msg">
If you don't have access to this kind of OS, I could come up with some<br class="gmail_msg">
patch (test for these functions in cmake).<br class="gmail_msg">
<br class="gmail_msg">
-Krzysztof<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
On 3/3/2017 2:42 PM, Zachary Turner wrote:<br class="gmail_msg">
> Which function does it not provide specifically?  Can you link me to a<br class="gmail_msg">
> failing buildbot?<br class="gmail_msg">
><br class="gmail_msg">
> On Fri, Mar 3, 2017 at 11:01 AM Krzysztof Parzyszek via llvm-commits<br class="gmail_msg">
> <<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a> <mailto:<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a>>> wrote:<br class="gmail_msg">
><br class="gmail_msg">
>     This thing fails to build on older Linuxes (e.g. SUSE).<br class="gmail_msg">
>     Glibc 2.11.3 does not provide this function.<br class="gmail_msg">
><br class="gmail_msg">
>     This breaks some of our builds.<br class="gmail_msg">
><br class="gmail_msg">
>     -Krzysztof<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
>     On 3/3/2017 11:15 AM, Zachary Turner via llvm-commits wrote:<br class="gmail_msg">
>     > Author: zturner<br class="gmail_msg">
>     > Date: Fri Mar  3 11:15:17 2017<br class="gmail_msg">
>     > New Revision: 296887<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > URL: <a href="http://llvm.org/viewvc/llvm-project?rev=296887&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=296887&view=rev</a><br class="gmail_msg">
>     > Log:<br class="gmail_msg">
>     > [Support] Provide access to current thread name/thread id.<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > Applications often need the current thread id when making<br class="gmail_msg">
>     > system calls, and some operating systems provide the notion<br class="gmail_msg">
>     > of a thread name, which can be useful in enabling better<br class="gmail_msg">
>     > diagnostics when debugging or logging.<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > This patch adds an accessor for the thread id, and "best effort"<br class="gmail_msg">
>     > getters and setters for the thread name.  Since this is<br class="gmail_msg">
>     > non critical functionality, no error is returned to indicate<br class="gmail_msg">
>     > that a platform doesn't support thread names.<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > Differential Revision: <a href="https://reviews.llvm.org/D30526" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D30526</a><br class="gmail_msg">
>     ><br class="gmail_msg">
>     > Added:<br class="gmail_msg">
>     >     llvm/trunk/lib/Support/Unix/Threading.inc<br class="gmail_msg">
>     >     llvm/trunk/lib/Support/Windows/Threading.inc<br class="gmail_msg">
>     > Modified:<br class="gmail_msg">
>     >     llvm/trunk/include/llvm/Support/Threading.h<br class="gmail_msg">
>     >     llvm/trunk/lib/Support/Threading.cpp<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > Modified: llvm/trunk/include/llvm/Support/Threading.h<br class="gmail_msg">
>     > URL:<br class="gmail_msg">
>     <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Threading.h?rev=296887&r1=296886&r2=296887&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Threading.h?rev=296887&r1=296886&r2=296887&view=diff</a><br class="gmail_msg">
>     ><br class="gmail_msg">
>     ==============================================================================<br class="gmail_msg">
>     > --- llvm/trunk/include/llvm/Support/Threading.h (original)<br class="gmail_msg">
>     > +++ llvm/trunk/include/llvm/Support/Threading.h Fri Mar  3<br class="gmail_msg">
>     11:15:17 2017<br class="gmail_msg">
>     > @@ -15,6 +15,7 @@<br class="gmail_msg">
>     >  #ifndef LLVM_SUPPORT_THREADING_H<br class="gmail_msg">
>     >  #define LLVM_SUPPORT_THREADING_H<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > +#include "llvm/ADT/SmallVector.h"<br class="gmail_msg">
>     >  #include "llvm/Config/llvm-config.h" // for LLVM_ON_UNIX<br class="gmail_msg">
>     >  #include "llvm/Support/Compiler.h"<br class="gmail_msg">
>     >  #include <ciso646> // So we can check the C++ standard lib macros.<br class="gmail_msg">
>     > @@ -42,24 +43,26 @@<br class="gmail_msg">
>     >  #endif<br class="gmail_msg">
>     ><br class="gmail_msg">
>     >  namespace llvm {<br class="gmail_msg">
>     > -  /// Returns true if LLVM is compiled with support for<br class="gmail_msg">
>     multi-threading, and<br class="gmail_msg">
>     > -  /// false otherwise.<br class="gmail_msg">
>     > -  bool llvm_is_multithreaded();<br class="gmail_msg">
>     > -<br class="gmail_msg">
>     > -  /// llvm_execute_on_thread - Execute the given \p UserFn on a<br class="gmail_msg">
>     separate<br class="gmail_msg">
>     > -  /// thread, passing it the provided \p UserData and waits for<br class="gmail_msg">
>     thread<br class="gmail_msg">
>     > -  /// completion.<br class="gmail_msg">
>     > -  ///<br class="gmail_msg">
>     > -  /// This function does not guarantee that the code will<br class="gmail_msg">
>     actually be executed<br class="gmail_msg">
>     > -  /// on a separate thread or honoring the requested stack size,<br class="gmail_msg">
>     but tries to do<br class="gmail_msg">
>     > -  /// so where system support is available.<br class="gmail_msg">
>     > -  ///<br class="gmail_msg">
>     > -  /// \param UserFn - The callback to execute.<br class="gmail_msg">
>     > -  /// \param UserData - An argument to pass to the callback function.<br class="gmail_msg">
>     > -  /// \param RequestedStackSize - If non-zero, a requested size<br class="gmail_msg">
>     (in bytes) for<br class="gmail_msg">
>     > -  /// the thread stack.<br class="gmail_msg">
>     > -  void llvm_execute_on_thread(void (*UserFn)(void*), void *UserData,<br class="gmail_msg">
>     > -                              unsigned RequestedStackSize = 0);<br class="gmail_msg">
>     > +class Twine;<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +/// Returns true if LLVM is compiled with support for<br class="gmail_msg">
>     multi-threading, and<br class="gmail_msg">
>     > +/// false otherwise.<br class="gmail_msg">
>     > +bool llvm_is_multithreaded();<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +/// llvm_execute_on_thread - Execute the given \p UserFn on a<br class="gmail_msg">
>     separate<br class="gmail_msg">
>     > +/// thread, passing it the provided \p UserData and waits for thread<br class="gmail_msg">
>     > +/// completion.<br class="gmail_msg">
>     > +///<br class="gmail_msg">
>     > +/// This function does not guarantee that the code will actually<br class="gmail_msg">
>     be executed<br class="gmail_msg">
>     > +/// on a separate thread or honoring the requested stack size,<br class="gmail_msg">
>     but tries to do<br class="gmail_msg">
>     > +/// so where system support is available.<br class="gmail_msg">
>     > +///<br class="gmail_msg">
>     > +/// \param UserFn - The callback to execute.<br class="gmail_msg">
>     > +/// \param UserData - An argument to pass to the callback function.<br class="gmail_msg">
>     > +/// \param RequestedStackSize - If non-zero, a requested size (in<br class="gmail_msg">
>     bytes) for<br class="gmail_msg">
>     > +/// the thread stack.<br class="gmail_msg">
>     > +void llvm_execute_on_thread(void (*UserFn)(void *), void *UserData,<br class="gmail_msg">
>     > +                            unsigned RequestedStackSize = 0);<br class="gmail_msg">
>     ><br class="gmail_msg">
>     >  #if LLVM_THREADING_USE_STD_CALL_ONCE<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > @@ -127,6 +130,28 @@ namespace llvm {<br class="gmail_msg">
>     >    /// thread::hardware_concurrency().<br class="gmail_msg">
>     >    /// Returns 1 when LLVM is configured with LLVM_ENABLE_THREADS=OFF<br class="gmail_msg">
>     >    unsigned heavyweight_hardware_concurrency();<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  /// \brief Return the current thread id, as used in various OS<br class="gmail_msg">
>     system calls.<br class="gmail_msg">
>     > +  /// Note that not all platforms guarantee that the value<br class="gmail_msg">
>     returned will be<br class="gmail_msg">
>     > +  /// unique across the entire system, so portable code should<br class="gmail_msg">
>     not assume<br class="gmail_msg">
>     > +  /// this.<br class="gmail_msg">
>     > +  uint64_t get_threadid();<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  /// \brief Set the name of the current thread.  Setting a<br class="gmail_msg">
>     thread's name can<br class="gmail_msg">
>     > +  /// be helpful for enabling useful diagnostics under a debugger<br class="gmail_msg">
>     or when<br class="gmail_msg">
>     > +  /// logging.  The level of support for setting a thread's name<br class="gmail_msg">
>     varies<br class="gmail_msg">
>     > +  /// wildly across operating systems, and we only make a best<br class="gmail_msg">
>     effort to<br class="gmail_msg">
>     > +  /// perform the operation on supported platforms.  No<br class="gmail_msg">
>     indication of success<br class="gmail_msg">
>     > +  /// or failure is returned.<br class="gmail_msg">
>     > +  void set_thread_name(const Twine &Name);<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  /// \brief Get the name of the current thread.  The level of<br class="gmail_msg">
>     support for<br class="gmail_msg">
>     > +  /// getting a thread's name varies wildly across operating<br class="gmail_msg">
>     systems, and it<br class="gmail_msg">
>     > +  /// is not even guaranteed that if you can successfully set a<br class="gmail_msg">
>     thread's name<br class="gmail_msg">
>     > +  /// that you can later get it back.  This function is intended<br class="gmail_msg">
>     for diagnostic<br class="gmail_msg">
>     > +  /// purposes, and as with setting a thread's name no indication<br class="gmail_msg">
>     of whether<br class="gmail_msg">
>     > +  /// the operation succeeded or failed is returned.<br class="gmail_msg">
>     > +  void get_thread_name(SmallVectorImpl<char> &Name);<br class="gmail_msg">
>     >  }<br class="gmail_msg">
>     ><br class="gmail_msg">
>     >  #endif<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > Modified: llvm/trunk/lib/Support/Threading.cpp<br class="gmail_msg">
>     > URL:<br class="gmail_msg">
>     <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Threading.cpp?rev=296887&r1=296886&r2=296887&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Threading.cpp?rev=296887&r1=296886&r2=296887&view=diff</a><br class="gmail_msg">
>     ><br class="gmail_msg">
>     ==============================================================================<br class="gmail_msg">
>     > --- llvm/trunk/lib/Support/Threading.cpp (original)<br class="gmail_msg">
>     > +++ llvm/trunk/lib/Support/Threading.cpp Fri Mar  3 11:15:17 2017<br class="gmail_msg">
>     > @@ -14,14 +14,21 @@<br class="gmail_msg">
>     ><br class="gmail_msg">
>     >  #include "llvm/Support/Threading.h"<br class="gmail_msg">
>     >  #include "llvm/Config/config.h"<br class="gmail_msg">
>     > -#include "llvm/Support/Atomic.h"<br class="gmail_msg">
>     >  #include "llvm/Support/Host.h"<br class="gmail_msg">
>     > -#include "llvm/Support/Mutex.h"<br class="gmail_msg">
>     >  #include "llvm/Support/thread.h"<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     >  #include <cassert><br class="gmail_msg">
>     > +#include <errno.h><br class="gmail_msg">
>     > +#include <stdlib.h><br class="gmail_msg">
>     > +#include <string.h><br class="gmail_msg">
>     ><br class="gmail_msg">
>     >  using namespace llvm;<br class="gmail_msg">
>     ><br class="gmail_msg">
>     ><br class="gmail_msg">
>     +//===----------------------------------------------------------------------===//<br class="gmail_msg">
>     > +//=== WARNING: Implementation here must contain only TRULY<br class="gmail_msg">
>     operating system<br class="gmail_msg">
>     > +//===          independent code.<br class="gmail_msg">
>     ><br class="gmail_msg">
>     +//===----------------------------------------------------------------------===//<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     >  bool llvm::llvm_is_multithreaded() {<br class="gmail_msg">
>     >  #if LLVM_ENABLE_THREADS != 0<br class="gmail_msg">
>     >    return true;<br class="gmail_msg">
>     > @@ -30,100 +37,38 @@ bool llvm::llvm_is_multithreaded() {<br class="gmail_msg">
>     >  #endif<br class="gmail_msg">
>     >  }<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > -#if LLVM_ENABLE_THREADS != 0 && defined(HAVE_PTHREAD_H)<br class="gmail_msg">
>     > -#include <pthread.h><br class="gmail_msg">
>     > -<br class="gmail_msg">
>     > -struct ThreadInfo {<br class="gmail_msg">
>     > -  void (*UserFn)(void *);<br class="gmail_msg">
>     > -  void *UserData;<br class="gmail_msg">
>     > -};<br class="gmail_msg">
>     > -static void *ExecuteOnThread_Dispatch(void *Arg) {<br class="gmail_msg">
>     > -  ThreadInfo *TI = reinterpret_cast<ThreadInfo*>(Arg);<br class="gmail_msg">
>     > -  TI->UserFn(TI->UserData);<br class="gmail_msg">
>     > -  return nullptr;<br class="gmail_msg">
>     > -}<br class="gmail_msg">
>     > -<br class="gmail_msg">
>     > -void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData,<br class="gmail_msg">
>     > +#if LLVM_ENABLE_THREADS == 0 ||<br class="gmail_msg">
>                   \<br class="gmail_msg">
>     > +    (!defined(LLVM_ON_WIN32) && !defined(HAVE_PTHREAD_H))<br class="gmail_msg">
>     > +// Support for non-Win32, non-pthread implementation.<br class="gmail_msg">
>     > +void llvm::llvm_execute_on_thread(void (*Fn)(void *), void *UserData,<br class="gmail_msg">
>     >                                    unsigned RequestedStackSize) {<br class="gmail_msg">
>     > -  ThreadInfo Info = { Fn, UserData };<br class="gmail_msg">
>     > -  pthread_attr_t Attr;<br class="gmail_msg">
>     > -  pthread_t Thread;<br class="gmail_msg">
>     > -<br class="gmail_msg">
>     > -  // Construct the attributes object.<br class="gmail_msg">
>     > -  if (::pthread_attr_init(&Attr) != 0)<br class="gmail_msg">
>     > -    return;<br class="gmail_msg">
>     > -<br class="gmail_msg">
>     > -  // Set the requested stack size, if given.<br class="gmail_msg">
>     > -  if (RequestedStackSize != 0) {<br class="gmail_msg">
>     > -    if (::pthread_attr_setstacksize(&Attr, RequestedStackSize) != 0)<br class="gmail_msg">
>     > -      goto error;<br class="gmail_msg">
>     > -  }<br class="gmail_msg">
>     > -<br class="gmail_msg">
>     > -  // Construct and execute the thread.<br class="gmail_msg">
>     > -  if (::pthread_create(&Thread, &Attr, ExecuteOnThread_Dispatch,<br class="gmail_msg">
>     &Info) != 0)<br class="gmail_msg">
>     > -    goto error;<br class="gmail_msg">
>     > -<br class="gmail_msg">
>     > -  // Wait for the thread and clean up.<br class="gmail_msg">
>     > -  ::pthread_join(Thread, nullptr);<br class="gmail_msg">
>     > -<br class="gmail_msg">
>     > - error:<br class="gmail_msg">
>     > -  ::pthread_attr_destroy(&Attr);<br class="gmail_msg">
>     > +  (void)RequestedStackSize;<br class="gmail_msg">
>     > +  Fn(UserData);<br class="gmail_msg">
>     >  }<br class="gmail_msg">
>     > -#elif LLVM_ENABLE_THREADS!=0 && defined(LLVM_ON_WIN32)<br class="gmail_msg">
>     > -#include "Windows/WindowsSupport.h"<br class="gmail_msg">
>     > -#include <process.h><br class="gmail_msg">
>     > -<br class="gmail_msg">
>     > -// Windows will at times define MemoryFence.<br class="gmail_msg">
>     > -#ifdef MemoryFence<br class="gmail_msg">
>     > -#undef MemoryFence<br class="gmail_msg">
>     > -#endif<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > -struct ThreadInfo {<br class="gmail_msg">
>     > -  void (*func)(void*);<br class="gmail_msg">
>     > -  void *param;<br class="gmail_msg">
>     > -};<br class="gmail_msg">
>     > -<br class="gmail_msg">
>     > -static unsigned __stdcall ThreadCallback(void *param) {<br class="gmail_msg">
>     > -  struct ThreadInfo *info = reinterpret_cast<struct ThreadInfo<br class="gmail_msg">
>     *>(param);<br class="gmail_msg">
>     > -  info->func(info->param);<br class="gmail_msg">
>     > +unsigned llvm::heavyweight_hardware_concurrency() { return 1; }<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > -  return 0;<br class="gmail_msg">
>     > -}<br class="gmail_msg">
>     > +uint64_t llvm::get_threadid_np() { return 0; }<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > -void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData,<br class="gmail_msg">
>     > -                                  unsigned RequestedStackSize) {<br class="gmail_msg">
>     > -  struct ThreadInfo param = { Fn, UserData };<br class="gmail_msg">
>     > +void llvm::set_thread_name(const Twine &Name) {}<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > -  HANDLE hThread = (HANDLE)::_beginthreadex(NULL,<br class="gmail_msg">
>     > -                                            RequestedStackSize,<br class="gmail_msg">
>     ThreadCallback,<br class="gmail_msg">
>     > -                                            &param, 0, NULL);<br class="gmail_msg">
>     > -<br class="gmail_msg">
>     > -  if (hThread) {<br class="gmail_msg">
>     > -    // We actually don't care whether the wait succeeds or fails, in<br class="gmail_msg">
>     > -    // the same way we don't care whether the pthread_join call<br class="gmail_msg">
>     succeeds<br class="gmail_msg">
>     > -    // or fails.  There's not much we could do if this were to<br class="gmail_msg">
>     fail. But<br class="gmail_msg">
>     > -    // on success, this call will wait until the thread finishes<br class="gmail_msg">
>     executing<br class="gmail_msg">
>     > -    // before returning.<br class="gmail_msg">
>     > -    (void)::WaitForSingleObject(hThread, INFINITE);<br class="gmail_msg">
>     > -    ::CloseHandle(hThread);<br class="gmail_msg">
>     > -  }<br class="gmail_msg">
>     > -}<br class="gmail_msg">
>     > -#else<br class="gmail_msg">
>     > -// Support for non-Win32, non-pthread implementation.<br class="gmail_msg">
>     > -void llvm::llvm_execute_on_thread(void (*Fn)(void*), void *UserData,<br class="gmail_msg">
>     > -                                  unsigned RequestedStackSize) {<br class="gmail_msg">
>     > -  (void) RequestedStackSize;<br class="gmail_msg">
>     > -  Fn(UserData);<br class="gmail_msg">
>     > -}<br class="gmail_msg">
>     > +void llvm::get_thread_name(SmallVectorImpl<char> &Name) {<br class="gmail_msg">
>     Name.clear(); }<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > -#endif<br class="gmail_msg">
>     > +#else<br class="gmail_msg">
>     ><br class="gmail_msg">
>     >  unsigned llvm::heavyweight_hardware_concurrency() {<br class="gmail_msg">
>     > -#if !LLVM_ENABLE_THREADS<br class="gmail_msg">
>     > -  return 1;<br class="gmail_msg">
>     > -#endif<br class="gmail_msg">
>     >    int NumPhysical = sys::getHostNumPhysicalCores();<br class="gmail_msg">
>     >    if (NumPhysical == -1)<br class="gmail_msg">
>     >      return thread::hardware_concurrency();<br class="gmail_msg">
>     >    return NumPhysical;<br class="gmail_msg">
>     >  }<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +// Include the platform-specific parts of this class.<br class="gmail_msg">
>     > +#ifdef LLVM_ON_UNIX<br class="gmail_msg">
>     > +#include "Unix/Threading.inc"<br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +#ifdef LLVM_ON_WIN32<br class="gmail_msg">
>     > +#include "Windows/Threading.inc"<br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > Added: llvm/trunk/lib/Support/Unix/Threading.inc<br class="gmail_msg">
>     > URL:<br class="gmail_msg">
>     <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Threading.inc?rev=296887&view=auto" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/Threading.inc?rev=296887&view=auto</a><br class="gmail_msg">
>     ><br class="gmail_msg">
>     ==============================================================================<br class="gmail_msg">
>     > --- llvm/trunk/lib/Support/Unix/Threading.inc (added)<br class="gmail_msg">
>     > +++ llvm/trunk/lib/Support/Unix/Threading.inc Fri Mar  3 11:15:17 2017<br class="gmail_msg">
>     > @@ -0,0 +1,181 @@<br class="gmail_msg">
>     > +//===- Unix/Threading.inc - Unix Threading Implementation -----<br class="gmail_msg">
>     -*- C++ -*-===//<br class="gmail_msg">
>     > +//<br class="gmail_msg">
>     > +//                     The LLVM Compiler Infrastructure<br class="gmail_msg">
>     > +//<br class="gmail_msg">
>     > +// This file is distributed under the University of Illinois Open<br class="gmail_msg">
>     Source<br class="gmail_msg">
>     > +// License. See LICENSE.TXT for details.<br class="gmail_msg">
>     > +//<br class="gmail_msg">
>     ><br class="gmail_msg">
>     +//===----------------------------------------------------------------------===//<br class="gmail_msg">
>     > +//<br class="gmail_msg">
>     > +// This file provides the Unix specific implementation of<br class="gmail_msg">
>     Threading functions.<br class="gmail_msg">
>     > +//<br class="gmail_msg">
>     ><br class="gmail_msg">
>     +//===----------------------------------------------------------------------===//<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +#include "llvm/ADT/SmallString.h"<br class="gmail_msg">
>     > +#include "llvm/ADT/Twine.h"<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +#if defined(__APPLE__)<br class="gmail_msg">
>     > +#include <mach/mach_init.h><br class="gmail_msg">
>     > +#include <mach/mach_port.h><br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +#include <pthread.h><br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +#if defined(__FreeBSD__)<br class="gmail_msg">
>     > +#include <pthread_np.h><br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +#if defined(__NetBSD__)<br class="gmail_msg">
>     > +#include <lwp.h><br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +#if defined(__linux__)<br class="gmail_msg">
>     > +#include <sys/syscall.h><br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +#if defined(__NetBSD__) || defined(__FreeBSD__) ||<br class="gmail_msg">
>     defined(__FreeBSD_kernel__)<br class="gmail_msg">
>     > +#include <sys/sysctl.h><br class="gmail_msg">
>     > +#include <sys/user.h><br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +namespace {<br class="gmail_msg">
>     > +  struct ThreadInfo {<br class="gmail_msg">
>     > +    void(*UserFn)(void *);<br class="gmail_msg">
>     > +    void *UserData;<br class="gmail_msg">
>     > +  };<br class="gmail_msg">
>     > +}<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +static void *ExecuteOnThread_Dispatch(void *Arg) {<br class="gmail_msg">
>     > +  ThreadInfo *TI = reinterpret_cast<ThreadInfo*>(Arg);<br class="gmail_msg">
>     > +  TI->UserFn(TI->UserData);<br class="gmail_msg">
>     > +  return nullptr;<br class="gmail_msg">
>     > +}<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +void llvm::llvm_execute_on_thread(void(*Fn)(void*), void *UserData,<br class="gmail_msg">
>     > +  unsigned RequestedStackSize) {<br class="gmail_msg">
>     > +  ThreadInfo Info = { Fn, UserData };<br class="gmail_msg">
>     > +  pthread_attr_t Attr;<br class="gmail_msg">
>     > +  pthread_t Thread;<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  // Construct the attributes object.<br class="gmail_msg">
>     > +  if (::pthread_attr_init(&Attr) != 0)<br class="gmail_msg">
>     > +    return;<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  // Set the requested stack size, if given.<br class="gmail_msg">
>     > +  if (RequestedStackSize != 0) {<br class="gmail_msg">
>     > +    if (::pthread_attr_setstacksize(&Attr, RequestedStackSize) != 0)<br class="gmail_msg">
>     > +      goto error;<br class="gmail_msg">
>     > +  }<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  // Construct and execute the thread.<br class="gmail_msg">
>     > +  if (::pthread_create(&Thread, &Attr, ExecuteOnThread_Dispatch,<br class="gmail_msg">
>     &Info) != 0)<br class="gmail_msg">
>     > +    goto error;<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  // Wait for the thread and clean up.<br class="gmail_msg">
>     > +  ::pthread_join(Thread, nullptr);<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +error:<br class="gmail_msg">
>     > +  ::pthread_attr_destroy(&Attr);<br class="gmail_msg">
>     > +}<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +uint64_t llvm::get_threadid() {<br class="gmail_msg">
>     > +#if defined(__APPLE__)<br class="gmail_msg">
>     > +  // Calling "mach_thread_self()" bumps the reference count on<br class="gmail_msg">
>     the thread<br class="gmail_msg">
>     > +  // port, so we need to deallocate it. mach_task_self() doesn't<br class="gmail_msg">
>     bump the ref<br class="gmail_msg">
>     > +  // count.<br class="gmail_msg">
>     > +  thread_port_t Self = mach_thread_self();<br class="gmail_msg">
>     > +  mach_port_deallocate(mach_task_self(), Self);<br class="gmail_msg">
>     > +  return Self;<br class="gmail_msg">
>     > +#elif defined(__FreeBSD__)<br class="gmail_msg">
>     > +  return uint64_t(pthread_getthreadid_np());<br class="gmail_msg">
>     > +#elif defined(__NetBSD__)<br class="gmail_msg">
>     > +  return uint64_t(_lwp_self());<br class="gmail_msg">
>     > +#elif defined(__ANDROID__)<br class="gmail_msg">
>     > +  return uint64_t(gettid());<br class="gmail_msg">
>     > +#elif defined(__linux__)<br class="gmail_msg">
>     > +  return uint64_t(syscall(SYS_gettid));<br class="gmail_msg">
>     > +#elif defined(LLVM_ON_WIN32)<br class="gmail_msg">
>     > +  return uint64_t(::GetCurrentThreadId());<br class="gmail_msg">
>     > +#else<br class="gmail_msg">
>     > +  return uint64_t(pthread_self());<br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +}<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +void llvm::set_thread_name(const Twine &Name) {<br class="gmail_msg">
>     > +  // Make sure the input is null terminated.<br class="gmail_msg">
>     > +  SmallString<64> Storage;<br class="gmail_msg">
>     > +  StringRef NameStr = Name.toNullTerminatedStringRef(Storage);<br class="gmail_msg">
>     > +#if defined(__linux__)<br class="gmail_msg">
>     > +#if (defined(__GLIBC__) && defined(_GNU_SOURCE)) ||<br class="gmail_msg">
>     defined(__ANDROID__)<br class="gmail_msg">
>     > +  ::pthread_setname_np(::pthread_self(), NameStr.data());<br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +#elif defined(__FreeBSD__)<br class="gmail_msg">
>     > +  ::pthread_set_name_np(::pthread_self(), NameStr.data());<br class="gmail_msg">
>     > +#elif defined(__NetBSD__)<br class="gmail_msg">
>     > +  ::pthread_setname_np(::pthread_self(), "%s",<br class="gmail_msg">
>     > +    const_cast<char *>(NameStr.data()));<br class="gmail_msg">
>     > +#elif defined(__APPLE__)<br class="gmail_msg">
>     > +  ::pthread_setname_np(NameStr.data());<br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +}<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +void llvm::get_thread_name(SmallVectorImpl<char> &Name) {<br class="gmail_msg">
>     > +  Name.clear();<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)<br class="gmail_msg">
>     > +#if defined(__FreeBSD_kernel__)<br class="gmail_msg">
>     > +  int pid = ::pthread_self();<br class="gmail_msg">
>     > +#else<br class="gmail_msg">
>     > +  int pid = ::getpid();<br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  int tid = ::pthread_getthreadid_np();<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  struct kinfo_proc *kp = nullptr, *nkp;<br class="gmail_msg">
>     > +  size_t len = 0;<br class="gmail_msg">
>     > +  int error;<br class="gmail_msg">
>     > +  int ctl[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID |<br class="gmail_msg">
>     KERN_PROC_INC_THREAD,<br class="gmail_msg">
>     > +    (int)pid };<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  while (1) {<br class="gmail_msg">
>     > +    error = sysctl(ctl, 4, kp, &len, nullptr, 0);<br class="gmail_msg">
>     > +    if (kp == nullptr || (error != 0 && errno == ENOMEM)) {<br class="gmail_msg">
>     > +      // Add extra space in case threads are added before next call.<br class="gmail_msg">
>     > +      len += sizeof(*kp) + len / 10;<br class="gmail_msg">
>     > +      nkp = (struct kinfo_proc *)realloc(kp, len);<br class="gmail_msg">
>     > +      if (nkp == nullptr) {<br class="gmail_msg">
>     > +        free(kp);<br class="gmail_msg">
>     > +        return;<br class="gmail_msg">
>     > +      }<br class="gmail_msg">
>     > +      kp = nkp;<br class="gmail_msg">
>     > +      continue;<br class="gmail_msg">
>     > +    }<br class="gmail_msg">
>     > +    if (error != 0)<br class="gmail_msg">
>     > +      len = 0;<br class="gmail_msg">
>     > +    break;<br class="gmail_msg">
>     > +  }<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  for (size_t i = 0; i < len / sizeof(*kp); i++) {<br class="gmail_msg">
>     > +    if (kp[i].ki_tid == (lwpid_t)tid) {<br class="gmail_msg">
>     > +      Name.append(kp[i].ki_tdname, kp[i].ki_tdname +<br class="gmail_msg">
>     strlen(kp[i].ki_tdname));<br class="gmail_msg">
>     > +      break;<br class="gmail_msg">
>     > +    }<br class="gmail_msg">
>     > +  }<br class="gmail_msg">
>     > +  free(kp);<br class="gmail_msg">
>     > +  return;<br class="gmail_msg">
>     > +#elif defined(__NetBSD__)<br class="gmail_msg">
>     > +  char buf[PTHREAD_MAX_NAMELEN_NP];<br class="gmail_msg">
>     > +  ::pthread_getname_np(::pthread_self(), buf,<br class="gmail_msg">
>     PTHREAD_MAX_NAMELEN_NP);<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  Name.append(buf, buf + strlen(buf));<br class="gmail_msg">
>     > +#elif defined(__linux__)<br class="gmail_msg">
>     > +#if (defined(__GLIBC__) && defined(_GNU_SOURCE)) ||<br class="gmail_msg">
>     defined(__ANDROID__)<br class="gmail_msg">
>     > +  constexpr int MAXNAMELEN = 16;<br class="gmail_msg">
>     > +  char Buffer[MAXNAMELEN];<br class="gmail_msg">
>     > +  if (0 == ::pthread_getname_np(::pthread_self(), Buffer,<br class="gmail_msg">
>     MAXNAMELEN))<br class="gmail_msg">
>     > +    Name.append(Buffer, Buffer + strlen(Buffer));<br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +}<br class="gmail_msg">
>     ><br class="gmail_msg">
>     > Added: llvm/trunk/lib/Support/Windows/Threading.inc<br class="gmail_msg">
>     > URL:<br class="gmail_msg">
>     <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Threading.inc?rev=296887&view=auto" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Windows/Threading.inc?rev=296887&view=auto</a><br class="gmail_msg">
>     ><br class="gmail_msg">
>     ==============================================================================<br class="gmail_msg">
>     > --- llvm/trunk/lib/Support/Windows/Threading.inc (added)<br class="gmail_msg">
>     > +++ llvm/trunk/lib/Support/Windows/Threading.inc Fri Mar  3<br class="gmail_msg">
>     11:15:17 2017<br class="gmail_msg">
>     > @@ -0,0 +1,101 @@<br class="gmail_msg">
>     > +//===- Windows/Threading.inc - Win32 Threading Implementation -<br class="gmail_msg">
>     -*- C++ -*-===//<br class="gmail_msg">
>     > +//<br class="gmail_msg">
>     > +//                     The LLVM Compiler Infrastructure<br class="gmail_msg">
>     > +//<br class="gmail_msg">
>     > +// This file is distributed under the University of Illinois Open<br class="gmail_msg">
>     Source<br class="gmail_msg">
>     > +// License. See LICENSE.TXT for details.<br class="gmail_msg">
>     > +//<br class="gmail_msg">
>     ><br class="gmail_msg">
>     +//===----------------------------------------------------------------------===//<br class="gmail_msg">
>     > +//<br class="gmail_msg">
>     > +// This file provides the Win32 specific implementation of<br class="gmail_msg">
>     Threading functions.<br class="gmail_msg">
>     > +//<br class="gmail_msg">
>     ><br class="gmail_msg">
>     +//===----------------------------------------------------------------------===//<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +#include "llvm/ADT/SmallString.h"<br class="gmail_msg">
>     > +#include "llvm/ADT/Twine.h"<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +#include "Windows/WindowsSupport.h"<br class="gmail_msg">
>     > +#include <process.h><br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +// Windows will at times define MemoryFence.<br class="gmail_msg">
>     > +#ifdef MemoryFence<br class="gmail_msg">
>     > +#undef MemoryFence<br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +namespace {<br class="gmail_msg">
>     > +  struct ThreadInfo {<br class="gmail_msg">
>     > +    void(*func)(void*);<br class="gmail_msg">
>     > +    void *param;<br class="gmail_msg">
>     > +  };<br class="gmail_msg">
>     > +}<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +static unsigned __stdcall ThreadCallback(void *param) {<br class="gmail_msg">
>     > +  struct ThreadInfo *info = reinterpret_cast<struct ThreadInfo<br class="gmail_msg">
>     *>(param);<br class="gmail_msg">
>     > +  info->func(info->param);<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  return 0;<br class="gmail_msg">
>     > +}<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +void llvm::llvm_execute_on_thread(void(*Fn)(void*), void *UserData,<br class="gmail_msg">
>     > +  unsigned RequestedStackSize) {<br class="gmail_msg">
>     > +  struct ThreadInfo param = { Fn, UserData };<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  HANDLE hThread = (HANDLE)::_beginthreadex(NULL,<br class="gmail_msg">
>     > +    RequestedStackSize, ThreadCallback,<br class="gmail_msg">
>     > +    &param, 0, NULL);<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  if (hThread) {<br class="gmail_msg">
>     > +    // We actually don't care whether the wait succeeds or fails, in<br class="gmail_msg">
>     > +    // the same way we don't care whether the pthread_join call<br class="gmail_msg">
>     succeeds<br class="gmail_msg">
>     > +    // or fails.  There's not much we could do if this were to<br class="gmail_msg">
>     fail. But<br class="gmail_msg">
>     > +    // on success, this call will wait until the thread finishes<br class="gmail_msg">
>     executing<br class="gmail_msg">
>     > +    // before returning.<br class="gmail_msg">
>     > +    (void)::WaitForSingleObject(hThread, INFINITE);<br class="gmail_msg">
>     > +    ::CloseHandle(hThread);<br class="gmail_msg">
>     > +  }<br class="gmail_msg">
>     > +}<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +uint64_t llvm::get_threadid() {<br class="gmail_msg">
>     > +  return uint64_t(::GetCurrentThreadId());<br class="gmail_msg">
>     > +}<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +void llvm::set_thread_name(const Twine &Name) {<br class="gmail_msg">
>     > +#if defined(_MSC_VER)<br class="gmail_msg">
>     > +  // Make sure the input is null terminated.<br class="gmail_msg">
>     > +  SmallString<64> Storage;<br class="gmail_msg">
>     > +  StringRef NameStr = Name.toNullTerminatedStringRef(Storage);<br class="gmail_msg">
>     > +  constexpr DWORD MS_VC_EXCEPTION = 0x406D1388;<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +#pragma pack(push, 8)<br class="gmail_msg">
>     > +  struct THREADNAME_INFO {<br class="gmail_msg">
>     > +    DWORD dwType;     // Must be 0x1000.<br class="gmail_msg">
>     > +    LPCSTR szName;    // Pointer to thread name<br class="gmail_msg">
>     > +    DWORD dwThreadId; // Thread ID (-1 == current thread)<br class="gmail_msg">
>     > +    DWORD dwFlags;    // Reserved.  Do not use.<br class="gmail_msg">
>     > +  };<br class="gmail_msg">
>     > +#pragma pack(pop)<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  THREADNAME_INFO info;<br class="gmail_msg">
>     > +  info.dwType = 0x1000;<br class="gmail_msg">
>     > +  info.szName = NameStr.data();<br class="gmail_msg">
>     > +  info.dwThreadId = ::GetCurrentThreadId();<br class="gmail_msg">
>     > +  info.dwFlags = 0;<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +  __try {<br class="gmail_msg">
>     > +    ::RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) /<br class="gmail_msg">
>     sizeof(ULONG_PTR),<br class="gmail_msg">
>     > +      (ULONG_PTR *)&info);<br class="gmail_msg">
>     > +  }<br class="gmail_msg">
>     > +  __except (EXCEPTION_EXECUTE_HANDLER) {<br class="gmail_msg">
>     > +  }<br class="gmail_msg">
>     > +#endif<br class="gmail_msg">
>     > +}<br class="gmail_msg">
>     > +<br class="gmail_msg">
>     > +void llvm::get_thread_name(SmallVectorImpl<char> &Name) {<br class="gmail_msg">
>     > +  // "Name" is not an inherent property of a thread on Windows.<br class="gmail_msg">
>     In fact, when<br class="gmail_msg">
>     > +  // you "set" the name, you are only firing a one-time message<br class="gmail_msg">
>     to a debugger<br class="gmail_msg">
>     > +  // which it interprets as a program setting its threads' name.<br class="gmail_msg">
>     We may be<br class="gmail_msg">
>     > +  // able to get fancy by creating a TLS entry when someone calls<br class="gmail_msg">
>     > +  // set_thread_name so that subsequent calls to get_thread_name<br class="gmail_msg">
>     return this<br class="gmail_msg">
>     > +  // value.<br class="gmail_msg">
>     > +  Name.clear();<br class="gmail_msg">
>     > +}<br class="gmail_msg">
>     ><br class="gmail_msg">
>     ><br class="gmail_msg">
>     > _______________________________________________<br class="gmail_msg">
>     > llvm-commits mailing list<br class="gmail_msg">
>     > <a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a> <mailto:<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a>><br class="gmail_msg">
>     > <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
>     ><br class="gmail_msg">
><br class="gmail_msg">
>     --<br class="gmail_msg">
>     Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,<br class="gmail_msg">
>     hosted by The Linux Foundation<br class="gmail_msg">
>     _______________________________________________<br class="gmail_msg">
>     llvm-commits mailing list<br class="gmail_msg">
>     <a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a> <mailto:<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a>><br class="gmail_msg">
>     <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
><br class="gmail_msg">
<br class="gmail_msg">
--<br class="gmail_msg">
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,<br class="gmail_msg">
hosted by The Linux Foundation<br class="gmail_msg">
</blockquote></div>