diff --git a/llvm/include/llvm/Support/Threading.h b/llvm/include/llvm/Support/Threading.h index 9b6a3b4efdfb..03963a24c107 100644 --- a/llvm/include/llvm/Support/Threading.h +++ b/llvm/include/llvm/Support/Threading.h @@ -139,7 +139,7 @@ void llvm_execute_on_thread(void (*UserFn)(void *), void *UserData, /// \brief Get the maximum length of a thread name on this platform. /// A value of 0 means there is no limit. - constexpr uint32_t get_max_thread_name_length(); + uint32_t get_max_thread_name_length(); /// \brief Set the name of the current thread. Setting a thread's name can /// be helpful for enabling useful diagnostics under a debugger or when diff --git a/llvm/lib/Support/Threading.cpp b/llvm/lib/Support/Threading.cpp index e49d32810692..6a10b988d464 100644 --- a/llvm/lib/Support/Threading.cpp +++ b/llvm/lib/Support/Threading.cpp @@ -49,6 +49,8 @@ unsigned llvm::heavyweight_hardware_concurrency() { return 1; } uint64_t llvm::get_threadid() { return 0; } +uint32_t llvm::get_max_thread_name_length() { return 0; } + void llvm::set_thread_name(const Twine &Name) {} void llvm::get_thread_name(SmallVectorImpl &Name) { Name.clear(); } diff --git a/llvm/lib/Support/Unix/Threading.inc b/llvm/lib/Support/Unix/Threading.inc index 2c528bde49ac..407b194e1b6a 100644 --- a/llvm/lib/Support/Unix/Threading.inc +++ b/llvm/lib/Support/Unix/Threading.inc @@ -106,7 +106,7 @@ uint64_t llvm::get_threadid() { } -constexpr uint32_t llvm::get_max_thread_name_length() { +static constexpr uint32_t get_max_thread_name_length_impl() { #if defined(__NetBSD__) return PTHREAD_MAX_NAMELEN_NP; #elif defined(__APPLE__) @@ -124,6 +124,10 @@ constexpr uint32_t llvm::get_max_thread_name_length() { #endif } +uint32_t llvm::get_max_thread_name_length() { + return get_max_thread_name_length_impl(); +} + void llvm::set_thread_name(const Twine &Name) { // Make sure the input is null terminated. SmallString<64> Storage; @@ -134,7 +138,8 @@ void llvm::set_thread_name(const Twine &Name) { // terminated, but additionally the end of a long thread name will usually // be more unique than the beginning, since a common pattern is for similar // threads to share a common prefix. - NameStr = NameStr.take_back(get_max_thread_name_length()); + if (get_max_thread_name_length() > 0) + NameStr = NameStr.take_back(get_max_thread_name_length()); (void)NameStr; #if defined(__linux__) #if (defined(__GLIBC__) && defined(_GNU_SOURCE)) || defined(__ANDROID__) @@ -192,15 +197,17 @@ void llvm::get_thread_name(SmallVectorImpl &Name) { free(kp); return; #elif defined(__NetBSD__) - char buf[get_max_thread_name_length()]; - ::pthread_getname_np(::pthread_self(), buf, PTHREAD_MAX_NAMELEN_NP); + constexpr uint32_t len = get_max_thread_name_length_impl(); + char buf[len]; + ::pthread_getname_np(::pthread_self(), buf, len); Name.append(buf, buf + strlen(buf)); #elif defined(__linux__) #if (defined(__GLIBC__) && defined(_GNU_SOURCE)) || defined(__ANDROID__) #if HAVE_PTHREAD_GETNAME_NP - char Buffer[get_max_thread_name_length()]; - if (0 == ::pthread_getname_np(::pthread_self(), Buffer, MAXNAMELEN)) + constexpr uint32_t len = get_max_thread_name_length_impl(); + char Buffer[len]; + if (0 == ::pthread_getname_np(::pthread_self(), Buffer, len)) Name.append(Buffer, Buffer + strlen(Buffer)); #endif #endif diff --git a/llvm/lib/Support/Windows/Threading.inc b/llvm/lib/Support/Windows/Threading.inc index 8f36f79ca436..93b2dfe09457 100644 --- a/llvm/lib/Support/Windows/Threading.inc +++ b/llvm/lib/Support/Windows/Threading.inc @@ -59,7 +59,7 @@ uint64_t llvm::get_threadid() { return uint64_t(::GetCurrentThreadId()); } -constexpr uint32_t llvm::get_max_thread_name_length() { return 0; } +uint32_t llvm::get_max_thread_name_length() { return 0; } void llvm::set_thread_name(const Twine &Name) { #if defined(_MSC_VER)