xref: /aosp_15_r20/external/pytorch/c10/macros/Macros.h (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker #ifndef C10_MACROS_MACROS_H_
2*da0073e9SAndroid Build Coastguard Worker #define C10_MACROS_MACROS_H_
3*da0073e9SAndroid Build Coastguard Worker #include <cassert>
4*da0073e9SAndroid Build Coastguard Worker 
5*da0073e9SAndroid Build Coastguard Worker /* Main entry for c10/macros.
6*da0073e9SAndroid Build Coastguard Worker  *
7*da0073e9SAndroid Build Coastguard Worker  * In your code, include c10/macros/Macros.h directly, instead of individual
8*da0073e9SAndroid Build Coastguard Worker  * files in this folder.
9*da0073e9SAndroid Build Coastguard Worker  */
10*da0073e9SAndroid Build Coastguard Worker 
11*da0073e9SAndroid Build Coastguard Worker // For build systems that do not directly depend on CMake and directly build
12*da0073e9SAndroid Build Coastguard Worker // from the source directory (such as Buck), one may not have a cmake_macros.h
13*da0073e9SAndroid Build Coastguard Worker // file at all. In this case, the build system is responsible for providing
14*da0073e9SAndroid Build Coastguard Worker // correct macro definitions corresponding to the cmake_macros.h.in file.
15*da0073e9SAndroid Build Coastguard Worker //
16*da0073e9SAndroid Build Coastguard Worker // In such scenarios, one should define the macro
17*da0073e9SAndroid Build Coastguard Worker //     C10_USING_CUSTOM_GENERATED_MACROS
18*da0073e9SAndroid Build Coastguard Worker // to inform this header that it does not need to include the cmake_macros.h
19*da0073e9SAndroid Build Coastguard Worker // file.
20*da0073e9SAndroid Build Coastguard Worker 
21*da0073e9SAndroid Build Coastguard Worker #ifndef C10_USING_CUSTOM_GENERATED_MACROS
22*da0073e9SAndroid Build Coastguard Worker #include <c10/macros/cmake_macros.h>
23*da0073e9SAndroid Build Coastguard Worker #endif // C10_USING_CUSTOM_GENERATED_MACROS
24*da0073e9SAndroid Build Coastguard Worker 
25*da0073e9SAndroid Build Coastguard Worker #include <c10/macros/Export.h>
26*da0073e9SAndroid Build Coastguard Worker 
27*da0073e9SAndroid Build Coastguard Worker #if defined(__clang__)
28*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_float_divide_by_zero__ \
29*da0073e9SAndroid Build Coastguard Worker   __attribute__((no_sanitize("float-divide-by-zero")))
30*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_undefined__ __attribute__((no_sanitize("undefined")))
31*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_signed_int_overflow__ \
32*da0073e9SAndroid Build Coastguard Worker   __attribute__((no_sanitize("signed-integer-overflow")))
33*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_pointer_overflow__ \
34*da0073e9SAndroid Build Coastguard Worker   __attribute__((no_sanitize("pointer-overflow")))
35*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_function__ __attribute__((no_sanitize("function")))
36*da0073e9SAndroid Build Coastguard Worker #else
37*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_float_divide_by_zero__
38*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_undefined__
39*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_signed_int_overflow__
40*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_pointer_overflow__
41*da0073e9SAndroid Build Coastguard Worker #define __ubsan_ignore_function__
42*da0073e9SAndroid Build Coastguard Worker #endif
43*da0073e9SAndroid Build Coastguard Worker 
44*da0073e9SAndroid Build Coastguard Worker // Detect address sanitizer as some stuff doesn't work with it
45*da0073e9SAndroid Build Coastguard Worker #undef C10_ASAN_ENABLED
46*da0073e9SAndroid Build Coastguard Worker 
47*da0073e9SAndroid Build Coastguard Worker // for clang
48*da0073e9SAndroid Build Coastguard Worker #if defined(__has_feature)
49*da0073e9SAndroid Build Coastguard Worker #if ((__has_feature(address_sanitizer)))
50*da0073e9SAndroid Build Coastguard Worker #define C10_ASAN_ENABLED 1
51*da0073e9SAndroid Build Coastguard Worker #endif
52*da0073e9SAndroid Build Coastguard Worker #endif
53*da0073e9SAndroid Build Coastguard Worker 
54*da0073e9SAndroid Build Coastguard Worker // for gcc
55*da0073e9SAndroid Build Coastguard Worker #if defined(__SANITIZE_ADDRESS__)
56*da0073e9SAndroid Build Coastguard Worker #if __SANITIZE_ADDRESS__
57*da0073e9SAndroid Build Coastguard Worker #if !defined(C10_ASAN_ENABLED)
58*da0073e9SAndroid Build Coastguard Worker #define C10_ASAN_ENABLED 1
59*da0073e9SAndroid Build Coastguard Worker #endif
60*da0073e9SAndroid Build Coastguard Worker #endif
61*da0073e9SAndroid Build Coastguard Worker #endif
62*da0073e9SAndroid Build Coastguard Worker 
63*da0073e9SAndroid Build Coastguard Worker #if !defined(C10_ASAN_ENABLED)
64*da0073e9SAndroid Build Coastguard Worker #define C10_ASAN_ENABLED 0
65*da0073e9SAndroid Build Coastguard Worker #endif
66*da0073e9SAndroid Build Coastguard Worker 
67*da0073e9SAndroid Build Coastguard Worker // Detect undefined-behavior sanitizer (UBSAN)
68*da0073e9SAndroid Build Coastguard Worker #undef C10_UBSAN_ENABLED
69*da0073e9SAndroid Build Coastguard Worker 
70*da0073e9SAndroid Build Coastguard Worker // for clang or gcc >= 14
71*da0073e9SAndroid Build Coastguard Worker // NB: gcc 14 adds support for Clang's __has_feature
72*da0073e9SAndroid Build Coastguard Worker //   https://gcc.gnu.org/gcc-14/changes.html
73*da0073e9SAndroid Build Coastguard Worker //   gcc < 14 doesn't have a macro for UBSAN
74*da0073e9SAndroid Build Coastguard Worker //   (e.g. __SANITIZE_UNDEFINED__ does not exist in gcc)
75*da0073e9SAndroid Build Coastguard Worker //   https://github.com/google/sanitizers/issues/765
76*da0073e9SAndroid Build Coastguard Worker #if defined(__has_feature)
77*da0073e9SAndroid Build Coastguard Worker #if ((__has_feature(undefined_behavior_sanitizer)))
78*da0073e9SAndroid Build Coastguard Worker #define C10_UBSAN_ENABLED 1
79*da0073e9SAndroid Build Coastguard Worker #endif
80*da0073e9SAndroid Build Coastguard Worker #endif
81*da0073e9SAndroid Build Coastguard Worker 
82*da0073e9SAndroid Build Coastguard Worker #if !defined(C10_UBSAN_ENABLED)
83*da0073e9SAndroid Build Coastguard Worker #define C10_UBSAN_ENABLED 0
84*da0073e9SAndroid Build Coastguard Worker #endif
85*da0073e9SAndroid Build Coastguard Worker 
86*da0073e9SAndroid Build Coastguard Worker // Disable the copy and assignment operator for a class. Note that this will
87*da0073e9SAndroid Build Coastguard Worker // disable the usage of the class in std containers.
88*da0073e9SAndroid Build Coastguard Worker #define C10_DISABLE_COPY_AND_ASSIGN(classname) \
89*da0073e9SAndroid Build Coastguard Worker   classname(const classname&) = delete;        \
90*da0073e9SAndroid Build Coastguard Worker   classname& operator=(const classname&) = delete
91*da0073e9SAndroid Build Coastguard Worker 
92*da0073e9SAndroid Build Coastguard Worker #define C10_CONCATENATE_IMPL(s1, s2) s1##s2
93*da0073e9SAndroid Build Coastguard Worker #define C10_CONCATENATE(s1, s2) C10_CONCATENATE_IMPL(s1, s2)
94*da0073e9SAndroid Build Coastguard Worker 
95*da0073e9SAndroid Build Coastguard Worker #define C10_MACRO_EXPAND(args) args
96*da0073e9SAndroid Build Coastguard Worker 
97*da0073e9SAndroid Build Coastguard Worker #define C10_STRINGIZE_IMPL(x) #x
98*da0073e9SAndroid Build Coastguard Worker #define C10_STRINGIZE(x) C10_STRINGIZE_IMPL(x)
99*da0073e9SAndroid Build Coastguard Worker 
100*da0073e9SAndroid Build Coastguard Worker /**
101*da0073e9SAndroid Build Coastguard Worker  * C10_ANONYMOUS_VARIABLE(str) introduces a new identifier which starts with
102*da0073e9SAndroid Build Coastguard Worker  * str and ends with a unique number.
103*da0073e9SAndroid Build Coastguard Worker  */
104*da0073e9SAndroid Build Coastguard Worker #ifdef __COUNTER__
105*da0073e9SAndroid Build Coastguard Worker #define C10_UID __COUNTER__
106*da0073e9SAndroid Build Coastguard Worker #define C10_ANONYMOUS_VARIABLE(str) C10_CONCATENATE(str, __COUNTER__)
107*da0073e9SAndroid Build Coastguard Worker #else
108*da0073e9SAndroid Build Coastguard Worker #define C10_UID __LINE__
109*da0073e9SAndroid Build Coastguard Worker #define C10_ANONYMOUS_VARIABLE(str) C10_CONCATENATE(str, __LINE__)
110*da0073e9SAndroid Build Coastguard Worker #endif
111*da0073e9SAndroid Build Coastguard Worker 
112*da0073e9SAndroid Build Coastguard Worker #ifdef __has_cpp_attribute
113*da0073e9SAndroid Build Coastguard Worker #define C10_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
114*da0073e9SAndroid Build Coastguard Worker #else
115*da0073e9SAndroid Build Coastguard Worker #define C10_HAS_CPP_ATTRIBUTE(x) (0)
116*da0073e9SAndroid Build Coastguard Worker #endif
117*da0073e9SAndroid Build Coastguard Worker 
118*da0073e9SAndroid Build Coastguard Worker /// C10_NODISCARD - Warn if a type or return value is discarded.
119*da0073e9SAndroid Build Coastguard Worker 
120*da0073e9SAndroid Build Coastguard Worker // Technically, we should check if __cplusplus > 201402L here, because
121*da0073e9SAndroid Build Coastguard Worker // [[nodiscard]] is only defined in C++17.  However, some compilers
122*da0073e9SAndroid Build Coastguard Worker // we care about don't advertise being C++17 (e.g., clang), but
123*da0073e9SAndroid Build Coastguard Worker // support the attribute anyway.  In fact, this is not just a good idea,
124*da0073e9SAndroid Build Coastguard Worker // it's the law: clang::warn_unused_result doesn't work on nvcc + clang
125*da0073e9SAndroid Build Coastguard Worker // and the best workaround for this case is to use [[nodiscard]]
126*da0073e9SAndroid Build Coastguard Worker // instead; see https://github.com/pytorch/pytorch/issues/13118
127*da0073e9SAndroid Build Coastguard Worker //
128*da0073e9SAndroid Build Coastguard Worker // Note to future editors: if you have noticed that a compiler is
129*da0073e9SAndroid Build Coastguard Worker // misbehaving (e.g., it advertises support, but the support doesn't
130*da0073e9SAndroid Build Coastguard Worker // actually work, or it is emitting warnings).  Some compilers which
131*da0073e9SAndroid Build Coastguard Worker // are strict about the matter include MSVC, which will complain:
132*da0073e9SAndroid Build Coastguard Worker //
133*da0073e9SAndroid Build Coastguard Worker //  error C2429: attribute 'nodiscard' requires compiler flag '/std:c++latest'
134*da0073e9SAndroid Build Coastguard Worker //
135*da0073e9SAndroid Build Coastguard Worker // Exhibits:
136*da0073e9SAndroid Build Coastguard Worker //  - MSVC 19.14: https://godbolt.org/z/Dzd7gn (requires /std:c++latest)
137*da0073e9SAndroid Build Coastguard Worker //  - Clang 8.0.0: https://godbolt.org/z/3PYL4Z (always advertises support)
138*da0073e9SAndroid Build Coastguard Worker //  - gcc 8.3: https://godbolt.org/z/4tLMQS (always advertises support)
139*da0073e9SAndroid Build Coastguard Worker #if C10_HAS_CPP_ATTRIBUTE(nodiscard)
140*da0073e9SAndroid Build Coastguard Worker #define C10_NODISCARD [[nodiscard]]
141*da0073e9SAndroid Build Coastguard Worker // Workaround for llvm.org/PR23435, since clang 3.6 and below emit a spurious
142*da0073e9SAndroid Build Coastguard Worker // error when __has_cpp_attribute is given a scoped attribute in C mode.
143*da0073e9SAndroid Build Coastguard Worker #elif __cplusplus && C10_HAS_CPP_ATTRIBUTE(clang::warn_unused_result)
144*da0073e9SAndroid Build Coastguard Worker // TODO: It's possible this is still triggering
145*da0073e9SAndroid Build Coastguard Worker // https://github.com/pytorch/pytorch/issues/13118 on Windows; if it is, better
146*da0073e9SAndroid Build Coastguard Worker // fix it.
147*da0073e9SAndroid Build Coastguard Worker #define C10_NODISCARD [[clang::warn_unused_result]]
148*da0073e9SAndroid Build Coastguard Worker #else
149*da0073e9SAndroid Build Coastguard Worker #define C10_NODISCARD
150*da0073e9SAndroid Build Coastguard Worker #endif
151*da0073e9SAndroid Build Coastguard Worker 
152*da0073e9SAndroid Build Coastguard Worker // suppress an unused variable.
153*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) && !defined(__clang__)
154*da0073e9SAndroid Build Coastguard Worker #define C10_UNUSED __pragma(warning(suppress : 4100 4101))
155*da0073e9SAndroid Build Coastguard Worker #else
156*da0073e9SAndroid Build Coastguard Worker #define C10_UNUSED __attribute__((__unused__))
157*da0073e9SAndroid Build Coastguard Worker #endif //_MSC_VER
158*da0073e9SAndroid Build Coastguard Worker 
159*da0073e9SAndroid Build Coastguard Worker #if !defined(__has_attribute)
160*da0073e9SAndroid Build Coastguard Worker #define __has_attribute(x) 0
161*da0073e9SAndroid Build Coastguard Worker #endif
162*da0073e9SAndroid Build Coastguard Worker 
163*da0073e9SAndroid Build Coastguard Worker // Direct port of LLVM_ATTRIBUTE_USED.
164*da0073e9SAndroid Build Coastguard Worker #if __has_attribute(used)
165*da0073e9SAndroid Build Coastguard Worker #define C10_USED __attribute__((__used__))
166*da0073e9SAndroid Build Coastguard Worker #else
167*da0073e9SAndroid Build Coastguard Worker #define C10_USED
168*da0073e9SAndroid Build Coastguard Worker #endif
169*da0073e9SAndroid Build Coastguard Worker 
170*da0073e9SAndroid Build Coastguard Worker #define C10_RESTRICT __restrict
171*da0073e9SAndroid Build Coastguard Worker 
172*da0073e9SAndroid Build Coastguard Worker // Simply define the namespace, in case a dependent library want to refer to
173*da0073e9SAndroid Build Coastguard Worker // the c10 namespace but not any nontrivial files.
174*da0073e9SAndroid Build Coastguard Worker namespace c10 {}
175*da0073e9SAndroid Build Coastguard Worker namespace c10::cuda {}
176*da0073e9SAndroid Build Coastguard Worker namespace c10::hip {}
177*da0073e9SAndroid Build Coastguard Worker namespace c10::xpu {}
178*da0073e9SAndroid Build Coastguard Worker 
179*da0073e9SAndroid Build Coastguard Worker // Since C10 is the core library for caffe2 (and aten), we will simply reroute
180*da0073e9SAndroid Build Coastguard Worker // all abstractions defined in c10 to be available in caffe2 as well.
181*da0073e9SAndroid Build Coastguard Worker // This is only for backwards compatibility. Please use the symbols from the
182*da0073e9SAndroid Build Coastguard Worker // c10 namespace where possible.
183*da0073e9SAndroid Build Coastguard Worker namespace caffe2 {
184*da0073e9SAndroid Build Coastguard Worker using namespace c10;
185*da0073e9SAndroid Build Coastguard Worker }
186*da0073e9SAndroid Build Coastguard Worker namespace at {
187*da0073e9SAndroid Build Coastguard Worker using namespace c10;
188*da0073e9SAndroid Build Coastguard Worker }
189*da0073e9SAndroid Build Coastguard Worker namespace at::cuda {
190*da0073e9SAndroid Build Coastguard Worker using namespace c10::cuda;
191*da0073e9SAndroid Build Coastguard Worker } // namespace at::cuda
192*da0073e9SAndroid Build Coastguard Worker 
193*da0073e9SAndroid Build Coastguard Worker // WARNING!!! THIS IS A GIANT HACK!!!
194*da0073e9SAndroid Build Coastguard Worker // This line means you cannot simultaneously include c10/hip
195*da0073e9SAndroid Build Coastguard Worker // and c10/cuda and then use them from the at::cuda namespace.
196*da0073e9SAndroid Build Coastguard Worker // This is true in practice, because HIPIFY works inplace on
197*da0073e9SAndroid Build Coastguard Worker // files in ATen/cuda, so it assumes that c10::hip is available
198*da0073e9SAndroid Build Coastguard Worker // from at::cuda.  This namespace makes that happen.  When
199*da0073e9SAndroid Build Coastguard Worker // HIPIFY is no longer out-of-place, we can switch the cuda
200*da0073e9SAndroid Build Coastguard Worker // here to hip and everyone is happy.
201*da0073e9SAndroid Build Coastguard Worker namespace at::cuda {
202*da0073e9SAndroid Build Coastguard Worker using namespace c10::hip;
203*da0073e9SAndroid Build Coastguard Worker } // namespace at::cuda
204*da0073e9SAndroid Build Coastguard Worker 
205*da0073e9SAndroid Build Coastguard Worker namespace at::xpu {
206*da0073e9SAndroid Build Coastguard Worker using namespace c10::xpu;
207*da0073e9SAndroid Build Coastguard Worker } // namespace at::xpu
208*da0073e9SAndroid Build Coastguard Worker 
209*da0073e9SAndroid Build Coastguard Worker // C10_LIKELY/C10_UNLIKELY
210*da0073e9SAndroid Build Coastguard Worker //
211*da0073e9SAndroid Build Coastguard Worker // These macros provide parentheses, so you can use these macros as:
212*da0073e9SAndroid Build Coastguard Worker //
213*da0073e9SAndroid Build Coastguard Worker //    if C10_LIKELY(some_expr) {
214*da0073e9SAndroid Build Coastguard Worker //      ...
215*da0073e9SAndroid Build Coastguard Worker //    }
216*da0073e9SAndroid Build Coastguard Worker //
217*da0073e9SAndroid Build Coastguard Worker // NB: static_cast to boolean is mandatory in C++, because __builtin_expect
218*da0073e9SAndroid Build Coastguard Worker // takes a long argument, which means you may trigger the wrong conversion
219*da0073e9SAndroid Build Coastguard Worker // without it.
220*da0073e9SAndroid Build Coastguard Worker //
221*da0073e9SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__ICL) || defined(__clang__)
222*da0073e9SAndroid Build Coastguard Worker #define C10_LIKELY(expr) (__builtin_expect(static_cast<bool>(expr), 1))
223*da0073e9SAndroid Build Coastguard Worker #define C10_UNLIKELY(expr) (__builtin_expect(static_cast<bool>(expr), 0))
224*da0073e9SAndroid Build Coastguard Worker #else
225*da0073e9SAndroid Build Coastguard Worker #define C10_LIKELY(expr) (expr)
226*da0073e9SAndroid Build Coastguard Worker #define C10_UNLIKELY(expr) (expr)
227*da0073e9SAndroid Build Coastguard Worker #endif
228*da0073e9SAndroid Build Coastguard Worker 
229*da0073e9SAndroid Build Coastguard Worker /// C10_NOINLINE - Functions whose declaration is annotated with this will not
230*da0073e9SAndroid Build Coastguard Worker /// be inlined.
231*da0073e9SAndroid Build Coastguard Worker #ifdef __GNUC__
232*da0073e9SAndroid Build Coastguard Worker #define C10_NOINLINE __attribute__((noinline))
233*da0073e9SAndroid Build Coastguard Worker #elif _MSC_VER
234*da0073e9SAndroid Build Coastguard Worker #define C10_NOINLINE __declspec(noinline)
235*da0073e9SAndroid Build Coastguard Worker #else
236*da0073e9SAndroid Build Coastguard Worker #define C10_NOINLINE
237*da0073e9SAndroid Build Coastguard Worker #endif
238*da0073e9SAndroid Build Coastguard Worker 
239*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER)
240*da0073e9SAndroid Build Coastguard Worker #define C10_ALWAYS_INLINE __forceinline
241*da0073e9SAndroid Build Coastguard Worker #elif __has_attribute(always_inline) || defined(__GNUC__)
242*da0073e9SAndroid Build Coastguard Worker #define C10_ALWAYS_INLINE __attribute__((__always_inline__)) inline
243*da0073e9SAndroid Build Coastguard Worker #else
244*da0073e9SAndroid Build Coastguard Worker #define C10_ALWAYS_INLINE inline
245*da0073e9SAndroid Build Coastguard Worker #endif
246*da0073e9SAndroid Build Coastguard Worker 
247*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER)
248*da0073e9SAndroid Build Coastguard Worker #define C10_ATTR_VISIBILITY_HIDDEN
249*da0073e9SAndroid Build Coastguard Worker #elif defined(__GNUC__)
250*da0073e9SAndroid Build Coastguard Worker #define C10_ATTR_VISIBILITY_HIDDEN __attribute__((__visibility__("hidden")))
251*da0073e9SAndroid Build Coastguard Worker #else
252*da0073e9SAndroid Build Coastguard Worker #define C10_ATTR_VISIBILITY_HIDDEN
253*da0073e9SAndroid Build Coastguard Worker #endif
254*da0073e9SAndroid Build Coastguard Worker 
255*da0073e9SAndroid Build Coastguard Worker #define C10_ERASE C10_ALWAYS_INLINE C10_ATTR_VISIBILITY_HIDDEN
256*da0073e9SAndroid Build Coastguard Worker 
257*da0073e9SAndroid Build Coastguard Worker #include <cstdint>
258*da0073e9SAndroid Build Coastguard Worker 
259*da0073e9SAndroid Build Coastguard Worker #ifdef __HIPCC__
260*da0073e9SAndroid Build Coastguard Worker // Unlike CUDA, HIP requires a HIP header to be included for __host__ to work.
261*da0073e9SAndroid Build Coastguard Worker // We do this #include here so that C10_HOST_DEVICE and friends will Just Work.
262*da0073e9SAndroid Build Coastguard Worker // See https://github.com/ROCm-Developer-Tools/HIP/issues/441
263*da0073e9SAndroid Build Coastguard Worker #include <hip/hip_runtime.h>
264*da0073e9SAndroid Build Coastguard Worker #endif
265*da0073e9SAndroid Build Coastguard Worker 
266*da0073e9SAndroid Build Coastguard Worker #if defined(__CUDACC__) || defined(__HIPCC__)
267*da0073e9SAndroid Build Coastguard Worker // Designates functions callable from the host (CPU) and the device (GPU)
268*da0073e9SAndroid Build Coastguard Worker #define C10_HOST_DEVICE __host__ __device__
269*da0073e9SAndroid Build Coastguard Worker #define C10_DEVICE __device__
270*da0073e9SAndroid Build Coastguard Worker #define C10_HOST __host__
271*da0073e9SAndroid Build Coastguard Worker // constants from
272*da0073e9SAndroid Build Coastguard Worker // (https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#features-and-technical-specifications)
273*da0073e9SAndroid Build Coastguard Worker // The maximum number of threads per multiprocessor is 1024 for Turing
274*da0073e9SAndroid Build Coastguard Worker // architecture (7.5), 1536 for Geforce Ampere (8.6)/Jetson Orin (8.7), and
275*da0073e9SAndroid Build Coastguard Worker // 2048 for all other architectures. You'll get warnings if you exceed these
276*da0073e9SAndroid Build Coastguard Worker // constants. Hence, the following macros adjust the input values from the user
277*da0073e9SAndroid Build Coastguard Worker // to resolve potential warnings.
278*da0073e9SAndroid Build Coastguard Worker #if __CUDA_ARCH__ == 750
279*da0073e9SAndroid Build Coastguard Worker constexpr uint32_t CUDA_MAX_THREADS_PER_SM = 1024;
280*da0073e9SAndroid Build Coastguard Worker #elif __CUDA_ARCH__ == 860 || __CUDA_ARCH__ == 870 || __CUDA_ARCH__ == 890
281*da0073e9SAndroid Build Coastguard Worker constexpr uint32_t CUDA_MAX_THREADS_PER_SM = 1536;
282*da0073e9SAndroid Build Coastguard Worker #else
283*da0073e9SAndroid Build Coastguard Worker constexpr uint32_t CUDA_MAX_THREADS_PER_SM = 2048;
284*da0073e9SAndroid Build Coastguard Worker #endif
285*da0073e9SAndroid Build Coastguard Worker // CUDA_MAX_THREADS_PER_BLOCK is same for all architectures currently
286*da0073e9SAndroid Build Coastguard Worker constexpr uint32_t CUDA_MAX_THREADS_PER_BLOCK = 1024;
287*da0073e9SAndroid Build Coastguard Worker // CUDA_THREADS_PER_BLOCK_FALLBACK is the "canonical fallback" choice of block
288*da0073e9SAndroid Build Coastguard Worker // size. 256 is a good number for this fallback and should give good occupancy
289*da0073e9SAndroid Build Coastguard Worker // and versatility across all architectures.
290*da0073e9SAndroid Build Coastguard Worker constexpr uint32_t CUDA_THREADS_PER_BLOCK_FALLBACK = 256;
291*da0073e9SAndroid Build Coastguard Worker // NOTE: if you are thinking of constexpr-ify the inputs to launch bounds, it
292*da0073e9SAndroid Build Coastguard Worker //       turns out that although __launch_bounds__ can take constexpr, it
293*da0073e9SAndroid Build Coastguard Worker //       can't take a constexpr that has anything to do with templates.
294*da0073e9SAndroid Build Coastguard Worker //       Currently we use launch_bounds that depend on template arguments in
295*da0073e9SAndroid Build Coastguard Worker //       Loops.cuh, Reduce.cuh and LossCTC.cuh. Hence, C10_MAX_THREADS_PER_BLOCK
296*da0073e9SAndroid Build Coastguard Worker //       and C10_MIN_BLOCKS_PER_SM are kept as macros.
297*da0073e9SAndroid Build Coastguard Worker // Suppose you were planning to write __launch_bounds__(a, b), based on your
298*da0073e9SAndroid Build Coastguard Worker // performance tuning on a modern GPU. Instead, you should write
299*da0073e9SAndroid Build Coastguard Worker // __launch_bounds__(C10_MAX_THREADS_PER_BLOCK(a), C10_MIN_BLOCKS_PER_SM(a, b)),
300*da0073e9SAndroid Build Coastguard Worker // which will also properly respect limits on old architectures.
301*da0073e9SAndroid Build Coastguard Worker #define C10_MAX_THREADS_PER_BLOCK(val)           \
302*da0073e9SAndroid Build Coastguard Worker   (((val) <= CUDA_MAX_THREADS_PER_BLOCK) ? (val) \
303*da0073e9SAndroid Build Coastguard Worker                                          : CUDA_THREADS_PER_BLOCK_FALLBACK)
304*da0073e9SAndroid Build Coastguard Worker #define C10_MIN_BLOCKS_PER_SM(threads_per_block, blocks_per_sm)        \
305*da0073e9SAndroid Build Coastguard Worker   ((((threads_per_block) * (blocks_per_sm) <= CUDA_MAX_THREADS_PER_SM) \
306*da0073e9SAndroid Build Coastguard Worker         ? (blocks_per_sm)                                              \
307*da0073e9SAndroid Build Coastguard Worker         : ((CUDA_MAX_THREADS_PER_SM + (threads_per_block)-1) /         \
308*da0073e9SAndroid Build Coastguard Worker            (threads_per_block))))
309*da0073e9SAndroid Build Coastguard Worker // C10_LAUNCH_BOUNDS is analogous to __launch_bounds__
310*da0073e9SAndroid Build Coastguard Worker #define C10_LAUNCH_BOUNDS_0 \
311*da0073e9SAndroid Build Coastguard Worker   __launch_bounds__(        \
312*da0073e9SAndroid Build Coastguard Worker       256, 4) // default launch bounds that should give good occupancy and
313*da0073e9SAndroid Build Coastguard Worker               // versatility across all architectures.
314*da0073e9SAndroid Build Coastguard Worker #define C10_LAUNCH_BOUNDS_1(max_threads_per_block) \
315*da0073e9SAndroid Build Coastguard Worker   __launch_bounds__((C10_MAX_THREADS_PER_BLOCK((max_threads_per_block))))
316*da0073e9SAndroid Build Coastguard Worker #define C10_LAUNCH_BOUNDS_2(max_threads_per_block, min_blocks_per_sm) \
317*da0073e9SAndroid Build Coastguard Worker   __launch_bounds__(                                                  \
318*da0073e9SAndroid Build Coastguard Worker       (C10_MAX_THREADS_PER_BLOCK((max_threads_per_block))),           \
319*da0073e9SAndroid Build Coastguard Worker       (C10_MIN_BLOCKS_PER_SM((max_threads_per_block), (min_blocks_per_sm))))
320*da0073e9SAndroid Build Coastguard Worker #else
321*da0073e9SAndroid Build Coastguard Worker #define C10_HOST_DEVICE
322*da0073e9SAndroid Build Coastguard Worker #define C10_HOST
323*da0073e9SAndroid Build Coastguard Worker #define C10_DEVICE
324*da0073e9SAndroid Build Coastguard Worker #endif
325*da0073e9SAndroid Build Coastguard Worker 
326*da0073e9SAndroid Build Coastguard Worker #if defined(USE_ROCM)
327*da0073e9SAndroid Build Coastguard Worker #define C10_HIP_HOST_DEVICE __host__ __device__
328*da0073e9SAndroid Build Coastguard Worker #else
329*da0073e9SAndroid Build Coastguard Worker #define C10_HIP_HOST_DEVICE
330*da0073e9SAndroid Build Coastguard Worker #endif
331*da0073e9SAndroid Build Coastguard Worker 
332*da0073e9SAndroid Build Coastguard Worker #if defined(USE_ROCM)
333*da0073e9SAndroid Build Coastguard Worker #define C10_WARP_SIZE warpSize // = 64 or 32 (Defined in hip_runtime.h)
334*da0073e9SAndroid Build Coastguard Worker #else
335*da0073e9SAndroid Build Coastguard Worker #define C10_WARP_SIZE 32
336*da0073e9SAndroid Build Coastguard Worker #endif
337*da0073e9SAndroid Build Coastguard Worker 
338*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) && _MSC_VER <= 1900
339*da0073e9SAndroid Build Coastguard Worker #define __func__ __FUNCTION__
340*da0073e9SAndroid Build Coastguard Worker #endif
341*da0073e9SAndroid Build Coastguard Worker 
342*da0073e9SAndroid Build Coastguard Worker // CUDA_KERNEL_ASSERT checks the assertion
343*da0073e9SAndroid Build Coastguard Worker // even when NDEBUG is defined. This is useful for important assertions in CUDA
344*da0073e9SAndroid Build Coastguard Worker // code that would otherwise be suppressed when building Release.
345*da0073e9SAndroid Build Coastguard Worker #if defined(__ANDROID__) || defined(__APPLE__) || defined(__FreeBSD__)
346*da0073e9SAndroid Build Coastguard Worker // Those platforms do not support assert()
347*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT(cond)
348*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT_MSG(cond, msg)
349*da0073e9SAndroid Build Coastguard Worker #define SYCL_KERNEL_ASSERT(cond)
350*da0073e9SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
351*da0073e9SAndroid Build Coastguard Worker #if defined(NDEBUG)
352*da0073e9SAndroid Build Coastguard Worker extern "C" {
353*da0073e9SAndroid Build Coastguard Worker C10_IMPORT
354*da0073e9SAndroid Build Coastguard Worker #if defined(__SYCL_DEVICE_ONLY__)
355*da0073e9SAndroid Build Coastguard Worker extern SYCL_EXTERNAL void _wassert(
356*da0073e9SAndroid Build Coastguard Worker     const wchar_t* wexpr,
357*da0073e9SAndroid Build Coastguard Worker     const wchar_t* wfile,
358*da0073e9SAndroid Build Coastguard Worker     unsigned line);
359*da0073e9SAndroid Build Coastguard Worker #else
360*da0073e9SAndroid Build Coastguard Worker #if defined(__CUDA_ARCH__)
361*da0073e9SAndroid Build Coastguard Worker __host__ __device__
362*da0073e9SAndroid Build Coastguard Worker #endif // __CUDA_ARCH__
363*da0073e9SAndroid Build Coastguard Worker     void
364*da0073e9SAndroid Build Coastguard Worker     _wassert(wchar_t const* _Message, wchar_t const* _File, unsigned _Line);
365*da0073e9SAndroid Build Coastguard Worker #endif // __SYCL_DEVICE_ONLY__
366*da0073e9SAndroid Build Coastguard Worker }
367*da0073e9SAndroid Build Coastguard Worker #endif // NDEBUG
368*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT(cond)                 \
369*da0073e9SAndroid Build Coastguard Worker   if (C10_UNLIKELY(!(cond))) {                   \
370*da0073e9SAndroid Build Coastguard Worker     (void)(_wassert(                             \
371*da0073e9SAndroid Build Coastguard Worker                _CRT_WIDE(#cond),                 \
372*da0073e9SAndroid Build Coastguard Worker                _CRT_WIDE(__FILE__),              \
373*da0073e9SAndroid Build Coastguard Worker                static_cast<unsigned>(__LINE__)), \
374*da0073e9SAndroid Build Coastguard Worker            0);                                   \
375*da0073e9SAndroid Build Coastguard Worker   }
376*da0073e9SAndroid Build Coastguard Worker // TODO: This doesn't assert the message because I (chilli) couldn't figure out
377*da0073e9SAndroid Build Coastguard Worker // a nice way to convert a char* to a wchar_t*
378*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT_MSG(cond, msg)        \
379*da0073e9SAndroid Build Coastguard Worker   if (C10_UNLIKELY(!(cond))) {                   \
380*da0073e9SAndroid Build Coastguard Worker     (void)(_wassert(                             \
381*da0073e9SAndroid Build Coastguard Worker                _CRT_WIDE(#cond),                 \
382*da0073e9SAndroid Build Coastguard Worker                _CRT_WIDE(__FILE__),              \
383*da0073e9SAndroid Build Coastguard Worker                static_cast<unsigned>(__LINE__)), \
384*da0073e9SAndroid Build Coastguard Worker            0);                                   \
385*da0073e9SAndroid Build Coastguard Worker   }
386*da0073e9SAndroid Build Coastguard Worker #define SYCL_KERNEL_ASSERT(cond)                 \
387*da0073e9SAndroid Build Coastguard Worker   if (C10_UNLIKELY(!(cond))) {                   \
388*da0073e9SAndroid Build Coastguard Worker     (void)(_wassert(                             \
389*da0073e9SAndroid Build Coastguard Worker                _CRT_WIDE(#cond),                 \
390*da0073e9SAndroid Build Coastguard Worker                _CRT_WIDE(__FILE__),              \
391*da0073e9SAndroid Build Coastguard Worker                static_cast<unsigned>(__LINE__)), \
392*da0073e9SAndroid Build Coastguard Worker            0);                                   \
393*da0073e9SAndroid Build Coastguard Worker   }
394*da0073e9SAndroid Build Coastguard Worker #else // __APPLE__, _MSC_VER
395*da0073e9SAndroid Build Coastguard Worker #if defined(NDEBUG)
396*da0073e9SAndroid Build Coastguard Worker extern "C" {
397*da0073e9SAndroid Build Coastguard Worker #if defined(__SYCL_DEVICE_ONLY__)
398*da0073e9SAndroid Build Coastguard Worker extern SYCL_EXTERNAL void __assert_fail(
399*da0073e9SAndroid Build Coastguard Worker     const char* expr,
400*da0073e9SAndroid Build Coastguard Worker     const char* file,
401*da0073e9SAndroid Build Coastguard Worker     unsigned int line,
402*da0073e9SAndroid Build Coastguard Worker     const char* func);
403*da0073e9SAndroid Build Coastguard Worker #else // __SYCL_DEVICE_ONLY__
404*da0073e9SAndroid Build Coastguard Worker #if (defined(__CUDA_ARCH__) && !(defined(__clang__) && defined(__CUDA__)))
405*da0073e9SAndroid Build Coastguard Worker // CUDA supports __assert_fail function which are common for both device
406*da0073e9SAndroid Build Coastguard Worker // and host side code.
407*da0073e9SAndroid Build Coastguard Worker __host__ __device__
408*da0073e9SAndroid Build Coastguard Worker #endif
409*da0073e9SAndroid Build Coastguard Worker 
410*da0073e9SAndroid Build Coastguard Worker     // This forward declaration matching the declaration of __assert_fail
411*da0073e9SAndroid Build Coastguard Worker     // exactly how it is in glibc in case parts of the program are compiled with
412*da0073e9SAndroid Build Coastguard Worker     // different NDEBUG settings. Otherwise we might get 'ambiguous declaration'
413*da0073e9SAndroid Build Coastguard Worker     // error. Note: On ROCm - this declaration serves for host side compilation.
414*da0073e9SAndroid Build Coastguard Worker     void
415*da0073e9SAndroid Build Coastguard Worker     __assert_fail(
416*da0073e9SAndroid Build Coastguard Worker         const char* assertion,
417*da0073e9SAndroid Build Coastguard Worker         const char* file,
418*da0073e9SAndroid Build Coastguard Worker         unsigned int line,
419*da0073e9SAndroid Build Coastguard Worker         const char* function) noexcept __attribute__((__noreturn__));
420*da0073e9SAndroid Build Coastguard Worker 
421*da0073e9SAndroid Build Coastguard Worker #endif // __SYCL_DEVICE_ONLY__
422*da0073e9SAndroid Build Coastguard Worker }
423*da0073e9SAndroid Build Coastguard Worker #endif // NDEBUG
424*da0073e9SAndroid Build Coastguard Worker // ROCm disable kernel assert by default
425*da0073e9SAndroid Build Coastguard Worker #if !defined(C10_USE_ROCM_KERNEL_ASSERT) and defined(USE_ROCM)
426*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT(cond)
427*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT_MSG(cond, msg)
428*da0073e9SAndroid Build Coastguard Worker #define SYCL_KERNEL_ASSERT(cond)
429*da0073e9SAndroid Build Coastguard Worker #else
430*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT(cond)                                         \
431*da0073e9SAndroid Build Coastguard Worker   if (C10_UNLIKELY(!(cond))) {                                           \
432*da0073e9SAndroid Build Coastguard Worker     __assert_fail(                                                       \
433*da0073e9SAndroid Build Coastguard Worker         #cond, __FILE__, static_cast<unsigned int>(__LINE__), __func__); \
434*da0073e9SAndroid Build Coastguard Worker   }
435*da0073e9SAndroid Build Coastguard Worker #define CUDA_KERNEL_ASSERT_MSG(cond, msg)                              \
436*da0073e9SAndroid Build Coastguard Worker   if (C10_UNLIKELY(!(cond))) {                                         \
437*da0073e9SAndroid Build Coastguard Worker     __assert_fail(                                                     \
438*da0073e9SAndroid Build Coastguard Worker         msg, __FILE__, static_cast<unsigned int>(__LINE__), __func__); \
439*da0073e9SAndroid Build Coastguard Worker   }
440*da0073e9SAndroid Build Coastguard Worker #define SYCL_KERNEL_ASSERT(cond)                                         \
441*da0073e9SAndroid Build Coastguard Worker   if (C10_UNLIKELY(!(cond))) {                                           \
442*da0073e9SAndroid Build Coastguard Worker     __assert_fail(                                                       \
443*da0073e9SAndroid Build Coastguard Worker         #cond, __FILE__, static_cast<unsigned int>(__LINE__), __func__); \
444*da0073e9SAndroid Build Coastguard Worker   }
445*da0073e9SAndroid Build Coastguard Worker #endif //  C10_USE_ROCM_KERNEL_ASSERT and USE_ROCM
446*da0073e9SAndroid Build Coastguard Worker #endif // __APPLE__
447*da0073e9SAndroid Build Coastguard Worker 
448*da0073e9SAndroid Build Coastguard Worker #ifdef __APPLE__
449*da0073e9SAndroid Build Coastguard Worker #include <TargetConditionals.h>
450*da0073e9SAndroid Build Coastguard Worker #endif
451*da0073e9SAndroid Build Coastguard Worker 
452*da0073e9SAndroid Build Coastguard Worker #if defined(__ANDROID__)
453*da0073e9SAndroid Build Coastguard Worker #define C10_ANDROID 1
454*da0073e9SAndroid Build Coastguard Worker #define C10_MOBILE 1
455*da0073e9SAndroid Build Coastguard Worker #elif (                   \
456*da0073e9SAndroid Build Coastguard Worker     defined(__APPLE__) && \
457*da0073e9SAndroid Build Coastguard Worker     (TARGET_IPHONE_SIMULATOR || TARGET_OS_SIMULATOR || TARGET_OS_IPHONE))
458*da0073e9SAndroid Build Coastguard Worker #define C10_IOS 1
459*da0073e9SAndroid Build Coastguard Worker #define C10_MOBILE 1
460*da0073e9SAndroid Build Coastguard Worker #endif // ANDROID / IOS
461*da0073e9SAndroid Build Coastguard Worker 
462*da0073e9SAndroid Build Coastguard Worker #if defined(C10_MOBILE) && C10_MOBILE
463*da0073e9SAndroid Build Coastguard Worker #define C10_ALWAYS_INLINE_UNLESS_MOBILE inline
464*da0073e9SAndroid Build Coastguard Worker #else
465*da0073e9SAndroid Build Coastguard Worker #define C10_ALWAYS_INLINE_UNLESS_MOBILE C10_ALWAYS_INLINE
466*da0073e9SAndroid Build Coastguard Worker #endif
467*da0073e9SAndroid Build Coastguard Worker 
468*da0073e9SAndroid Build Coastguard Worker #if defined(__CUDA_ARCH__)
469*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) && defined(__CUDACC__)
470*da0073e9SAndroid Build Coastguard Worker #define CONSTEXPR_EXCEPT_WIN_CUDA const
471*da0073e9SAndroid Build Coastguard Worker #define C10_HOST_CONSTEXPR_EXCEPT_WIN_CUDA __host__
472*da0073e9SAndroid Build Coastguard Worker 
473*da0073e9SAndroid Build Coastguard Worker // Note [static constexpr char* members for windows NVCC]
474*da0073e9SAndroid Build Coastguard Worker // The Windows NVCC compiler doesn't handle static constexpr class members,
475*da0073e9SAndroid Build Coastguard Worker // although it's fixed in a later version.
476*da0073e9SAndroid Build Coastguard Worker // (see
477*da0073e9SAndroid Build Coastguard Worker // https://developercommunity.visualstudio.com/t/intellisense-error-c11-static-constexpr-member-ini/245425)
478*da0073e9SAndroid Build Coastguard Worker //
479*da0073e9SAndroid Build Coastguard Worker // If we want to ensure that our field is static under all builds, then we need
480*da0073e9SAndroid Build Coastguard Worker // to work around it specifically for windows NVCC by making it (a) const, (b)
481*da0073e9SAndroid Build Coastguard Worker // defined outside of the class definition We need to define it outside of the
482*da0073e9SAndroid Build Coastguard Worker // class definition because of the C++ standard; char* is not an integral type
483*da0073e9SAndroid Build Coastguard Worker // (see
484*da0073e9SAndroid Build Coastguard Worker // https://stackoverflow.com/questions/24278473/intellisense-a-member-of-type-const-char-const-cannot-have-an-in-class-in)
485*da0073e9SAndroid Build Coastguard Worker //
486*da0073e9SAndroid Build Coastguard Worker // So instead of this:
487*da0073e9SAndroid Build Coastguard Worker // struct Foo {
488*da0073e9SAndroid Build Coastguard Worker //     static constexpr const char* name = "foo";
489*da0073e9SAndroid Build Coastguard Worker // }
490*da0073e9SAndroid Build Coastguard Worker // In Windows NVCC, we end up with this:
491*da0073e9SAndroid Build Coastguard Worker // struct Foo {
492*da0073e9SAndroid Build Coastguard Worker //     static const char* name;
493*da0073e9SAndroid Build Coastguard Worker // }
494*da0073e9SAndroid Build Coastguard Worker // const char* Foo::name = "foo";
495*da0073e9SAndroid Build Coastguard Worker //
496*da0073e9SAndroid Build Coastguard Worker // This gives us a small perf hit for any code that wants to access these field
497*da0073e9SAndroid Build Coastguard Worker // members, but right now it isn't used in any perf-critical code paths.
498*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(field, val) \
499*da0073e9SAndroid Build Coastguard Worker   static const char* field;
500*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA(cls, field, val) \
501*da0073e9SAndroid Build Coastguard Worker   const char* cls::field = val;
502*da0073e9SAndroid Build Coastguard Worker #else
503*da0073e9SAndroid Build Coastguard Worker #define CONSTEXPR_EXCEPT_WIN_CUDA constexpr
504*da0073e9SAndroid Build Coastguard Worker #define C10_HOST_CONSTEXPR_EXCEPT_WIN_CUDA __host__
505*da0073e9SAndroid Build Coastguard Worker 
506*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(field, val) \
507*da0073e9SAndroid Build Coastguard Worker   static constexpr const char* field = val;
508*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA(cls, field, val)
509*da0073e9SAndroid Build Coastguard Worker #endif
510*da0073e9SAndroid Build Coastguard Worker #else
511*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) && defined(__CUDACC__)
512*da0073e9SAndroid Build Coastguard Worker #define CONSTEXPR_EXCEPT_WIN_CUDA const
513*da0073e9SAndroid Build Coastguard Worker #define C10_HOST_CONSTEXPR_EXCEPT_WIN_CUDA
514*da0073e9SAndroid Build Coastguard Worker 
515*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(field, val) \
516*da0073e9SAndroid Build Coastguard Worker   static const char* field;
517*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA(cls, field, val) \
518*da0073e9SAndroid Build Coastguard Worker   const char* cls::field = val;
519*da0073e9SAndroid Build Coastguard Worker #else
520*da0073e9SAndroid Build Coastguard Worker #define CONSTEXPR_EXCEPT_WIN_CUDA constexpr
521*da0073e9SAndroid Build Coastguard Worker #define C10_HOST_CONSTEXPR_EXCEPT_WIN_CUDA constexpr
522*da0073e9SAndroid Build Coastguard Worker 
523*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA(field, val) \
524*da0073e9SAndroid Build Coastguard Worker   static constexpr const char* field = val;
525*da0073e9SAndroid Build Coastguard Worker #define STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA(cls, field, val)
526*da0073e9SAndroid Build Coastguard Worker #endif
527*da0073e9SAndroid Build Coastguard Worker #endif
528*da0073e9SAndroid Build Coastguard Worker 
529*da0073e9SAndroid Build Coastguard Worker #ifndef HAS_DEMANGLE
530*da0073e9SAndroid Build Coastguard Worker #if defined(__ANDROID__) || defined(_WIN32) || defined(__EMSCRIPTEN__)
531*da0073e9SAndroid Build Coastguard Worker #define HAS_DEMANGLE 0
532*da0073e9SAndroid Build Coastguard Worker #elif defined(__APPLE__) && \
533*da0073e9SAndroid Build Coastguard Worker     (TARGET_IPHONE_SIMULATOR || TARGET_OS_SIMULATOR || TARGET_OS_IPHONE)
534*da0073e9SAndroid Build Coastguard Worker #define HAS_DEMANGLE 0
535*da0073e9SAndroid Build Coastguard Worker #else
536*da0073e9SAndroid Build Coastguard Worker #define HAS_DEMANGLE 1
537*da0073e9SAndroid Build Coastguard Worker #endif
538*da0073e9SAndroid Build Coastguard Worker #endif // HAS_DEMANGLE
539*da0073e9SAndroid Build Coastguard Worker 
540*da0073e9SAndroid Build Coastguard Worker #define _C10_PRAGMA__(string) _Pragma(#string)
541*da0073e9SAndroid Build Coastguard Worker #define _C10_PRAGMA_(string) _C10_PRAGMA__(string)
542*da0073e9SAndroid Build Coastguard Worker 
543*da0073e9SAndroid Build Coastguard Worker #ifdef __clang__
544*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_DIAGNOSTIC_PUSH() _Pragma("clang diagnostic push")
545*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_DIAGNOSTIC_POP() _Pragma("clang diagnostic pop")
546*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_DIAGNOSTIC_IGNORE(flag) \
547*da0073e9SAndroid Build Coastguard Worker   _C10_PRAGMA_(clang diagnostic ignored flag)
548*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_HAS_WARNING(flag) __has_warning(flag)
549*da0073e9SAndroid Build Coastguard Worker #else
550*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_DIAGNOSTIC_PUSH()
551*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_DIAGNOSTIC_POP()
552*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_DIAGNOSTIC_IGNORE(flag)
553*da0073e9SAndroid Build Coastguard Worker #define C10_CLANG_HAS_WARNING(flag) 0
554*da0073e9SAndroid Build Coastguard Worker #endif
555*da0073e9SAndroid Build Coastguard Worker 
556*da0073e9SAndroid Build Coastguard Worker #ifdef __clang__
557*da0073e9SAndroid Build Coastguard Worker 
558*da0073e9SAndroid Build Coastguard Worker #define C10_DIAGNOSTIC_PUSH_AND_IGNORED_IF_DEFINED(warning)         \
559*da0073e9SAndroid Build Coastguard Worker   _C10_PRAGMA_(clang diagnostic push)                               \
560*da0073e9SAndroid Build Coastguard Worker   _C10_PRAGMA_(clang diagnostic ignored "-Wunknown-warning-option") \
561*da0073e9SAndroid Build Coastguard Worker   _C10_PRAGMA_(clang diagnostic ignored warning)
562*da0073e9SAndroid Build Coastguard Worker 
563*da0073e9SAndroid Build Coastguard Worker #define C10_DIAGNOSTIC_POP() _C10_PRAGMA_(clang diagnostic pop)
564*da0073e9SAndroid Build Coastguard Worker 
565*da0073e9SAndroid Build Coastguard Worker #elif __GNUC__
566*da0073e9SAndroid Build Coastguard Worker 
567*da0073e9SAndroid Build Coastguard Worker #define C10_DIAGNOSTIC_PUSH_AND_IGNORED_IF_DEFINED(warning) \
568*da0073e9SAndroid Build Coastguard Worker   _C10_PRAGMA_(GCC diagnostic push)                         \
569*da0073e9SAndroid Build Coastguard Worker   _C10_PRAGMA_(GCC diagnostic ignored "-Wpragmas")          \
570*da0073e9SAndroid Build Coastguard Worker   _C10_PRAGMA_(GCC diagnostic ignored warning)
571*da0073e9SAndroid Build Coastguard Worker 
572*da0073e9SAndroid Build Coastguard Worker #define C10_DIAGNOSTIC_POP() _C10_PRAGMA_(GCC diagnostic pop)
573*da0073e9SAndroid Build Coastguard Worker 
574*da0073e9SAndroid Build Coastguard Worker #else
575*da0073e9SAndroid Build Coastguard Worker 
576*da0073e9SAndroid Build Coastguard Worker #define C10_DIAGNOSTIC_PUSH_AND_IGNORED_IF_DEFINED(warning)
577*da0073e9SAndroid Build Coastguard Worker #define C10_DIAGNOSTIC_POP()
578*da0073e9SAndroid Build Coastguard Worker 
579*da0073e9SAndroid Build Coastguard Worker #endif
580*da0073e9SAndroid Build Coastguard Worker 
581*da0073e9SAndroid Build Coastguard Worker #endif // C10_MACROS_MACROS_H_
582