From: Owen Anderson Date: Tue, 10 Jan 2023 03:48:20 +0000 (-0700) Subject: Remove the ThreadLocal template from LLVM. X-Git-Tag: upstream/17.0.6~21603 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=54d78b639b9c18b42abd4fac5c6e76105f06b3ef;p=platform%2Fupstream%2Fllvm.git Remove the ThreadLocal template from LLVM. This has been obsoleted by C++ thread_local for a long time. As far as I know, Xcode was the last supported toolchain to add support for C++ thread_local in 2016. As a precaution, use LLVM_THREAD_LOCAL which provides even greater backwards compatibility, allowing this to function even pre-C++11 versions of GCC. Reviewed By: majnemer Differential Revision: https://reviews.llvm.org/D141347 --- diff --git a/clang-tools-extra/clangd/support/ThreadCrashReporter.cpp b/clang-tools-extra/clangd/support/ThreadCrashReporter.cpp index 05afb3b..9551bbf 100644 --- a/clang-tools-extra/clangd/support/ThreadCrashReporter.cpp +++ b/clang-tools-extra/clangd/support/ThreadCrashReporter.cpp @@ -7,7 +7,6 @@ //===----------------------------------------------------------------------===// #include "support/ThreadCrashReporter.h" -#include "llvm/Support/ThreadLocal.h" #include namespace clang { diff --git a/llvm/include/llvm/Support/ThreadLocal.h b/llvm/include/llvm/Support/ThreadLocal.h deleted file mode 100644 index d6838c1..0000000 --- a/llvm/include/llvm/Support/ThreadLocal.h +++ /dev/null @@ -1,62 +0,0 @@ -//===- llvm/Support/ThreadLocal.h - Thread Local Data ------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file declares the llvm::sys::ThreadLocal class. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SUPPORT_THREADLOCAL_H -#define LLVM_SUPPORT_THREADLOCAL_H - -#include "llvm/Support/DataTypes.h" -#include "llvm/Support/Threading.h" -#include - -namespace llvm { - namespace sys { - // ThreadLocalImpl - Common base class of all ThreadLocal instantiations. - // YOU SHOULD NEVER USE THIS DIRECTLY. - class ThreadLocalImpl { - typedef uint64_t ThreadLocalDataTy; - /// Platform-specific thread local data. - /// - /// This is embedded in the class and we avoid malloc'ing/free'ing it, - /// to make this class more safe for use along with CrashRecoveryContext. - union { - char data[sizeof(ThreadLocalDataTy)]; - ThreadLocalDataTy align_data; - }; - public: - ThreadLocalImpl(); - virtual ~ThreadLocalImpl(); - void setInstance(const void* d); - void *getInstance(); - void removeInstance(); - }; - - /// ThreadLocal - A class used to abstract thread-local storage. It holds, - /// for each thread, a pointer a single object of type T. - template - class ThreadLocal : public ThreadLocalImpl { - public: - ThreadLocal() : ThreadLocalImpl() { } - - /// get - Fetches a pointer to the object associated with the current - /// thread. If no object has yet been associated, it returns NULL; - T* get() { return static_cast(getInstance()); } - - // set - Associates a pointer to an object with the current thread. - void set(T* d) { setInstance(d); } - - // erase - Removes the pointer associated with the current thread. - void erase() { removeInstance(); } - }; - } -} - -#endif diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt index 46469c6..9b5402f 100644 --- a/llvm/lib/Support/CMakeLists.txt +++ b/llvm/lib/Support/CMakeLists.txt @@ -260,7 +260,6 @@ add_llvm_component_library(LLVMSupport Program.cpp RWMutex.cpp Signals.cpp - ThreadLocal.cpp Threading.cpp Valgrind.cpp Watchdog.cpp diff --git a/llvm/lib/Support/CrashRecoveryContext.cpp b/llvm/lib/Support/CrashRecoveryContext.cpp index c7c384c..9e792d1 100644 --- a/llvm/lib/Support/CrashRecoveryContext.cpp +++ b/llvm/lib/Support/CrashRecoveryContext.cpp @@ -11,7 +11,6 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ExitCodes.h" #include "llvm/Support/Signals.h" -#include "llvm/Support/ThreadLocal.h" #include "llvm/Support/thread.h" #include #include @@ -21,11 +20,7 @@ using namespace llvm; namespace { struct CrashRecoveryContextImpl; - -sys::ThreadLocal &getCurrentContext() { - static sys::ThreadLocal CurrentContext; - return CurrentContext; -} +LLVM_THREAD_LOCAL static const CrashRecoveryContextImpl *CurrentContext; struct CrashRecoveryContextImpl { // When threads are disabled, this links up all active @@ -43,12 +38,12 @@ struct CrashRecoveryContextImpl { public: CrashRecoveryContextImpl(CrashRecoveryContext *CRC) noexcept : CRC(CRC), Failed(false), SwitchedThread(false), ValidJumpBuffer(false) { - Next = getCurrentContext().get(); - getCurrentContext().set(this); + Next = CurrentContext; + CurrentContext = this; } ~CrashRecoveryContextImpl() { if (!SwitchedThread) - getCurrentContext().set(Next); + CurrentContext = Next; } /// Called when the separate crash-recovery thread was finished, to @@ -66,7 +61,7 @@ public: void HandleCrash(int RetCode, uintptr_t Context) { // Eliminate the current context entry, to avoid re-entering in case the // cleanup code crashes. - getCurrentContext().set(Next); + CurrentContext = Next; assert(!Failed && "Crash recovery context already failed!"); Failed = true; @@ -92,10 +87,7 @@ std::mutex &getCrashRecoveryContextMutex() { static bool gCrashRecoveryEnabled = false; -sys::ThreadLocal &getIsRecoveringFromCrash() { - static sys::ThreadLocal IsRecoveringFromCrash; - return IsRecoveringFromCrash; -} +LLVM_THREAD_LOCAL static const CrashRecoveryContext *IsRecoveringFromCrash; } // namespace @@ -114,8 +106,8 @@ CrashRecoveryContext::CrashRecoveryContext() { CrashRecoveryContext::~CrashRecoveryContext() { // Reclaim registered resources. CrashRecoveryContextCleanup *i = head; - const CrashRecoveryContext *PC = getIsRecoveringFromCrash().get(); - getIsRecoveringFromCrash().set(this); + const CrashRecoveryContext *PC = IsRecoveringFromCrash; + IsRecoveringFromCrash = this; while (i) { CrashRecoveryContextCleanup *tmp = i; i = tmp->next; @@ -123,21 +115,21 @@ CrashRecoveryContext::~CrashRecoveryContext() { tmp->recoverResources(); delete tmp; } - getIsRecoveringFromCrash().set(PC); + IsRecoveringFromCrash = PC; CrashRecoveryContextImpl *CRCI = (CrashRecoveryContextImpl *) Impl; delete CRCI; } bool CrashRecoveryContext::isRecoveringFromCrash() { - return getIsRecoveringFromCrash().get() != nullptr; + return IsRecoveringFromCrash != nullptr; } CrashRecoveryContext *CrashRecoveryContext::GetCurrent() { if (!gCrashRecoveryEnabled) return nullptr; - const CrashRecoveryContextImpl *CRCI = getCurrentContext().get(); + const CrashRecoveryContextImpl *CRCI = CurrentContext; if (!CRCI) return nullptr; @@ -207,7 +199,7 @@ static void uninstallExceptionOrSignalHandlers() {} // occur inside the __except evaluation block static int ExceptionFilter(_EXCEPTION_POINTERS *Except) { // Lookup the current thread local recovery object. - const CrashRecoveryContextImpl *CRCI = getCurrentContext().get(); + const CrashRecoveryContextImpl *CRCI = CurrentContext; if (!CRCI) { // Something has gone horribly wrong, so let's just tell everyone @@ -284,7 +276,7 @@ static LONG CALLBACK ExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo) } // Lookup the current thread local recovery object. - const CrashRecoveryContextImpl *CRCI = getCurrentContext().get(); + const CrashRecoveryContextImpl *CRCI = CurrentContext; if (!CRCI) { // Something has gone horribly wrong, so let's just tell everyone @@ -358,7 +350,7 @@ static struct sigaction PrevActions[NumSignals]; static void CrashRecoverySignalHandler(int Signal) { // Lookup the current thread local recovery object. - const CrashRecoveryContextImpl *CRCI = getCurrentContext().get(); + const CrashRecoveryContextImpl *CRCI = CurrentContext; if (!CRCI) { // We didn't find a crash recovery context -- this means either we got a diff --git a/llvm/lib/Support/ThreadLocal.cpp b/llvm/lib/Support/ThreadLocal.cpp deleted file mode 100644 index 44e6223..0000000 --- a/llvm/lib/Support/ThreadLocal.cpp +++ /dev/null @@ -1,47 +0,0 @@ -//===- ThreadLocal.cpp - Thread Local Data ----------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file implements the llvm::sys::ThreadLocal class. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Support/ThreadLocal.h" -#include "llvm/Config/llvm-config.h" -#include "llvm/Support/Compiler.h" - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. -//===----------------------------------------------------------------------===// - -#if !defined(LLVM_ENABLE_THREADS) || LLVM_ENABLE_THREADS == 0 -// Define all methods as no-ops if threading is explicitly disabled -namespace llvm { -using namespace sys; -ThreadLocalImpl::ThreadLocalImpl() : data() { } -ThreadLocalImpl::~ThreadLocalImpl() { } -void ThreadLocalImpl::setInstance(const void* d) { - static_assert(sizeof(d) <= sizeof(data), "size too big"); - void **pd = reinterpret_cast(&data); - *pd = const_cast(d); -} -void *ThreadLocalImpl::getInstance() { - void **pd = reinterpret_cast(&data); - return *pd; -} -void ThreadLocalImpl::removeInstance() { - setInstance(nullptr); -} -} -#elif defined(LLVM_ON_UNIX) -#include "Unix/ThreadLocal.inc" -#elif defined( _WIN32) -#include "Windows/ThreadLocal.inc" -#else -#warning Neither LLVM_ON_UNIX nor _WIN32 set in Support/ThreadLocal.cpp -#endif diff --git a/llvm/lib/Support/Unix/ThreadLocal.inc b/llvm/lib/Support/Unix/ThreadLocal.inc deleted file mode 100644 index 483c5b0..0000000 --- a/llvm/lib/Support/Unix/ThreadLocal.inc +++ /dev/null @@ -1,57 +0,0 @@ -//=== llvm/Support/Unix/ThreadLocal.inc - Unix Thread Local Data -*- C++ -//-*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file implements the Unix specific (non-pthread) ThreadLocal class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic UNIX code that -//=== is guaranteed to work on *all* UNIX variants. -//===----------------------------------------------------------------------===// - -#include "llvm/Config/config.h" - -#include -#include -#include - -namespace llvm { -using namespace sys; - -ThreadLocalImpl::ThreadLocalImpl() : data() { - static_assert(sizeof(pthread_key_t) <= sizeof(data), "size too big"); - pthread_key_t *key = reinterpret_cast(&data); - int errorcode = pthread_key_create(key, nullptr); - assert(errorcode == 0); - (void)errorcode; -} - -ThreadLocalImpl::~ThreadLocalImpl() { - pthread_key_t *key = reinterpret_cast(&data); - int errorcode = pthread_key_delete(*key); - assert(errorcode == 0); - (void)errorcode; -} - -void ThreadLocalImpl::setInstance(const void *d) { - pthread_key_t *key = reinterpret_cast(&data); - int errorcode = pthread_setspecific(*key, d); - assert(errorcode == 0); - (void)errorcode; -} - -void *ThreadLocalImpl::getInstance() { - pthread_key_t *key = reinterpret_cast(&data); - return pthread_getspecific(*key); -} - -void ThreadLocalImpl::removeInstance() { setInstance(nullptr); } - -} // namespace llvm diff --git a/llvm/lib/Support/Windows/ThreadLocal.inc b/llvm/lib/Support/Windows/ThreadLocal.inc deleted file mode 100644 index 900444d..0000000 --- a/llvm/lib/Support/Windows/ThreadLocal.inc +++ /dev/null @@ -1,50 +0,0 @@ -//= llvm/Support/Win32/ThreadLocal.inc - Win32 Thread Local Data -*- C++ -//-*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file implements the Win32 specific (non-pthread) ThreadLocal class. -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -//=== WARNING: Implementation here must contain only generic Win32 code that -//=== is guaranteed to work on *all* Win32 variants. -//===----------------------------------------------------------------------===// - -#include "llvm/Support/ThreadLocal.h" -#include "llvm/Support/Windows/WindowsSupport.h" - -namespace llvm { - -sys::ThreadLocalImpl::ThreadLocalImpl() : data() { - static_assert(sizeof(DWORD) <= sizeof(data), "size too big"); - DWORD *tls = reinterpret_cast(&data); - *tls = TlsAlloc(); - assert(*tls != TLS_OUT_OF_INDEXES); -} - -sys::ThreadLocalImpl::~ThreadLocalImpl() { - DWORD *tls = reinterpret_cast(&data); - TlsFree(*tls); -} - -void *sys::ThreadLocalImpl::getInstance() { - DWORD *tls = reinterpret_cast(&data); - return TlsGetValue(*tls); -} - -void sys::ThreadLocalImpl::setInstance(const void *d) { - DWORD *tls = reinterpret_cast(&data); - int errorcode = TlsSetValue(*tls, const_cast(d)); - assert(errorcode != 0); - (void)errorcode; -} - -void sys::ThreadLocalImpl::removeInstance() { setInstance(0); } - -} // namespace llvm diff --git a/llvm/unittests/Support/CMakeLists.txt b/llvm/unittests/Support/CMakeLists.txt index ccffb42..d987d65d 100644 --- a/llvm/unittests/Support/CMakeLists.txt +++ b/llvm/unittests/Support/CMakeLists.txt @@ -80,7 +80,6 @@ add_llvm_unittest(SupportTests SymbolRemappingReaderTest.cpp TarWriterTest.cpp TaskQueueTest.cpp - ThreadLocalTest.cpp ThreadPool.cpp Threading.cpp TimerTest.cpp diff --git a/llvm/unittests/Support/ThreadLocalTest.cpp b/llvm/unittests/Support/ThreadLocalTest.cpp deleted file mode 100644 index 454e4f2..0000000 --- a/llvm/unittests/Support/ThreadLocalTest.cpp +++ /dev/null @@ -1,54 +0,0 @@ -//===- llvm/unittest/Support/ThreadLocalTest.cpp - ThreadLocal tests ------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "llvm/Support/ThreadLocal.h" -#include "gtest/gtest.h" -#include - -using namespace llvm; -using namespace sys; - -namespace { - -class ThreadLocalTest : public ::testing::Test { -}; - -struct S { - int i; -}; - -TEST_F(ThreadLocalTest, Basics) { - ThreadLocal x; - - static_assert(std::is_const_v>, - "ThreadLocal::get didn't return a pointer to const object"); - - EXPECT_EQ(nullptr, x.get()); - - S s; - x.set(&s); - EXPECT_EQ(&s, x.get()); - - x.erase(); - EXPECT_EQ(nullptr, x.get()); - - ThreadLocal y; - - static_assert(!std::is_const_v>, - "ThreadLocal::get returned a pointer to const object"); - - EXPECT_EQ(nullptr, y.get()); - - y.set(&s); - EXPECT_EQ(&s, y.get()); - - y.erase(); - EXPECT_EQ(nullptr, y.get()); -} - -} diff --git a/mlir/include/mlir/Support/ThreadLocalCache.h b/mlir/include/mlir/Support/ThreadLocalCache.h index 083956b..e98fae6 100644 --- a/mlir/include/mlir/Support/ThreadLocalCache.h +++ b/mlir/include/mlir/Support/ThreadLocalCache.h @@ -18,7 +18,6 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/Mutex.h" -#include "llvm/Support/ThreadLocal.h" namespace mlir { /// This class provides support for defining a thread local object with non