1*0b57cec5SDimitry Andric //===- ThreadLocal.cpp - Thread Local Data ----------------------*- C++ -*-===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric // 9*0b57cec5SDimitry Andric // This file implements the llvm::sys::ThreadLocal class. 10*0b57cec5SDimitry Andric // 11*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric #include "llvm/Support/ThreadLocal.h" 14*0b57cec5SDimitry Andric #include "llvm/Config/llvm-config.h" 15*0b57cec5SDimitry Andric #include "llvm/Support/Compiler.h" 16*0b57cec5SDimitry Andric 17*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 18*0b57cec5SDimitry Andric //=== WARNING: Implementation here must contain only TRULY operating system 19*0b57cec5SDimitry Andric //=== independent code. 20*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 21*0b57cec5SDimitry Andric 22*0b57cec5SDimitry Andric #if !defined(LLVM_ENABLE_THREADS) || LLVM_ENABLE_THREADS == 0 23*0b57cec5SDimitry Andric // Define all methods as no-ops if threading is explicitly disabled 24*0b57cec5SDimitry Andric namespace llvm { 25*0b57cec5SDimitry Andric using namespace sys; ThreadLocalImpl()26*0b57cec5SDimitry AndricThreadLocalImpl::ThreadLocalImpl() : data() { } ~ThreadLocalImpl()27*0b57cec5SDimitry AndricThreadLocalImpl::~ThreadLocalImpl() { } setInstance(const void * d)28*0b57cec5SDimitry Andricvoid ThreadLocalImpl::setInstance(const void* d) { 29*0b57cec5SDimitry Andric static_assert(sizeof(d) <= sizeof(data), "size too big"); 30*0b57cec5SDimitry Andric void **pd = reinterpret_cast<void**>(&data); 31*0b57cec5SDimitry Andric *pd = const_cast<void*>(d); 32*0b57cec5SDimitry Andric } getInstance()33*0b57cec5SDimitry Andricvoid *ThreadLocalImpl::getInstance() { 34*0b57cec5SDimitry Andric void **pd = reinterpret_cast<void**>(&data); 35*0b57cec5SDimitry Andric return *pd; 36*0b57cec5SDimitry Andric } removeInstance()37*0b57cec5SDimitry Andricvoid ThreadLocalImpl::removeInstance() { 38*0b57cec5SDimitry Andric setInstance(nullptr); 39*0b57cec5SDimitry Andric } 40*0b57cec5SDimitry Andric } 41*0b57cec5SDimitry Andric #elif defined(LLVM_ON_UNIX) 42*0b57cec5SDimitry Andric #include "Unix/ThreadLocal.inc" 43*0b57cec5SDimitry Andric #elif defined( _WIN32) 44*0b57cec5SDimitry Andric #include "Windows/ThreadLocal.inc" 45*0b57cec5SDimitry Andric #else 46*0b57cec5SDimitry Andric #warning Neither LLVM_ON_UNIX nor _WIN32 set in Support/ThreadLocal.cpp 47*0b57cec5SDimitry Andric #endif 48