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 Andric ThreadLocalImpl::ThreadLocalImpl() : data() { }
~ThreadLocalImpl()27*0b57cec5SDimitry Andric ThreadLocalImpl::~ThreadLocalImpl() { }
setInstance(const void * d)28*0b57cec5SDimitry Andric void 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 Andric void *ThreadLocalImpl::getInstance() {
34*0b57cec5SDimitry Andric   void **pd = reinterpret_cast<void**>(&data);
35*0b57cec5SDimitry Andric   return *pd;
36*0b57cec5SDimitry Andric }
removeInstance()37*0b57cec5SDimitry Andric void 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