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 Andric ThreadLocalImpl::ThreadLocalImpl() : data() { }
~ThreadLocalImpl()282754fe60SDimitry Andric ThreadLocalImpl::~ThreadLocalImpl() { }
setInstance(const void * d)297ae0e2c9SDimitry Andric void 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 Andric void *ThreadLocalImpl::getInstance() {
357ae0e2c9SDimitry Andric   void **pd = reinterpret_cast<void**>(&data);
367ae0e2c9SDimitry Andric   return *pd;
377ae0e2c9SDimitry Andric }
removeInstance()387ae0e2c9SDimitry Andric void 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