diff --git a/libc/src/__support/OSUtil/gpu/CMakeLists.txt b/libc/src/__support/OSUtil/gpu/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/libc/src/__support/OSUtil/gpu/CMakeLists.txt @@ -0,0 +1,9 @@ +add_object_library( + gpu_util + SRCS + quick_exit.cpp + HDRS + quick_exit.h + DEPENDS + libc.src.__support.common +) diff --git a/libc/src/__support/OSUtil/gpu/quick_exit.h b/libc/src/__support/OSUtil/gpu/quick_exit.h new file mode 100644 --- /dev/null +++ b/libc/src/__support/OSUtil/gpu/quick_exit.h @@ -0,0 +1,18 @@ +//===---------- GPU implementation of a quick exit function -----*- 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_OSUTIL_GPU_QUICK_EXIT_H +#define LLVM_LIBC_SRC_SUPPORT_OSUTIL_GPU_QUICK_EXIT_H + +namespace __llvm_libc { + +void quick_exit(int status); + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_SUPPORT_OSUTIL_GPU_QUICK_EXIT_H diff --git a/libc/src/__support/OSUtil/gpu/quick_exit.cpp b/libc/src/__support/OSUtil/gpu/quick_exit.cpp new file mode 100644 --- /dev/null +++ b/libc/src/__support/OSUtil/gpu/quick_exit.cpp @@ -0,0 +1,31 @@ +//===---------- GPU implementation of a quick exit function -----*- 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_OSUTIL_GPU_QUICK_EXIT_H +#define LLVM_LIBC_SRC_SUPPORT_OSUTIL_GPU_QUICK_EXIT_H + +#include "quick_exit.h" + +#include "src/__support/macros/properties/architectures.h" + +namespace __llvm_libc { + +void quick_exit(int status) { +#if defined(LIBC_TARGET_ARCH_IS_NVPTX) + asm("exit" ::: "memory"); +#elif defined(LIBC_TARGET_ARCH_IS_AMDGPU) + // This will terminate the entire wavefront, may not be valid with divergent + // work items. + asm("s_endpgm" ::: "memory"); +#endif + __builtin_unreachable(); +} + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_SUPPORT_OSUTIL_GPU_QUICK_EXIT_H diff --git a/libc/src/__support/OSUtil/quick_exit.h b/libc/src/__support/OSUtil/quick_exit.h --- a/libc/src/__support/OSUtil/quick_exit.h +++ b/libc/src/__support/OSUtil/quick_exit.h @@ -9,7 +9,11 @@ #ifndef LLVM_LIBC_SRC_SUPPORT_OSUTIL_QUICK_EXIT_H #define LLVM_LIBC_SRC_SUPPORT_OSUTIL_QUICK_EXIT_H -#ifdef __unix__ +#include "src/__support/macros/properties/architectures.h" + +#if defined(LIBC_TARGET_ARCH_IS_GPU) +#include "gpu/quick_exit.h" +#elif defined(__unix__) #include "linux/quick_exit.h" #endif