1*a9ac8606Spatrick/*===---- new - CUDA wrapper for <new> -------------------------------------=== 2e5dd7070Spatrick * 3e5dd7070Spatrick * Permission is hereby granted, free of charge, to any person obtaining a copy 4e5dd7070Spatrick * of this software and associated documentation files (the "Software"), to deal 5e5dd7070Spatrick * in the Software without restriction, including without limitation the rights 6e5dd7070Spatrick * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7e5dd7070Spatrick * copies of the Software, and to permit persons to whom the Software is 8e5dd7070Spatrick * furnished to do so, subject to the following conditions: 9e5dd7070Spatrick * 10e5dd7070Spatrick * The above copyright notice and this permission notice shall be included in 11e5dd7070Spatrick * all copies or substantial portions of the Software. 12e5dd7070Spatrick * 13e5dd7070Spatrick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14e5dd7070Spatrick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15e5dd7070Spatrick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16e5dd7070Spatrick * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17e5dd7070Spatrick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18e5dd7070Spatrick * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19e5dd7070Spatrick * THE SOFTWARE. 20e5dd7070Spatrick * 21e5dd7070Spatrick *===-----------------------------------------------------------------------=== 22e5dd7070Spatrick */ 23e5dd7070Spatrick 24e5dd7070Spatrick#ifndef __CLANG_CUDA_WRAPPERS_NEW 25e5dd7070Spatrick#define __CLANG_CUDA_WRAPPERS_NEW 26e5dd7070Spatrick 27e5dd7070Spatrick#include_next <new> 28e5dd7070Spatrick 29ec727ea7Spatrick#if !defined(__device__) 30ec727ea7Spatrick// The header has been included too early from the standard C++ library 31ec727ea7Spatrick// and CUDA-specific macros are not available yet. 32ec727ea7Spatrick// Undo the include guard and try again later. 33ec727ea7Spatrick#undef __CLANG_CUDA_WRAPPERS_NEW 34ec727ea7Spatrick#else 35ec727ea7Spatrick 36e5dd7070Spatrick#pragma push_macro("CUDA_NOEXCEPT") 37e5dd7070Spatrick#if __cplusplus >= 201103L 38e5dd7070Spatrick#define CUDA_NOEXCEPT noexcept 39e5dd7070Spatrick#else 40e5dd7070Spatrick#define CUDA_NOEXCEPT 41e5dd7070Spatrick#endif 42e5dd7070Spatrick 43e5dd7070Spatrick// Device overrides for non-placement new and delete. 44e5dd7070Spatrick__device__ inline void *operator new(__SIZE_TYPE__ size) { 45e5dd7070Spatrick if (size == 0) { 46e5dd7070Spatrick size = 1; 47e5dd7070Spatrick } 48e5dd7070Spatrick return ::malloc(size); 49e5dd7070Spatrick} 50e5dd7070Spatrick__device__ inline void *operator new(__SIZE_TYPE__ size, 51e5dd7070Spatrick const std::nothrow_t &) CUDA_NOEXCEPT { 52e5dd7070Spatrick return ::operator new(size); 53e5dd7070Spatrick} 54e5dd7070Spatrick 55e5dd7070Spatrick__device__ inline void *operator new[](__SIZE_TYPE__ size) { 56e5dd7070Spatrick return ::operator new(size); 57e5dd7070Spatrick} 58e5dd7070Spatrick__device__ inline void *operator new[](__SIZE_TYPE__ size, 59e5dd7070Spatrick const std::nothrow_t &) { 60e5dd7070Spatrick return ::operator new(size); 61e5dd7070Spatrick} 62e5dd7070Spatrick 63e5dd7070Spatrick__device__ inline void operator delete(void* ptr) CUDA_NOEXCEPT { 64e5dd7070Spatrick if (ptr) { 65e5dd7070Spatrick ::free(ptr); 66e5dd7070Spatrick } 67e5dd7070Spatrick} 68e5dd7070Spatrick__device__ inline void operator delete(void *ptr, 69e5dd7070Spatrick const std::nothrow_t &) CUDA_NOEXCEPT { 70e5dd7070Spatrick ::operator delete(ptr); 71e5dd7070Spatrick} 72e5dd7070Spatrick 73e5dd7070Spatrick__device__ inline void operator delete[](void* ptr) CUDA_NOEXCEPT { 74e5dd7070Spatrick ::operator delete(ptr); 75e5dd7070Spatrick} 76e5dd7070Spatrick__device__ inline void operator delete[](void *ptr, 77e5dd7070Spatrick const std::nothrow_t &) CUDA_NOEXCEPT { 78e5dd7070Spatrick ::operator delete(ptr); 79e5dd7070Spatrick} 80e5dd7070Spatrick 81e5dd7070Spatrick// Sized delete, C++14 only. 82e5dd7070Spatrick#if __cplusplus >= 201402L 83e5dd7070Spatrick__device__ inline void operator delete(void *ptr, 84e5dd7070Spatrick __SIZE_TYPE__ size) CUDA_NOEXCEPT { 85e5dd7070Spatrick ::operator delete(ptr); 86e5dd7070Spatrick} 87e5dd7070Spatrick__device__ inline void operator delete[](void *ptr, 88e5dd7070Spatrick __SIZE_TYPE__ size) CUDA_NOEXCEPT { 89e5dd7070Spatrick ::operator delete(ptr); 90e5dd7070Spatrick} 91e5dd7070Spatrick#endif 92e5dd7070Spatrick 93e5dd7070Spatrick// Device overrides for placement new and delete. 94e5dd7070Spatrick__device__ inline void *operator new(__SIZE_TYPE__, void *__ptr) CUDA_NOEXCEPT { 95e5dd7070Spatrick return __ptr; 96e5dd7070Spatrick} 97e5dd7070Spatrick__device__ inline void *operator new[](__SIZE_TYPE__, void *__ptr) CUDA_NOEXCEPT { 98e5dd7070Spatrick return __ptr; 99e5dd7070Spatrick} 100e5dd7070Spatrick__device__ inline void operator delete(void *, void *) CUDA_NOEXCEPT {} 101e5dd7070Spatrick__device__ inline void operator delete[](void *, void *) CUDA_NOEXCEPT {} 102e5dd7070Spatrick 103e5dd7070Spatrick#pragma pop_macro("CUDA_NOEXCEPT") 104e5dd7070Spatrick 105ec727ea7Spatrick#endif // __device__ 106e5dd7070Spatrick#endif // include guard 107