xref: /aosp_15_r20/external/deqp/framework/delibs/debase/deDefs.h (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker #ifndef _DEDEFS_H
2*35238bceSAndroid Build Coastguard Worker #define _DEDEFS_H
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  * drawElements Base Portability Library
5*35238bceSAndroid Build Coastguard Worker  * -------------------------------------
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker  *
9*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker  *
15*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker  *
21*35238bceSAndroid Build Coastguard Worker  *//*!
22*35238bceSAndroid Build Coastguard Worker  * \file
23*35238bceSAndroid Build Coastguard Worker  * \brief Basic portability.
24*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker /* Compilers. */
27*35238bceSAndroid Build Coastguard Worker #define DE_COMPILER_VANILLA 0 /*!< Vanilla compiler. Used for disabling all platform-specific optimizations.    */
28*35238bceSAndroid Build Coastguard Worker #define DE_COMPILER_MSC 1     /*!< Microsoft Visual Studio.                                                    */
29*35238bceSAndroid Build Coastguard Worker #define DE_COMPILER_GCC 2     /*!< Gnu C Compiler.                                                            */
30*35238bceSAndroid Build Coastguard Worker #define DE_COMPILER_CLANG 3   /*!< LLVM Clang Compiler.                                                        */
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker /* Compiler detection. */
33*35238bceSAndroid Build Coastguard Worker #if defined(_MSC_VER)
34*35238bceSAndroid Build Coastguard Worker #define DE_DETAIL_DETECTED_COMPILER DE_COMPILER_MSC
35*35238bceSAndroid Build Coastguard Worker #elif defined(__clang__)
36*35238bceSAndroid Build Coastguard Worker #define DE_DETAIL_DETECTED_COMPILER DE_COMPILER_CLANG
37*35238bceSAndroid Build Coastguard Worker #elif defined(__GNUC__)
38*35238bceSAndroid Build Coastguard Worker #define DE_DETAIL_DETECTED_COMPILER DE_COMPILER_GCC
39*35238bceSAndroid Build Coastguard Worker #else
40*35238bceSAndroid Build Coastguard Worker /* DE_DETAIL_DETECTED_COMPILER not set */
41*35238bceSAndroid Build Coastguard Worker #endif
42*35238bceSAndroid Build Coastguard Worker 
43*35238bceSAndroid Build Coastguard Worker /* Compiler setting. */
44*35238bceSAndroid Build Coastguard Worker #if defined(DE_COMPILER)
45*35238bceSAndroid Build Coastguard Worker /* Allow definitions from outside, but fail early if it conflicts with our detection */
46*35238bceSAndroid Build Coastguard Worker #if defined(DE_DETAIL_DETECTED_COMPILER) && (DE_COMPILER != DE_DETAIL_DETECTED_COMPILER)
47*35238bceSAndroid Build Coastguard Worker /* conflict, print a nice error messages for the most common misconfigs,
48*35238bceSAndroid Build Coastguard Worker  * GCC and Clang, and a generic for other conflicts.
49*35238bceSAndroid Build Coastguard Worker  */
50*35238bceSAndroid Build Coastguard Worker #if (DE_DETAIL_DETECTED_COMPILER == DE_COMPILER_CLANG) && (DE_COMPILER == DE_COMPILER_GCC)
51*35238bceSAndroid Build Coastguard Worker #error Detected compiler is Clang, but got DE_COMPILER == DE_COMPILER_GCC
52*35238bceSAndroid Build Coastguard Worker #elif (DE_DETAIL_DETECTED_COMPILER == DE_COMPILER_GCC) && (DE_COMPILER == DE_COMPILER_CLANG)
53*35238bceSAndroid Build Coastguard Worker #error Detected compiler is GCC, but got DE_COMPILER == DE_COMPILER_CLANG
54*35238bceSAndroid Build Coastguard Worker #else
55*35238bceSAndroid Build Coastguard Worker #error Detected compiler does not match the supplied compiler.
56*35238bceSAndroid Build Coastguard Worker #endif
57*35238bceSAndroid Build Coastguard Worker #endif
58*35238bceSAndroid Build Coastguard Worker /* Clear autodetect vars. */
59*35238bceSAndroid Build Coastguard Worker #if defined(DE_DETAIL_DETECTED_COMPILER)
60*35238bceSAndroid Build Coastguard Worker #undef DE_DETAIL_DETECTED_COMPILER
61*35238bceSAndroid Build Coastguard Worker #endif
62*35238bceSAndroid Build Coastguard Worker #else
63*35238bceSAndroid Build Coastguard Worker /* No definition given from outside, try to autodetect */
64*35238bceSAndroid Build Coastguard Worker #if defined(DE_DETAIL_DETECTED_COMPILER)
65*35238bceSAndroid Build Coastguard Worker #define DE_COMPILER DE_DETAIL_DETECTED_COMPILER /*!< Compiler identification (set to one of DE_COMPILER_*). */
66*35238bceSAndroid Build Coastguard Worker #else
67*35238bceSAndroid Build Coastguard Worker #error Unknown compiler.
68*35238bceSAndroid Build Coastguard Worker #endif
69*35238bceSAndroid Build Coastguard Worker #endif
70*35238bceSAndroid Build Coastguard Worker 
71*35238bceSAndroid Build Coastguard Worker /* Operating systems. */
72*35238bceSAndroid Build Coastguard Worker #define DE_OS_VANILLA 0 /*!< Vanilla OS.                                */
73*35238bceSAndroid Build Coastguard Worker #define DE_OS_WIN32 1   /*!< Microsoft Windows desktop                    */
74*35238bceSAndroid Build Coastguard Worker #define DE_OS_UNIX 2    /*!< Unix (or compatible)                        */
75*35238bceSAndroid Build Coastguard Worker #define DE_OS_WINCE 3   /*!< Windows CE, Windows Mobile or Pocket PC    */
76*35238bceSAndroid Build Coastguard Worker #define DE_OS_OSX 4     /*!< Mac OS X                                    */
77*35238bceSAndroid Build Coastguard Worker #define DE_OS_ANDROID 5 /*!< Android                                    */
78*35238bceSAndroid Build Coastguard Worker #define DE_OS_SYMBIAN 6 /*!< Symbian OS                                    */
79*35238bceSAndroid Build Coastguard Worker #define DE_OS_IOS 7     /*!< iOS                                        */
80*35238bceSAndroid Build Coastguard Worker #define DE_OS_QNX 8     /*!< QNX                                        */
81*35238bceSAndroid Build Coastguard Worker #define DE_OS_FUCHSIA 9 /*!< Fuchsia                                    */
82*35238bceSAndroid Build Coastguard Worker 
83*35238bceSAndroid Build Coastguard Worker /* OS detection (set to one of DE_OS_*). */
84*35238bceSAndroid Build Coastguard Worker #if defined(DE_OS)
85*35238bceSAndroid Build Coastguard Worker /* Allow definitions from outside. */
86*35238bceSAndroid Build Coastguard Worker #elif defined(__ANDROID__)
87*35238bceSAndroid Build Coastguard Worker #define DE_OS DE_OS_ANDROID
88*35238bceSAndroid Build Coastguard Worker #elif defined(_WIN32_WCE) || defined(UNDER_CE)
89*35238bceSAndroid Build Coastguard Worker #define DE_OS DE_OS_WINCE
90*35238bceSAndroid Build Coastguard Worker #elif defined(_WIN32)
91*35238bceSAndroid Build Coastguard Worker #define DE_OS DE_OS_WIN32
92*35238bceSAndroid Build Coastguard Worker #elif defined(__unix__) || defined(__linux) || defined(__linux__)
93*35238bceSAndroid Build Coastguard Worker #define DE_OS DE_OS_UNIX
94*35238bceSAndroid Build Coastguard Worker #elif defined(__APPLE__)
95*35238bceSAndroid Build Coastguard Worker #define DE_OS DE_OS_OSX
96*35238bceSAndroid Build Coastguard Worker #elif defined(__EPOC32__)
97*35238bceSAndroid Build Coastguard Worker #define DE_OS DE_OS_SYMBIAN
98*35238bceSAndroid Build Coastguard Worker #elif defined(__QNX__)
99*35238bceSAndroid Build Coastguard Worker #define DE_OS DE_OS_QNX
100*35238bceSAndroid Build Coastguard Worker #else
101*35238bceSAndroid Build Coastguard Worker #error Unknown operating system.
102*35238bceSAndroid Build Coastguard Worker #endif
103*35238bceSAndroid Build Coastguard Worker 
104*35238bceSAndroid Build Coastguard Worker #if ((DE_OS == DE_OS_WIN32) || (DE_OS == DE_OS_UNIX)) && !defined(DEQP_SURFACELESS) && !defined(NULLWS)
105*35238bceSAndroid Build Coastguard Worker #define DE_PLATFORM_USE_LIBRARY_TYPE 1
106*35238bceSAndroid Build Coastguard Worker #else
107*35238bceSAndroid Build Coastguard Worker #undef DE_PLATFORM_USE_LIBRARY_TYPE
108*35238bceSAndroid Build Coastguard Worker #endif
109*35238bceSAndroid Build Coastguard Worker 
110*35238bceSAndroid Build Coastguard Worker /* CPUs */
111*35238bceSAndroid Build Coastguard Worker #define DE_CPU_VANILLA 0
112*35238bceSAndroid Build Coastguard Worker #define DE_CPU_X86 1
113*35238bceSAndroid Build Coastguard Worker #define DE_CPU_ARM 2
114*35238bceSAndroid Build Coastguard Worker #define DE_CPU_X86_64 3
115*35238bceSAndroid Build Coastguard Worker #define DE_CPU_ARM_64 4
116*35238bceSAndroid Build Coastguard Worker #define DE_CPU_MIPS 5
117*35238bceSAndroid Build Coastguard Worker #define DE_CPU_MIPS_64 6
118*35238bceSAndroid Build Coastguard Worker #define DE_CPU_RISCV_32 7
119*35238bceSAndroid Build Coastguard Worker #define DE_CPU_RISCV_64 8
120*35238bceSAndroid Build Coastguard Worker 
121*35238bceSAndroid Build Coastguard Worker /* CPU detection. */
122*35238bceSAndroid Build Coastguard Worker #if defined(DE_CPU)
123*35238bceSAndroid Build Coastguard Worker /* Allow definitions from outside. */
124*35238bceSAndroid Build Coastguard Worker #elif defined(__aarch64__)
125*35238bceSAndroid Build Coastguard Worker #define DE_CPU DE_CPU_ARM_64
126*35238bceSAndroid Build Coastguard Worker #elif defined(__arm__) || defined(__ARM__) || defined(__ARM_NEON__) || defined(ARM_BUILD)
127*35238bceSAndroid Build Coastguard Worker #define DE_CPU DE_CPU_ARM
128*35238bceSAndroid Build Coastguard Worker #elif defined(_M_X64) || defined(__x86_64__) || defined(__amd64__)
129*35238bceSAndroid Build Coastguard Worker #define DE_CPU DE_CPU_X86_64
130*35238bceSAndroid Build Coastguard Worker #elif defined(__i386__) || defined(_M_X86) || defined(_M_IX86) || defined(X86_BUILD)
131*35238bceSAndroid Build Coastguard Worker #define DE_CPU DE_CPU_X86
132*35238bceSAndroid Build Coastguard Worker #elif defined(__mips__) && ((__mips) == 32)
133*35238bceSAndroid Build Coastguard Worker #define DE_CPU DE_CPU_MIPS
134*35238bceSAndroid Build Coastguard Worker #elif defined(__mips__) && ((__mips) == 64)
135*35238bceSAndroid Build Coastguard Worker #define DE_CPU DE_CPU_MIPS_64
136*35238bceSAndroid Build Coastguard Worker #elif defined(__riscv) && ((__riscv_xlen) == 32)
137*35238bceSAndroid Build Coastguard Worker #define DE_CPU DE_CPU_RISCV_32
138*35238bceSAndroid Build Coastguard Worker #elif defined(__riscv) && ((__riscv_xlen) == 64)
139*35238bceSAndroid Build Coastguard Worker #define DE_CPU DE_CPU_RISCV_64
140*35238bceSAndroid Build Coastguard Worker #else
141*35238bceSAndroid Build Coastguard Worker #error Unknown CPU.
142*35238bceSAndroid Build Coastguard Worker #endif
143*35238bceSAndroid Build Coastguard Worker 
144*35238bceSAndroid Build Coastguard Worker /* Endianness */
145*35238bceSAndroid Build Coastguard Worker #define DE_BIG_ENDIAN 0
146*35238bceSAndroid Build Coastguard Worker #define DE_LITTLE_ENDIAN 1
147*35238bceSAndroid Build Coastguard Worker 
148*35238bceSAndroid Build Coastguard Worker #if defined(DE_ENDIANNESS)
149*35238bceSAndroid Build Coastguard Worker /* Allow definitions from outside. */
150*35238bceSAndroid Build Coastguard Worker #elif (DE_CPU == DE_CPU_X86) || (DE_CPU == DE_CPU_X86_64)
151*35238bceSAndroid Build Coastguard Worker /* "detect" x86(_64) endianness */
152*35238bceSAndroid Build Coastguard Worker #define DE_ENDIANNESS DE_LITTLE_ENDIAN
153*35238bceSAndroid Build Coastguard Worker #elif ((DE_CPU == DE_CPU_MIPS) || (DE_CPU == DE_CPU_MIPS_64))
154*35238bceSAndroid Build Coastguard Worker /* detect mips endianness using platform specific macros */
155*35238bceSAndroid Build Coastguard Worker #if defined(__MIPSEB__) && !defined(__MIPSEL__)
156*35238bceSAndroid Build Coastguard Worker #define DE_ENDIANNESS DE_BIG_ENDIAN
157*35238bceSAndroid Build Coastguard Worker #elif !defined(__MIPSEB__) && defined(__MIPSEL__)
158*35238bceSAndroid Build Coastguard Worker #define DE_ENDIANNESS DE_LITTLE_ENDIAN
159*35238bceSAndroid Build Coastguard Worker #else
160*35238bceSAndroid Build Coastguard Worker #error Invalid MIPS endianness.
161*35238bceSAndroid Build Coastguard Worker #endif
162*35238bceSAndroid Build Coastguard Worker #elif defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
163*35238bceSAndroid Build Coastguard Worker #define DE_ENDIANNESS DE_LITTLE_ENDIAN
164*35238bceSAndroid Build Coastguard Worker #elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
165*35238bceSAndroid Build Coastguard Worker #define DE_ENDIANNESS DE_BIG_ENDIAN
166*35238bceSAndroid Build Coastguard Worker #else
167*35238bceSAndroid Build Coastguard Worker #error Unknown endianness.
168*35238bceSAndroid Build Coastguard Worker #endif
169*35238bceSAndroid Build Coastguard Worker 
170*35238bceSAndroid Build Coastguard Worker /* Sanity */
171*35238bceSAndroid Build Coastguard Worker #if ((DE_CPU == DE_CPU_X86) || (DE_CPU == DE_CPU_X86_64)) && (DE_ENDIANNESS == DE_BIG_ENDIAN)
172*35238bceSAndroid Build Coastguard Worker #error Invalid x86(_64) endianness.
173*35238bceSAndroid Build Coastguard Worker #endif
174*35238bceSAndroid Build Coastguard Worker 
175*35238bceSAndroid Build Coastguard Worker /* Sized data types. */
176*35238bceSAndroid Build Coastguard Worker /* \note stddef.h is needed for size_t definition. */
177*35238bceSAndroid Build Coastguard Worker #include <stddef.h>
178*35238bceSAndroid Build Coastguard Worker #include <stdint.h>
179*35238bceSAndroid Build Coastguard Worker #include <stdbool.h>
180*35238bceSAndroid Build Coastguard Worker 
181*35238bceSAndroid Build Coastguard Worker #include "deDefs_kc_cts.h"
182*35238bceSAndroid Build Coastguard Worker 
183*35238bceSAndroid Build Coastguard Worker /* Null pointer. */
184*35238bceSAndroid Build Coastguard Worker #if defined(__cplusplus)
185*35238bceSAndroid Build Coastguard Worker #define DE_NULL 0
186*35238bceSAndroid Build Coastguard Worker #else
187*35238bceSAndroid Build Coastguard Worker #define DE_NULL ((void *)0) /*!< Null pointer.                              */
188*35238bceSAndroid Build Coastguard Worker #endif
189*35238bceSAndroid Build Coastguard Worker 
190*35238bceSAndroid Build Coastguard Worker /* Function pointer type. */
191*35238bceSAndroid Build Coastguard Worker typedef void (*deFunctionPtr)(void);
192*35238bceSAndroid Build Coastguard Worker 
193*35238bceSAndroid Build Coastguard Worker /* Use DE_PTR_TYPE(T) instead of T* in macros to avoid clang-tidy warning. */
194*35238bceSAndroid Build Coastguard Worker #define DE_PTR_TYPE(T) T * /* NOLINT(T) */
195*35238bceSAndroid Build Coastguard Worker 
196*35238bceSAndroid Build Coastguard Worker /* Debug macro. */
197*35238bceSAndroid Build Coastguard Worker #if defined(DE_DEBUG)
198*35238bceSAndroid Build Coastguard Worker /* Already defined from outside. */
199*35238bceSAndroid Build Coastguard Worker #else
200*35238bceSAndroid Build Coastguard Worker #if (DE_COMPILER != DE_COMPILER_GCC)
201*35238bceSAndroid Build Coastguard Worker #if defined(_DEBUG)
202*35238bceSAndroid Build Coastguard Worker #define DE_DEBUG /*!< Debug build enabled? Usage: #if defined(DE_DEBUG).    */
203*35238bceSAndroid Build Coastguard Worker #endif
204*35238bceSAndroid Build Coastguard Worker #elif (DE_COMPILER == DE_COMPILER_GCC) || (DE_COMPILER == DE_COMPILER_CLANG)
205*35238bceSAndroid Build Coastguard Worker #if !defined(NDEBUG)
206*35238bceSAndroid Build Coastguard Worker #define DE_DEBUG
207*35238bceSAndroid Build Coastguard Worker #endif
208*35238bceSAndroid Build Coastguard Worker #endif
209*35238bceSAndroid Build Coastguard Worker #endif
210*35238bceSAndroid Build Coastguard Worker 
211*35238bceSAndroid Build Coastguard Worker /* Inline. */
212*35238bceSAndroid Build Coastguard Worker #if (DE_COMPILER == DE_COMPILER_MSC)
213*35238bceSAndroid Build Coastguard Worker #define DE_INLINE __forceinline
214*35238bceSAndroid Build Coastguard Worker #elif (DE_COMPILER == DE_COMPILER_GCC) || (DE_COMPILER == DE_COMPILER_CLANG)
215*35238bceSAndroid Build Coastguard Worker #define DE_INLINE static __inline__
216*35238bceSAndroid Build Coastguard Worker #else
217*35238bceSAndroid Build Coastguard Worker #define DE_INLINE inline /*!< Function inline.        */
218*35238bceSAndroid Build Coastguard Worker #endif
219*35238bceSAndroid Build Coastguard Worker 
220*35238bceSAndroid Build Coastguard Worker /* DE_DEV_BUILD -- only define when building on a development machine. */
221*35238bceSAndroid Build Coastguard Worker #if !defined(DE_DEV_BUILD)
222*35238bceSAndroid Build Coastguard Worker #if (DE_COMPILER == DE_COMPILER_MSC)
223*35238bceSAndroid Build Coastguard Worker #define DE_DEV_BUILD
224*35238bceSAndroid Build Coastguard Worker #endif
225*35238bceSAndroid Build Coastguard Worker #endif
226*35238bceSAndroid Build Coastguard Worker 
227*35238bceSAndroid Build Coastguard Worker /* DE_VALGRIND_BUILD -- define this in makefile if support for Valgrind is wanted. */
228*35238bceSAndroid Build Coastguard Worker /*#define DE_VALGRIND_BUILD*/
229*35238bceSAndroid Build Coastguard Worker 
230*35238bceSAndroid Build Coastguard Worker /** Length of array. C++ version does compile time check that passed value is an array reference. */
231*35238bceSAndroid Build Coastguard Worker #if defined(__cplusplus)
232*35238bceSAndroid Build Coastguard Worker // deArraySizeHelper is a function that receives a reference to an array of N elements of type T and returns a reference to an
233*35238bceSAndroid Build Coastguard Worker // array of N chars. This forces the compiler to check the argument is an actual array and not some other type implementing
234*35238bceSAndroid Build Coastguard Worker // operator[]. The actual function is never defined anywhere, but taking the sizeof() of the result is allowed and equal to N.
235*35238bceSAndroid Build Coastguard Worker template <typename T, size_t N>
236*35238bceSAndroid Build Coastguard Worker char (&deArraySizeHelper(T (&array)[N]))[N];
237*35238bceSAndroid Build Coastguard Worker #define DE_LENGTH_OF_ARRAY(ARRAY) ((int)(sizeof(deArraySizeHelper(ARRAY))))
238*35238bceSAndroid Build Coastguard Worker #else
239*35238bceSAndroid Build Coastguard Worker #define DE_LENGTH_OF_ARRAY(ARRAY) ((int)(sizeof(ARRAY) / sizeof((ARRAY)[0])))
240*35238bceSAndroid Build Coastguard Worker #endif
241*35238bceSAndroid Build Coastguard Worker 
242*35238bceSAndroid Build Coastguard Worker #ifdef __cplusplus
243*35238bceSAndroid Build Coastguard Worker extern "C"
244*35238bceSAndroid Build Coastguard Worker {
245*35238bceSAndroid Build Coastguard Worker #endif
246*35238bceSAndroid Build Coastguard Worker 
247*35238bceSAndroid Build Coastguard Worker     /* Assertion macro family. */
248*35238bceSAndroid Build Coastguard Worker     void deAssertFail(const char *reason, const char *file, int line);
249*35238bceSAndroid Build Coastguard Worker 
250*35238bceSAndroid Build Coastguard Worker     /* Assertion failure callback. Requires DE_ASSERT_FAILURE_CALLBACK to be defined or otherwise has no effect. */
251*35238bceSAndroid Build Coastguard Worker     typedef void (*deAssertFailureCallbackFunc)(const char *reason, const char *file, int line);
252*35238bceSAndroid Build Coastguard Worker     void deSetAssertFailureCallback(deAssertFailureCallbackFunc callback);
253*35238bceSAndroid Build Coastguard Worker 
254*35238bceSAndroid Build Coastguard Worker /* Assertion macro. */
255*35238bceSAndroid Build Coastguard Worker #if defined(DE_DEBUG) && !defined(DE_COVERAGE_BUILD)
256*35238bceSAndroid Build Coastguard Worker #define DE_ASSERT(X)                              \
257*35238bceSAndroid Build Coastguard Worker     do                                            \
258*35238bceSAndroid Build Coastguard Worker     {                                             \
259*35238bceSAndroid Build Coastguard Worker         if (!(X))                                 \
260*35238bceSAndroid Build Coastguard Worker             deAssertFail(#X, __FILE__, __LINE__); \
261*35238bceSAndroid Build Coastguard Worker     } while (false)
262*35238bceSAndroid Build Coastguard Worker #else
263*35238bceSAndroid Build Coastguard Worker #define DE_ASSERT(X) /*@ -noeffect*/ ((void)0) /*!< Assertion macro. */
264*35238bceSAndroid Build Coastguard Worker #endif
265*35238bceSAndroid Build Coastguard Worker 
266*35238bceSAndroid Build Coastguard Worker /* Verify macro. Behaves like assert in debug build, but executes statement in release build. */
267*35238bceSAndroid Build Coastguard Worker #if defined(DE_DEBUG)
268*35238bceSAndroid Build Coastguard Worker #define DE_VERIFY(X)                              \
269*35238bceSAndroid Build Coastguard Worker     do                                            \
270*35238bceSAndroid Build Coastguard Worker     {                                             \
271*35238bceSAndroid Build Coastguard Worker         if (!(X))                                 \
272*35238bceSAndroid Build Coastguard Worker             deAssertFail(#X, __FILE__, __LINE__); \
273*35238bceSAndroid Build Coastguard Worker     } while (false)
274*35238bceSAndroid Build Coastguard Worker #else
275*35238bceSAndroid Build Coastguard Worker #define DE_VERIFY(X) X
276*35238bceSAndroid Build Coastguard Worker #endif
277*35238bceSAndroid Build Coastguard Worker 
278*35238bceSAndroid Build Coastguard Worker /* Fatal macro. */
279*35238bceSAndroid Build Coastguard Worker #if defined(DE_DEBUG) && !defined(DE_COVERAGE_BUILD)
280*35238bceSAndroid Build Coastguard Worker #define DE_FATAL(MSG)                                                           \
281*35238bceSAndroid Build Coastguard Worker     do                                                                          \
282*35238bceSAndroid Build Coastguard Worker     {                                                                           \
283*35238bceSAndroid Build Coastguard Worker         deAssertFail("" /* force to string literal */ MSG, __FILE__, __LINE__); \
284*35238bceSAndroid Build Coastguard Worker     } while (false)
285*35238bceSAndroid Build Coastguard Worker #else
286*35238bceSAndroid Build Coastguard Worker #define DE_FATAL(MSG) /*@ -noeffect*/ ((void)0) /*!< Fatal macro. */
287*35238bceSAndroid Build Coastguard Worker #endif
288*35238bceSAndroid Build Coastguard Worker 
289*35238bceSAndroid Build Coastguard Worker /** Test assert macro for use in testers (same as DE_ASSERT, but always enabled). */
290*35238bceSAndroid Build Coastguard Worker #define DE_TEST_ASSERT(X)                         \
291*35238bceSAndroid Build Coastguard Worker     do                                            \
292*35238bceSAndroid Build Coastguard Worker     {                                             \
293*35238bceSAndroid Build Coastguard Worker         if (!(X))                                 \
294*35238bceSAndroid Build Coastguard Worker             deAssertFail(#X, __FILE__, __LINE__); \
295*35238bceSAndroid Build Coastguard Worker     } while (false)
296*35238bceSAndroid Build Coastguard Worker 
297*35238bceSAndroid Build Coastguard Worker #if (DE_COMPILER == DE_COMPILER_GCC) || (DE_COMPILER == DE_COMPILER_CLANG)
298*35238bceSAndroid Build Coastguard Worker     /* GCC 4.8 and newer warns about unused typedefs. */
299*35238bceSAndroid Build Coastguard Worker #define DE_UNUSED_ATTR __attribute__((unused))
300*35238bceSAndroid Build Coastguard Worker #else
301*35238bceSAndroid Build Coastguard Worker #define DE_UNUSED_ATTR
302*35238bceSAndroid Build Coastguard Worker #endif
303*35238bceSAndroid Build Coastguard Worker 
304*35238bceSAndroid Build Coastguard Worker /** Compile-time assertion macro. */
305*35238bceSAndroid Build Coastguard Worker #define DE_STATIC_ASSERT(X) typedef char DE_UNIQUE_NAME[(X) ? 1 : -1] DE_UNUSED_ATTR
306*35238bceSAndroid Build Coastguard Worker 
307*35238bceSAndroid Build Coastguard Worker #define DE_UNIQUE_NAME DE_MAKE_NAME(__LINE__, hoax)
308*35238bceSAndroid Build Coastguard Worker #define DE_MAKE_NAME(line, token) DE_MAKE_NAME2(line, token)
309*35238bceSAndroid Build Coastguard Worker #define DE_MAKE_NAME2(line, token) _static_assert_##line##_##token
310*35238bceSAndroid Build Coastguard Worker 
311*35238bceSAndroid Build Coastguard Worker /** Software breakpoint. */
312*35238bceSAndroid Build Coastguard Worker #if (DE_CPU == DE_CPU_X86) && (DE_COMPILER == DE_COMPILER_MSC)
313*35238bceSAndroid Build Coastguard Worker #define DE_BREAKPOINT()                                                                 \
314*35238bceSAndroid Build Coastguard Worker     do                                                                                  \
315*35238bceSAndroid Build Coastguard Worker     {                                                                                   \
316*35238bceSAndroid Build Coastguard Worker         printf("Software breakpoint encountered in %s, line %d\n", __FILE__, __LINE__); \
317*35238bceSAndroid Build Coastguard Worker         __asm { int 3 }                                                                  \
318*35238bceSAndroid Build Coastguard Worker     } while (false)
319*35238bceSAndroid Build Coastguard Worker #elif (DE_CPU == DE_CPU_X86_64) && (DE_COMPILER == DE_COMPILER_MSC)
320*35238bceSAndroid Build Coastguard Worker #define DE_BREAKPOINT()                                                                 \
321*35238bceSAndroid Build Coastguard Worker     do                                                                                  \
322*35238bceSAndroid Build Coastguard Worker     {                                                                                   \
323*35238bceSAndroid Build Coastguard Worker         printf("Software breakpoint encountered in %s, line %d\n", __FILE__, __LINE__); \
324*35238bceSAndroid Build Coastguard Worker         __debugbreak();                                                                 \
325*35238bceSAndroid Build Coastguard Worker     } while (false)
326*35238bceSAndroid Build Coastguard Worker #elif (DE_CPU == DE_CPU_ARM) && (DE_COMPILER == DE_COMPILER_GCC)
327*35238bceSAndroid Build Coastguard Worker #define DE_BREAKPOINT()                                                                 \
328*35238bceSAndroid Build Coastguard Worker     do                                                                                  \
329*35238bceSAndroid Build Coastguard Worker     {                                                                                   \
330*35238bceSAndroid Build Coastguard Worker         printf("Software breakpoint encountered in %s, line %d\n", __FILE__, __LINE__); \
331*35238bceSAndroid Build Coastguard Worker         __asm__ __volatile__("bkpt #3");                                                \
332*35238bceSAndroid Build Coastguard Worker     } while (false)
333*35238bceSAndroid Build Coastguard Worker #elif (DE_CPU == DE_CPU_ARM_64) && (DE_COMPILER == DE_COMPILER_GCC)
334*35238bceSAndroid Build Coastguard Worker #define DE_BREAKPOINT()                                                                 \
335*35238bceSAndroid Build Coastguard Worker     do                                                                                  \
336*35238bceSAndroid Build Coastguard Worker     {                                                                                   \
337*35238bceSAndroid Build Coastguard Worker         printf("Software breakpoint encountered in %s, line %d\n", __FILE__, __LINE__); \
338*35238bceSAndroid Build Coastguard Worker         __asm__ __volatile__("brk #3");                                                 \
339*35238bceSAndroid Build Coastguard Worker     } while (false)
340*35238bceSAndroid Build Coastguard Worker #elif ((DE_CPU == DE_CPU_ARM) || (DE_CPU == DE_CPU_ARM_64)) && (DE_COMPILER == DE_COMPILER_MSC)
341*35238bceSAndroid Build Coastguard Worker #define DE_BREAKPOINT()                                                                 \
342*35238bceSAndroid Build Coastguard Worker     do                                                                                  \
343*35238bceSAndroid Build Coastguard Worker     {                                                                                   \
344*35238bceSAndroid Build Coastguard Worker         printf("Software breakpoint encountered in %s, line %d\n", __FILE__, __LINE__); \
345*35238bceSAndroid Build Coastguard Worker         DebugBreak();                                                                   \
346*35238bceSAndroid Build Coastguard Worker     } while (false)
347*35238bceSAndroid Build Coastguard Worker #else
348*35238bceSAndroid Build Coastguard Worker #define DE_BREAKPOINT() DE_FATAL("Software breakpoint encountered!")
349*35238bceSAndroid Build Coastguard Worker #endif
350*35238bceSAndroid Build Coastguard Worker 
351*35238bceSAndroid Build Coastguard Worker /** Swap two values. */
352*35238bceSAndroid Build Coastguard Worker #define DE_SWAP(TYPE, A, B) \
353*35238bceSAndroid Build Coastguard Worker     do                      \
354*35238bceSAndroid Build Coastguard Worker     {                       \
355*35238bceSAndroid Build Coastguard Worker         TYPE _tmp_ = (A);   \
356*35238bceSAndroid Build Coastguard Worker         (A)        = (B);   \
357*35238bceSAndroid Build Coastguard Worker         (B)        = _tmp_; \
358*35238bceSAndroid Build Coastguard Worker     } while (false)
359*35238bceSAndroid Build Coastguard Worker 
360*35238bceSAndroid Build Coastguard Worker /** Used in enum to easify declarations for struct serialization. Declares 'NAME'_OFFSET, 'NAME'_SIZE, and offsets counter for next enum value by SIZE. */
361*35238bceSAndroid Build Coastguard Worker #define DE_SERIALIZED_FIELD(NAME, SIZE) NAME##_OFFSET, NAME##_SIZE = (SIZE), _DE_TMP_##NAME = NAME##_OFFSET + (SIZE)-1
362*35238bceSAndroid Build Coastguard Worker 
363*35238bceSAndroid Build Coastguard Worker /* Pointer size. */
364*35238bceSAndroid Build Coastguard Worker #if defined(DE_PTR_SIZE)
365*35238bceSAndroid Build Coastguard Worker     /* nada */
366*35238bceSAndroid Build Coastguard Worker #elif defined(_M_X64) || defined(__x86_64__) || defined(__amd64__) || defined(__aarch64__) || \
367*35238bceSAndroid Build Coastguard Worker     (defined(__mips) && ((__mips) == 64)) || defined(_LP64) || defined(__LP64__)
368*35238bceSAndroid Build Coastguard Worker #define DE_PTR_SIZE 8
369*35238bceSAndroid Build Coastguard Worker #else
370*35238bceSAndroid Build Coastguard Worker #define DE_PTR_SIZE 4 /* default to 32-bit */
371*35238bceSAndroid Build Coastguard Worker #endif
372*35238bceSAndroid Build Coastguard Worker 
373*35238bceSAndroid Build Coastguard Worker /* Floating-point environment flag. */
374*35238bceSAndroid Build Coastguard Worker #if defined(DE_FENV_ACCESS_ON)
375*35238bceSAndroid Build Coastguard Worker     /* Already defined */
376*35238bceSAndroid Build Coastguard Worker #elif (DE_COMPILER == DE_COMPILER_CLANG) && (DE_CPU == DE_CPU_ARM)
377*35238bceSAndroid Build Coastguard Worker // FENV_ACCESS is not supported, disable all optimizations to avoid incorrect fp operation ordering
378*35238bceSAndroid Build Coastguard Worker // Google Bug: b/298204279
379*35238bceSAndroid Build Coastguard Worker #define DE_FENV_ACCESS_ON _Pragma("clang optimize off")
380*35238bceSAndroid Build Coastguard Worker #elif (DE_COMPILER == DE_COMPILER_CLANG) && (DE_CPU != DE_CPU_ARM)
381*35238bceSAndroid Build Coastguard Worker #define DE_FENV_ACCESS_ON _Pragma("STDC FENV_ACCESS ON")
382*35238bceSAndroid Build Coastguard Worker #elif (DE_COMPILER == DE_COMPILER_MSC)
383*35238bceSAndroid Build Coastguard Worker #define DE_FENV_ACCESS_ON __pragma(fenv_access(on))
384*35238bceSAndroid Build Coastguard Worker #else
385*35238bceSAndroid Build Coastguard Worker #define DE_FENV_ACCESS_ON /* not supported */
386*35238bceSAndroid Build Coastguard Worker #endif
387*35238bceSAndroid Build Coastguard Worker 
388*35238bceSAndroid Build Coastguard Worker /** Unreferenced variable silencing. */
389*35238bceSAndroid Build Coastguard Worker #define DE_UNREF(VAR) ((void)(VAR))
390*35238bceSAndroid Build Coastguard Worker 
391*35238bceSAndroid Build Coastguard Worker /** DE_BEGIN_EXTERN_C and DE_END_EXTERN_C. */
392*35238bceSAndroid Build Coastguard Worker #if defined(__cplusplus)
393*35238bceSAndroid Build Coastguard Worker #define DE_BEGIN_EXTERN_C \
394*35238bceSAndroid Build Coastguard Worker     extern "C"            \
395*35238bceSAndroid Build Coastguard Worker     {
396*35238bceSAndroid Build Coastguard Worker #define DE_END_EXTERN_C }
397*35238bceSAndroid Build Coastguard Worker #else
398*35238bceSAndroid Build Coastguard Worker #define DE_BEGIN_EXTERN_C
399*35238bceSAndroid Build Coastguard Worker #define DE_END_EXTERN_C
400*35238bceSAndroid Build Coastguard Worker #endif
401*35238bceSAndroid Build Coastguard Worker 
402*35238bceSAndroid Build Coastguard Worker /** DE_NULL_STATEMENT */
403*35238bceSAndroid Build Coastguard Worker #if defined(DE_DEBUG)
404*35238bceSAndroid Build Coastguard Worker #define DE_NULL_STATEMENT \
405*35238bceSAndroid Build Coastguard Worker     do                    \
406*35238bceSAndroid Build Coastguard Worker     {                     \
407*35238bceSAndroid Build Coastguard Worker     } while (false)
408*35238bceSAndroid Build Coastguard Worker #else
409*35238bceSAndroid Build Coastguard Worker #define DE_NULL_STATEMENT (void)0
410*35238bceSAndroid Build Coastguard Worker #endif
411*35238bceSAndroid Build Coastguard Worker 
412*35238bceSAndroid Build Coastguard Worker /** GCC format string attributes */
413*35238bceSAndroid Build Coastguard Worker #if (DE_COMPILER == DE_COMPILER_GCC) || (DE_COMPILER == DE_COMPILER_CLANG)
414*35238bceSAndroid Build Coastguard Worker #define DE_PRINTF_FUNC_ATTR(FORMAT_STRING, FIRST_ARG) __attribute__((format(printf, FORMAT_STRING, FIRST_ARG)))
415*35238bceSAndroid Build Coastguard Worker #else
416*35238bceSAndroid Build Coastguard Worker #define DE_PRINTF_FUNC_ATTR(FORMAT_STRING, FIRST_ARG)
417*35238bceSAndroid Build Coastguard Worker #endif
418*35238bceSAndroid Build Coastguard Worker 
419*35238bceSAndroid Build Coastguard Worker /** Potentially unused func attribute to silence warnings from C templates. */
420*35238bceSAndroid Build Coastguard Worker #if (DE_COMPILER == DE_COMPILER_GCC) || (DE_COMPILER == DE_COMPILER_CLANG)
421*35238bceSAndroid Build Coastguard Worker #define DE_UNUSED_FUNCTION __attribute__((unused))
422*35238bceSAndroid Build Coastguard Worker #else
423*35238bceSAndroid Build Coastguard Worker #define DE_UNUSED_FUNCTION
424*35238bceSAndroid Build Coastguard Worker #endif
425*35238bceSAndroid Build Coastguard Worker 
426*35238bceSAndroid Build Coastguard Worker #if (DE_COMPILER == DE_COMPILER_MSC)
427*35238bceSAndroid Build Coastguard Worker #define DE_PACKED(...) __pragma(pack(push, 1)) typedef struct __VA_ARGS__ __pragma(pack(pop))
428*35238bceSAndroid Build Coastguard Worker #elif (DE_COMPILER == DE_COMPILER_GCC) || (DE_COMPILER == DE_COMPILER_CLANG)
429*35238bceSAndroid Build Coastguard Worker #define DE_PACKED(...) typedef struct __attribute__((__packed__)) __VA_ARGS__
430*35238bceSAndroid Build Coastguard Worker #else
431*35238bceSAndroid Build Coastguard Worker #define DE_PACKED
432*35238bceSAndroid Build Coastguard Worker #endif
433*35238bceSAndroid Build Coastguard Worker 
deFatalStr(const char * reason)434*35238bceSAndroid Build Coastguard Worker     DE_INLINE const char *deFatalStr(const char *reason)
435*35238bceSAndroid Build Coastguard Worker     {
436*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(0);
437*35238bceSAndroid Build Coastguard Worker         return reason;
438*35238bceSAndroid Build Coastguard Worker     }
439*35238bceSAndroid Build Coastguard Worker 
440*35238bceSAndroid Build Coastguard Worker #ifdef __cplusplus
441*35238bceSAndroid Build Coastguard Worker }
442*35238bceSAndroid Build Coastguard Worker #endif
443*35238bceSAndroid Build Coastguard Worker 
444*35238bceSAndroid Build Coastguard Worker #endif /* _DEDEFS_H */
445