Fix T56199: Crash on Annotation in (VSE) Image Preview
[blender.git] / intern / cycles / util / util_defines.h
1
2 /*
3  * Copyright 2011-2017 Blender Foundation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 #ifndef __UTIL_DEFINES_H__
19 #define __UTIL_DEFINES_H__
20
21 /* Bitness */
22
23 #if defined(__ppc64__) || defined(__PPC64__) || defined(__x86_64__) || defined(__ia64__) || defined(_M_X64)
24 #  define __KERNEL_64_BIT__
25 #endif
26
27 /* Qualifiers for kernel code shared by CPU and GPU */
28
29 #ifndef __KERNEL_GPU__
30 #  define ccl_device static inline
31 #  define ccl_device_noinline static
32 #  define ccl_global
33 #  define ccl_static_constant static const
34 #  define ccl_constant const
35 #  define ccl_local
36 #  define ccl_local_param
37 #  define ccl_private
38 #  define ccl_restrict __restrict
39 #  define ccl_ref &
40 #  define __KERNEL_WITH_SSE_ALIGN__
41
42 #  if defined(_WIN32) && !defined(FREE_WINDOWS)
43 #    define ccl_device_inline static __forceinline
44 #    define ccl_device_forceinline static __forceinline
45 #    define ccl_align(...) __declspec(align(__VA_ARGS__))
46 #    ifdef __KERNEL_64_BIT__
47 #      define ccl_try_align(...) __declspec(align(__VA_ARGS__))
48 #    else  /* __KERNEL_64_BIT__ */
49 #      undef __KERNEL_WITH_SSE_ALIGN__
50 /* No support for function arguments (error C2719). */
51 #      define ccl_try_align(...)
52 #    endif  /* __KERNEL_64_BIT__ */
53 #    define ccl_may_alias
54 #    define ccl_always_inline __forceinline
55 #    define ccl_never_inline __declspec(noinline)
56 #    define ccl_maybe_unused
57 #  else  /* _WIN32 && !FREE_WINDOWS */
58 #    define ccl_device_inline static inline __attribute__((always_inline))
59 #    define ccl_device_forceinline static inline __attribute__((always_inline))
60 #    define ccl_align(...) __attribute__((aligned(__VA_ARGS__)))
61 #    ifndef FREE_WINDOWS64
62 #      define __forceinline inline __attribute__((always_inline))
63 #    endif
64 #    define ccl_try_align(...) __attribute__((aligned(__VA_ARGS__)))
65 #    define ccl_may_alias __attribute__((__may_alias__))
66 #    define ccl_always_inline __attribute__((always_inline))
67 #    define ccl_never_inline __attribute__((noinline))
68 #    define ccl_maybe_unused __attribute__((used))
69 #  endif  /* _WIN32 && !FREE_WINDOWS */
70
71 /* Use to suppress '-Wimplicit-fallthrough' (in place of 'break'). */
72 #  if defined(__GNUC__) && (__GNUC__ >= 7)  /* gcc7.0+ only */
73 #    define ATTR_FALLTHROUGH __attribute__((fallthrough))
74 #  else
75 #    define ATTR_FALLTHROUGH ((void)0)
76 #  endif
77 #endif  /* __KERNEL_GPU__ */
78
79 /* macros */
80
81 /* hints for branch prediction, only use in code that runs a _lot_ */
82 #if defined(__GNUC__) && defined(__KERNEL_CPU__)
83 #  define LIKELY(x)       __builtin_expect(!!(x), 1)
84 #  define UNLIKELY(x)     __builtin_expect(!!(x), 0)
85 #else
86 #  define LIKELY(x)       (x)
87 #  define UNLIKELY(x)     (x)
88 #endif
89
90 #if defined(__GNUC__) || defined(__clang__)
91 /* Some magic to be sure we don't have reference in the type. */
92 template<typename T> static inline T decltype_helper(T x) { return x; }
93 #  define TYPEOF(x) decltype(decltype_helper(x))
94 #endif
95
96 /* Causes warning:
97  * incompatible types when assigning to type 'Foo' from type 'Bar'
98  * ... the compiler optimizes away the temp var */
99 #ifdef __GNUC__
100 #define CHECK_TYPE(var, type)  {  \
101         TYPEOF(var) *__tmp;           \
102         __tmp = (type *)NULL;         \
103         (void)__tmp;                  \
104 } (void)0
105
106 #define CHECK_TYPE_PAIR(var_a, var_b)  {  \
107         TYPEOF(var_a) *__tmp;                 \
108         __tmp = (typeof(var_b) *)NULL;        \
109         (void)__tmp;                          \
110 } (void)0
111 #else
112 #  define CHECK_TYPE(var, type)
113 #  define CHECK_TYPE_PAIR(var_a, var_b)
114 #endif
115
116 /* can be used in simple macros */
117 #define CHECK_TYPE_INLINE(val, type) \
118         ((void)(((type)0) != (val)))
119
120 #ifndef __KERNEL_GPU__
121 #  include <cassert>
122 #  define util_assert(statement)  assert(statement)
123 #else
124 #  define util_assert(statement)
125 #endif
126
127 #endif /* __UTIL_DEFINES_H__ */