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 Wennborg ThreadLocalImpl::ThreadLocalImpl() : data() { }
~ThreadLocalImpl()27447762daSMichael J. Spencer ThreadLocalImpl::~ThreadLocalImpl() { }
setInstance(const void * d)28444fd426SArgyrios Kyrtzidis void 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 Majnemer void *ThreadLocalImpl::getInstance() {
34444fd426SArgyrios Kyrtzidis   void **pd = reinterpret_cast<void**>(&data);
3546785f94SArgyrios Kyrtzidis   return *pd;
3646785f94SArgyrios Kyrtzidis }
removeInstance()3746785f94SArgyrios Kyrtzidis void 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