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