Fix T53001: more workarounds for crash in AMD compiler with recent drivers.
[blender-staging.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(__cplusplus) && ((__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1800))
91 #  define HAS_CPP11_FEATURES
92 #endif
93
94 #if defined(__GNUC__) || defined(__clang__)
95 #  if defined(HAS_CPP11_FEATURES)
96 /* Some magic to be sure we don't have reference in the type. */
97 template<typename T> static inline T decltype_helper(T x) { return x; }
98 #    define TYPEOF(x) decltype(decltype_helper(x))
99 #  else
100 #    define TYPEOF(x) typeof(x)
101 #  endif
102 #endif
103
104 /* Causes warning:
105  * incompatible types when assigning to type 'Foo' from type 'Bar'
106  * ... the compiler optimizes away the temp var */
107 #ifdef __GNUC__
108 #define CHECK_TYPE(var, type)  {  \
109         TYPEOF(var) *__tmp;           \
110         __tmp = (type *)NULL;         \
111         (void)__tmp;                  \
112 } (void)0
113
114 #define CHECK_TYPE_PAIR(var_a, var_b)  {  \
115         TYPEOF(var_a) *__tmp;                 \
116         __tmp = (typeof(var_b) *)NULL;        \
117         (void)__tmp;                          \
118 } (void)0
119 #else
120 #  define CHECK_TYPE(var, type)
121 #  define CHECK_TYPE_PAIR(var_a, var_b)
122 #endif
123
124 /* can be used in simple macros */
125 #define CHECK_TYPE_INLINE(val, type) \
126         ((void)(((type)0) != (val)))
127
128 #ifndef __KERNEL_GPU__
129 #  include <cassert>
130 #  define util_assert(statement)  assert(statement)
131 #else
132 #  define util_assert(statement)
133 #endif
134
135 #endif /* __UTIL_DEFINES_H__ */
136