diff --git a/libc/config/gpu/api.td b/libc/config/gpu/api.td --- a/libc/config/gpu/api.td +++ b/libc/config/gpu/api.td @@ -5,3 +5,10 @@ def StringAPI : PublicAPI<"string.h"> { let Types = ["size_t"]; } + +def StdlibAPI : PublicAPI<"stdlib.h"> { + let Types = [ + "size_t", + "__atexithandler_t", + ]; +} diff --git a/libc/config/gpu/entrypoints.txt b/libc/config/gpu/entrypoints.txt --- a/libc/config/gpu/entrypoints.txt +++ b/libc/config/gpu/entrypoints.txt @@ -56,9 +56,11 @@ # stdlib.h entrypoints libc.src.stdlib.atoi + libc.src.stdlib.atexit # Only implemented in the test suite libc.src.stdlib.malloc + libc.src.stdlib.aligned_alloc libc.src.stdlib.realloc libc.src.stdlib.free diff --git a/libc/src/__support/threads/gpu/CMakeLists.txt b/libc/src/__support/threads/gpu/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/libc/src/__support/threads/gpu/CMakeLists.txt @@ -0,0 +1,5 @@ +add_header_library( + mutex + HDRS + mutex.h +) diff --git a/libc/src/__support/threads/gpu/mutex.h b/libc/src/__support/threads/gpu/mutex.h new file mode 100644 --- /dev/null +++ b/libc/src/__support/threads/gpu/mutex.h @@ -0,0 +1,31 @@ +//===--- Implementation of a GPU mutex class --------------------*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_SUPPORT_THREAD_GPU_MUTEX_H +#define LLVM_LIBC_SRC_SUPPORT_THREAD_GPU_MUTEX_H + +#include "src/__support/macros/attributes.h" +#include "src/__support/threads/mutex_common.h" + +namespace __llvm_libc { + +/// Implementation of a simple passthrough mutex which guards nothing. A +/// complete Mutex locks in general cannot be implemented on the GPU. We simply +/// define the Mutex interface and require that only a single thread executes +/// code requiring a mutex lock. +struct Mutex { + LIBC_INLINE constexpr Mutex(bool, bool, bool) {} + + LIBC_INLINE MutexError lock() { return MutexError::NONE; } + LIBC_INLINE MutexError unlock() { return MutexError::NONE; } + LIBC_INLINE MutexError reset() { return MutexError::NONE; } +}; + +} // namespace __llvm_libc + +#endif diff --git a/libc/src/__support/threads/mutex.h b/libc/src/__support/threads/mutex.h --- a/libc/src/__support/threads/mutex.h +++ b/libc/src/__support/threads/mutex.h @@ -9,6 +9,8 @@ #ifndef LLVM_LIBC_SRC_SUPPORT_THREAD_MUTEX_H #define LLVM_LIBC_SRC_SUPPORT_THREAD_MUTEX_H +#include "src/__support/macros/properties/architectures.h" + // Platform independent code will include this header file which pulls // the platfrom specific specializations using platform macros. // @@ -35,8 +37,10 @@ // few global locks. So, to avoid static initialization order fiasco, we // want the constructors of the Mutex classes to be constexprs. -#ifdef __unix__ +#if defined(__unix__) #include "linux/mutex.h" +#elif defined(LIBC_TARGET_ARCH_IS_GPU) +#include "gpu/mutex.h" #endif // __unix__ namespace __llvm_libc {