| //===-- Implementation of libc_errno --------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "src/__support/libc_errno.h" |
| #include "src/__support/macros/attributes.h" |
| #include "src/__support/macros/config.h" |
| |
| namespace LIBC_NAMESPACE_DECL { |
| |
| #if LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_SYSTEM_INLINE |
| |
| #if LIBC_ERRNO_MODE == LIBC_ERRNO_MODE_UNDEFINED |
| |
| void Errno::operator=(int) {} |
| Errno::operator int() { return 0; } |
| |
| #elif LIBC_ERRNO_MODE == LIBC_ERRNO_MODE_THREAD_LOCAL |
| |
| namespace { |
| LIBC_THREAD_LOCAL int thread_errno; |
| } |
| |
| extern "C" int *__llvm_libc_errno() noexcept { return &thread_errno; } |
| |
| void Errno::operator=(int a) { thread_errno = a; } |
| Errno::operator int() { return thread_errno; } |
| |
| #elif LIBC_ERRNO_MODE == LIBC_ERRNO_MODE_SHARED |
| |
| namespace { |
| int shared_errno; |
| } |
| |
| extern "C" int *__llvm_libc_errno() noexcept { return &shared_errno; } |
| |
| void Errno::operator=(int a) { shared_errno = a; } |
| Errno::operator int() { return shared_errno; } |
| |
| #elif LIBC_ERRNO_MODE == LIBC_ERRNO_MODE_EXTERNAL |
| |
| void Errno::operator=(int a) { *__llvm_libc_errno() = a; } |
| Errno::operator int() { return *__llvm_libc_errno(); } |
| |
| #endif |
| |
| // Define the global `libc_errno` instance. |
| Errno libc_errno; |
| |
| #endif // LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_SYSTEM_INLINE |
| |
| } // namespace LIBC_NAMESPACE_DECL |