1447762daSMichael J. Spencer //===- ThreadLocal.cpp - Thread Local Data ----------------------*- C++ -*-===// 2447762daSMichael J. Spencer // 3447762daSMichael J. Spencer // The LLVM Compiler Infrastructure 4447762daSMichael J. Spencer // 5447762daSMichael J. Spencer // This file is distributed under the University of Illinois Open Source 6447762daSMichael J. Spencer // License. See LICENSE.TXT for details. 7447762daSMichael J. Spencer // 8447762daSMichael J. Spencer //===----------------------------------------------------------------------===// 9447762daSMichael J. Spencer // 10447762daSMichael J. Spencer // This file implements the llvm::sys::ThreadLocal class. 11447762daSMichael J. Spencer // 12447762daSMichael J. Spencer //===----------------------------------------------------------------------===// 13447762daSMichael J. Spencer 146bda14b3SChandler Carruth #include "llvm/Support/ThreadLocal.h" 15447762daSMichael J. Spencer #include "llvm/Config/config.h" 161bcdd6aeSAlp Toker #include "llvm/Support/Compiler.h" 17447762daSMichael J. Spencer 18447762daSMichael J. Spencer //===----------------------------------------------------------------------===// 19447762daSMichael J. Spencer //=== WARNING: Implementation here must contain only TRULY operating system 20447762daSMichael J. Spencer //=== independent code. 21447762daSMichael J. Spencer //===----------------------------------------------------------------------===// 22447762daSMichael J. Spencer 23efddf201SDylan Noblesmith #if !defined(LLVM_ENABLE_THREADS) || LLVM_ENABLE_THREADS == 0 24447762daSMichael J. Spencer // Define all methods as no-ops if threading is explicitly disabled 25447762daSMichael J. Spencer namespace llvm { 26447762daSMichael J. Spencer using namespace sys; 27fabf8bfdSHans Wennborg ThreadLocalImpl::ThreadLocalImpl() : data() { } 28447762daSMichael J. Spencer ThreadLocalImpl::~ThreadLocalImpl() { } 29444fd426SArgyrios Kyrtzidis void ThreadLocalImpl::setInstance(const void* d) { 30cf01800bSChandler Carruth static_assert(sizeof(d) <= sizeof(data), "size too big"); 31444fd426SArgyrios Kyrtzidis void **pd = reinterpret_cast<void**>(&data); 32444fd426SArgyrios Kyrtzidis *pd = const_cast<void*>(d); 33444fd426SArgyrios Kyrtzidis } 34421c89deSDavid Majnemer void *ThreadLocalImpl::getInstance() { 35444fd426SArgyrios Kyrtzidis void **pd = reinterpret_cast<void**>(&data); 3646785f94SArgyrios Kyrtzidis return *pd; 3746785f94SArgyrios Kyrtzidis } 3846785f94SArgyrios Kyrtzidis void ThreadLocalImpl::removeInstance() { 39c10719f5SCraig Topper setInstance(nullptr); 40447762daSMichael J. Spencer } 41447762daSMichael J. Spencer } 42447762daSMichael J. Spencer #elif defined(LLVM_ON_UNIX) 43447762daSMichael J. Spencer #include "Unix/ThreadLocal.inc" 44*712e8d29SNico Weber #elif defined( _WIN32) 45447762daSMichael J. Spencer #include "Windows/ThreadLocal.inc" 46447762daSMichael J. Spencer #else 47*712e8d29SNico Weber #warning Neither LLVM_ON_UNIX nor _WIN32 set in Support/ThreadLocal.cpp 48447762daSMichael J. Spencer #endif 49