Cleanup: fix ATTR_FALLTHROUGH warnings.
[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 #  ifndef ATTR_FALLTHROUGH
73 #    if defined(__GNUC__) && (__GNUC__ >= 7)  /* gcc7.0+ only */
74 #      define ATTR_FALLTHROUGH __attribute__((fallthrough))
75 #    else
76 #      define ATTR_FALLTHROUGH ((void) 0)
77 #    endif
78 #  endif
79 #endif  /* __KERNEL_GPU__ */
80
81 /* macros */
82
83 /* hints for branch prediction, only use in code that runs a _lot_ */
84 #if defined(__GNUC__) && defined(__KERNEL_CPU__)
85 #  define LIKELY(x)       __builtin_expect(!!(x), 1)
86 #  define UNLIKELY(x)     __builtin_expect(!!(x), 0)
87 #else
88 #  define LIKELY(x)       (x)
89 #  define UNLIKELY(x)     (x)
90 #endif
91
92 #if defined(__GNUC__) || defined(__clang__)
93 #  if defined(__cplusplus)
94 /* Some magic to be sure we don't have reference in the type. */
95 template<typename T> static inline T decltype_helper(T x) { return x; }
96 #    define TYPEOF(x) decltype(decltype_helper(x))
97 #  else
98 #    define TYPEOF(x) typeof(x)
99 #  endif
100 #endif
101
102 /* Causes warning:
103  * incompatible types when assigning to type 'Foo' from type 'Bar'
104  * ... the compiler optimizes away the temp var */
105 #ifdef __GNUC__
106 #define CHECK_TYPE(var, type)  {  \
107         TYPEOF(var) *__tmp;           \
108         __tmp = (type *)NULL;         \
109         (void) __tmp;                 \
110 } (void) 0
111
112 #define CHECK_TYPE_PAIR(var_a, var_b)  {  \
113         TYPEOF(var_a) *__tmp;                 \
114         __tmp = (typeof(var_b) *)NULL;        \
115         (void) __tmp;                          \
116 } (void) 0
117 #else
118 #  define CHECK_TYPE(var, type)
119 #  define CHECK_TYPE_PAIR(var_a, var_b)
120 #endif
121
122 /* can be used in simple macros */
123 #define CHECK_TYPE_INLINE(val, type) \
124         ((void)(((type)0) != (val)))
125
126 #ifndef __KERNEL_GPU__
127 #  include <cassert>
128 #  define util_assert(statement)  assert(statement)
129 #else
130 #  define util_assert(statement)
131 #endif
132
133 #endif  /* __UTIL_DEFINES_H__ */