1 /*===- __clang_openmp_device_functions.h - OpenMP device function declares -=== 2 * 3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 * See https://llvm.org/LICENSE.txt for license information. 5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 * 7 *===-----------------------------------------------------------------------=== 8 */ 9 10 #ifndef __CLANG_OPENMP_DEVICE_FUNCTIONS_H__ 11 #define __CLANG_OPENMP_DEVICE_FUNCTIONS_H__ 12 13 #ifdef __cplusplus 14 extern "C" { 15 #endif 16 17 #ifdef __NVPTX__ 18 #pragma omp begin declare variant match( \ 19 device = {arch(nvptx, nvptx64)}, implementation = {extension(match_any)}) 20 21 #pragma push_macro("__CUDA__") 22 #define __CUDA__ 23 #define __OPENMP_NVPTX__ 24 25 /// Include declarations for libdevice functions. 26 #include <__clang_cuda_libdevice_declares.h> 27 28 /// Provide definitions for these functions. 29 #include <__clang_cuda_device_functions.h> 30 31 #undef __OPENMP_NVPTX__ 32 #pragma pop_macro("__CUDA__") 33 34 #pragma omp end declare variant 35 #endif 36 37 #ifdef __AMDGCN__ 38 #pragma omp begin declare variant match(device = {arch(amdgcn)}) 39 40 // Import types which will be used by __clang_hip_libdevice_declares.h 41 #ifndef __cplusplus 42 #include <stdint.h> 43 #endif 44 45 #define __OPENMP_AMDGCN__ 46 #pragma push_macro("__device__") 47 #define __device__ 48 49 /// Include declarations for libdevice functions. 50 #include <__clang_hip_libdevice_declares.h> 51 52 #pragma pop_macro("__device__") 53 #undef __OPENMP_AMDGCN__ 54 55 #pragma omp end declare variant 56 #endif 57 58 #ifdef __cplusplus 59 } // extern "C" 60 #endif 61 62 // Ensure we make `_ZdlPv`, aka. `operator delete(void*)` available without the 63 // need to `include <new>` in C++ mode. 64 #ifdef __cplusplus 65 66 // We require malloc/free. 67 #include <cstdlib> 68 69 #pragma push_macro("OPENMP_NOEXCEPT") 70 #if __cplusplus >= 201103L 71 #define OPENMP_NOEXCEPT noexcept 72 #else 73 #define OPENMP_NOEXCEPT 74 #endif 75 76 // Device overrides for non-placement new and delete. 77 inline void *operator new(__SIZE_TYPE__ size) { 78 if (size == 0) 79 size = 1; 80 return ::malloc(size); 81 } 82 83 inline void *operator new[](__SIZE_TYPE__ size) { return ::operator new(size); } 84 85 inline void operator delete(void *ptr)OPENMP_NOEXCEPT { ::free(ptr); } 86 87 inline void operator delete[](void *ptr) OPENMP_NOEXCEPT { 88 ::operator delete(ptr); 89 } 90 91 // Sized delete, C++14 only. 92 #if __cplusplus >= 201402L 93 inline void operator delete(void *ptr, __SIZE_TYPE__ size)OPENMP_NOEXCEPT { 94 ::operator delete(ptr); 95 } 96 inline void operator delete[](void *ptr, __SIZE_TYPE__ size) OPENMP_NOEXCEPT { 97 ::operator delete(ptr); 98 } 99 #endif 100 101 #pragma pop_macro("OPENMP_NOEXCEPT") 102 #endif 103 104 #endif 105