1447762daSMichael J. Spencer //===- ThreadLocal.cpp - Thread Local Data ----------------------*- C++ -*-===// 2447762daSMichael J. Spencer // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6447762daSMichael J. Spencer // 7447762daSMichael J. Spencer //===----------------------------------------------------------------------===// 8447762daSMichael J. Spencer // 9447762daSMichael J. Spencer // This file implements the llvm::sys::ThreadLocal class. 10447762daSMichael J. Spencer // 11447762daSMichael J. Spencer //===----------------------------------------------------------------------===// 12447762daSMichael J. Spencer 136bda14b3SChandler Carruth #include "llvm/Support/ThreadLocal.h" 14432a3883SNico Weber #include "llvm/Config/llvm-config.h" 151bcdd6aeSAlp Toker #include "llvm/Support/Compiler.h" 16447762daSMichael J. Spencer 17447762daSMichael J. Spencer //===----------------------------------------------------------------------===// 18447762daSMichael J. Spencer //=== WARNING: Implementation here must contain only TRULY operating system 19447762daSMichael J. Spencer //=== independent code. 20447762daSMichael J. Spencer //===----------------------------------------------------------------------===// 21447762daSMichael J. Spencer 22efddf201SDylan Noblesmith #if !defined(LLVM_ENABLE_THREADS) || LLVM_ENABLE_THREADS == 0 23447762daSMichael J. Spencer // Define all methods as no-ops if threading is explicitly disabled 24447762daSMichael J. Spencer namespace llvm { 25447762daSMichael J. Spencer using namespace sys; ThreadLocalImpl()26fabf8bfdSHans WennborgThreadLocalImpl::ThreadLocalImpl() : data() { } ~ThreadLocalImpl()27447762daSMichael J. SpencerThreadLocalImpl::~ThreadLocalImpl() { } setInstance(const void * d)28444fd426SArgyrios Kyrtzidisvoid ThreadLocalImpl::setInstance(const void* d) { 29cf01800bSChandler Carruth static_assert(sizeof(d) <= sizeof(data), "size too big"); 30444fd426SArgyrios Kyrtzidis void **pd = reinterpret_cast<void**>(&data); 31444fd426SArgyrios Kyrtzidis *pd = const_cast<void*>(d); 32444fd426SArgyrios Kyrtzidis } getInstance()33421c89deSDavid Majnemervoid *ThreadLocalImpl::getInstance() { 34444fd426SArgyrios Kyrtzidis void **pd = reinterpret_cast<void**>(&data); 3546785f94SArgyrios Kyrtzidis return *pd; 3646785f94SArgyrios Kyrtzidis } removeInstance()3746785f94SArgyrios Kyrtzidisvoid ThreadLocalImpl::removeInstance() { 38c10719f5SCraig Topper setInstance(nullptr); 39447762daSMichael J. Spencer } 40447762daSMichael J. Spencer } 41447762daSMichael J. Spencer #elif defined(LLVM_ON_UNIX) 42447762daSMichael J. Spencer #include "Unix/ThreadLocal.inc" 43712e8d29SNico Weber #elif defined( _WIN32) 44447762daSMichael J. Spencer #include "Windows/ThreadLocal.inc" 45447762daSMichael J. Spencer #else 46712e8d29SNico Weber #warning Neither LLVM_ON_UNIX nor _WIN32 set in Support/ThreadLocal.cpp 47447762daSMichael J. Spencer #endif 48