Skip to content

Commit 9a46505

Browse files
committed
[CUDA] Unbreak CUDA compilation with -std=c++20
Standard libc++ headers in stdc++ mode include <new> which picks up cuda_wrappers/new before any of the CUDA macros have been defined. We can not include CUDA headers that early, so the work-around is to define __device__ in the wrapper header itself. Differential Revision: https://reviews.llvm.org/D91807
1 parent 332710e commit 9a46505

File tree

1 file changed

+24
-14
lines changed
  • clang/lib/Headers/cuda_wrappers

1 file changed

+24
-14
lines changed

clang/lib/Headers/cuda_wrappers/new

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,66 +33,76 @@
3333
#define CUDA_NOEXCEPT
3434
#endif
3535

36+
#pragma push_macro("__DEVICE__")
37+
#if defined __device__
38+
#define __DEVICE__ __device__
39+
#else
40+
// <new> has been included too early from the standard libc++ headers and the
41+
// standard CUDA macros are not available yet. We have to define our own.
42+
#define __DEVICE__ __attribute__((device))
43+
#endif
44+
3645
// Device overrides for non-placement new and delete.
37-
__device__ inline void *operator new(__SIZE_TYPE__ size) {
46+
__DEVICE__ inline void *operator new(__SIZE_TYPE__ size) {
3847
if (size == 0) {
3948
size = 1;
4049
}
4150
return ::malloc(size);
4251
}
43-
__device__ inline void *operator new(__SIZE_TYPE__ size,
52+
__DEVICE__ inline void *operator new(__SIZE_TYPE__ size,
4453
const std::nothrow_t &) CUDA_NOEXCEPT {
4554
return ::operator new(size);
4655
}
4756

48-
__device__ inline void *operator new[](__SIZE_TYPE__ size) {
57+
__DEVICE__ inline void *operator new[](__SIZE_TYPE__ size) {
4958
return ::operator new(size);
5059
}
51-
__device__ inline void *operator new[](__SIZE_TYPE__ size,
60+
__DEVICE__ inline void *operator new[](__SIZE_TYPE__ size,
5261
const std::nothrow_t &) {
5362
return ::operator new(size);
5463
}
5564

56-
__device__ inline void operator delete(void* ptr) CUDA_NOEXCEPT {
65+
__DEVICE__ inline void operator delete(void* ptr) CUDA_NOEXCEPT {
5766
if (ptr) {
5867
::free(ptr);
5968
}
6069
}
61-
__device__ inline void operator delete(void *ptr,
70+
__DEVICE__ inline void operator delete(void *ptr,
6271
const std::nothrow_t &) CUDA_NOEXCEPT {
6372
::operator delete(ptr);
6473
}
6574

66-
__device__ inline void operator delete[](void* ptr) CUDA_NOEXCEPT {
75+
__DEVICE__ inline void operator delete[](void* ptr) CUDA_NOEXCEPT {
6776
::operator delete(ptr);
6877
}
69-
__device__ inline void operator delete[](void *ptr,
78+
__DEVICE__ inline void operator delete[](void *ptr,
7079
const std::nothrow_t &) CUDA_NOEXCEPT {
7180
::operator delete(ptr);
7281
}
7382

7483
// Sized delete, C++14 only.
7584
#if __cplusplus >= 201402L
76-
__device__ inline void operator delete(void *ptr,
85+
__DEVICE__ inline void operator delete(void *ptr,
7786
__SIZE_TYPE__ size) CUDA_NOEXCEPT {
7887
::operator delete(ptr);
7988
}
80-
__device__ inline void operator delete[](void *ptr,
89+
__DEVICE__ inline void operator delete[](void *ptr,
8190
__SIZE_TYPE__ size) CUDA_NOEXCEPT {
8291
::operator delete(ptr);
8392
}
8493
#endif
8594

8695
// Device overrides for placement new and delete.
87-
__device__ inline void *operator new(__SIZE_TYPE__, void *__ptr) CUDA_NOEXCEPT {
96+
__DEVICE__ inline void *operator new(__SIZE_TYPE__, void *__ptr) CUDA_NOEXCEPT {
8897
return __ptr;
8998
}
90-
__device__ inline void *operator new[](__SIZE_TYPE__, void *__ptr) CUDA_NOEXCEPT {
99+
__DEVICE__ inline void *operator new[](__SIZE_TYPE__, void *__ptr) CUDA_NOEXCEPT {
91100
return __ptr;
92101
}
93-
__device__ inline void operator delete(void *, void *) CUDA_NOEXCEPT {}
94-
__device__ inline void operator delete[](void *, void *) CUDA_NOEXCEPT {}
102+
__DEVICE__ inline void operator delete(void *, void *) CUDA_NOEXCEPT {}
103+
__DEVICE__ inline void operator delete[](void *, void *) CUDA_NOEXCEPT {}
95104

105+
#pragma pop_macro("__DEVICE__")
96106
#pragma pop_macro("CUDA_NOEXCEPT")
97107

98108
#endif // include guard

0 commit comments

Comments
 (0)