12754fe60SDimitry Andric //===- ThreadLocal.cpp - Thread Local Data ----------------------*- C++ -*-===// 22754fe60SDimitry Andric // 32754fe60SDimitry Andric // The LLVM Compiler Infrastructure 42754fe60SDimitry Andric // 52754fe60SDimitry Andric // This file is distributed under the University of Illinois Open Source 62754fe60SDimitry Andric // License. See LICENSE.TXT for details. 72754fe60SDimitry Andric // 82754fe60SDimitry Andric //===----------------------------------------------------------------------===// 92754fe60SDimitry Andric // 102754fe60SDimitry Andric // This file implements the llvm::sys::ThreadLocal class. 112754fe60SDimitry Andric // 122754fe60SDimitry Andric //===----------------------------------------------------------------------===// 132754fe60SDimitry Andric 14db17bf38SDimitry Andric #include "llvm/Support/ThreadLocal.h" 15*4ba319b5SDimitry Andric #include "llvm/Config/llvm-config.h" 1691bc56edSDimitry Andric #include "llvm/Support/Compiler.h" 172754fe60SDimitry Andric 182754fe60SDimitry Andric //===----------------------------------------------------------------------===// 192754fe60SDimitry Andric //=== WARNING: Implementation here must contain only TRULY operating system 202754fe60SDimitry Andric //=== independent code. 212754fe60SDimitry Andric //===----------------------------------------------------------------------===// 222754fe60SDimitry Andric 23dff0c46cSDimitry Andric #if !defined(LLVM_ENABLE_THREADS) || LLVM_ENABLE_THREADS == 0 242754fe60SDimitry Andric // Define all methods as no-ops if threading is explicitly disabled 252754fe60SDimitry Andric namespace llvm { 262754fe60SDimitry Andric using namespace sys; ThreadLocalImpl()27f785676fSDimitry AndricThreadLocalImpl::ThreadLocalImpl() : data() { } ~ThreadLocalImpl()282754fe60SDimitry AndricThreadLocalImpl::~ThreadLocalImpl() { } setInstance(const void * d)297ae0e2c9SDimitry Andricvoid ThreadLocalImpl::setInstance(const void* d) { 3091bc56edSDimitry Andric static_assert(sizeof(d) <= sizeof(data), "size too big"); 317ae0e2c9SDimitry Andric void **pd = reinterpret_cast<void**>(&data); 327ae0e2c9SDimitry Andric *pd = const_cast<void*>(d); 337ae0e2c9SDimitry Andric } getInstance()3439d628a0SDimitry Andricvoid *ThreadLocalImpl::getInstance() { 357ae0e2c9SDimitry Andric void **pd = reinterpret_cast<void**>(&data); 367ae0e2c9SDimitry Andric return *pd; 377ae0e2c9SDimitry Andric } removeInstance()387ae0e2c9SDimitry Andricvoid ThreadLocalImpl::removeInstance() { 3991bc56edSDimitry Andric setInstance(nullptr); 402754fe60SDimitry Andric } 412754fe60SDimitry Andric } 422754fe60SDimitry Andric #elif defined(LLVM_ON_UNIX) 432754fe60SDimitry Andric #include "Unix/ThreadLocal.inc" 44*4ba319b5SDimitry Andric #elif defined( _WIN32) 452754fe60SDimitry Andric #include "Windows/ThreadLocal.inc" 462754fe60SDimitry Andric #else 47*4ba319b5SDimitry Andric #warning Neither LLVM_ON_UNIX nor _WIN32 set in Support/ThreadLocal.cpp 482754fe60SDimitry Andric #endif 49