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