diff options
Diffstat (limited to 'src/util/compiler.h')
-rw-r--r-- | src/util/compiler.h | 65 |
1 files changed, 50 insertions, 15 deletions
diff --git a/src/util/compiler.h b/src/util/compiler.h index da602cfa33d..ddd4cfb836b 100644 --- a/src/util/compiler.h +++ b/src/util/compiler.h @@ -35,40 +35,49 @@ #include <assert.h> - +#include <limits.h> +#include <stdarg.h> +#include <stdbool.h> +#include <stddef.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> + +#include "util/detect.h" #include "util/macros.h" -#include "c99_compat.h" /* inline, __func__, etc. */ - - /** - * Either define MESA_BIG_ENDIAN or MESA_LITTLE_ENDIAN, and CPU_TO_LE32. + * Define CPU_TO_LE32 * Do not use these unless absolutely necessary! * Try to use a runtime test instead. * For now, only used by some DRI hardware drivers for color/texel packing. */ -#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN +#if UTIL_ARCH_BIG_ENDIAN #if defined(__linux__) #include <byteswap.h> -#define CPU_TO_LE32( x ) bswap_32( x ) +#define CPU_TO_LE32( x ) bswap_32( x ) #elif defined(__APPLE__) #include <CoreFoundation/CFByteOrder.h> -#define CPU_TO_LE32( x ) CFSwapInt32HostToLittle( x ) +#define CPU_TO_LE32( x ) CFSwapInt32HostToLittle( x ) #elif defined(__OpenBSD__) #include <sys/types.h> -#define CPU_TO_LE32( x ) htole32( x ) +#define CPU_TO_LE32( x ) htole32( x ) #else /*__linux__ */ #include <sys/endian.h> -#define CPU_TO_LE32( x ) bswap32( x ) +#define CPU_TO_LE32( x ) bswap32( x ) #endif /*__linux__*/ -#define MESA_BIG_ENDIAN 1 #else -#define CPU_TO_LE32( x ) ( x ) -#define MESA_LITTLE_ENDIAN 1 +#define CPU_TO_LE32( x ) ( x ) #endif -#define LE32_TO_CPU( x ) CPU_TO_LE32( x ) +#define LE32_TO_CPU( x ) CPU_TO_LE32( x ) +/* Macro for stack alignment. */ +#if defined(__GNUC__) && DETECT_ARCH_X86 +#define UTIL_ALIGN_STACK __attribute__((force_align_arg_pointer)) +#else +#define UTIL_ALIGN_STACK +#endif #define IEEE_ONE 0x3f800000 @@ -76,9 +85,21 @@ # define __has_attribute(x) 0 #endif -#if __cplusplus >= 201703L || __STDC_VERSION__ > 201710L +#if defined(__has_cpp_attribute) && defined(__clang__) +/* We do not do the same trick as __has_attribute because parsing + * clang::fallthrough in the preprocessor fails in GCC. */ +# define HAS_CLANG_FALLTHROUGH __has_cpp_attribute(clang::fallthrough) +#else +# define HAS_CLANG_FALLTHROUGH 0 +#endif + +#if (defined(__cplusplus) && (__cplusplus >= 201703L)) || \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L)) /* Standard C++17/C23 attribute */ #define FALLTHROUGH [[fallthrough]] +#elif HAS_CLANG_FALLTHROUGH +/* Clang++ specific */ +#define FALLTHROUGH [[clang::fallthrough]] #elif __has_attribute(fallthrough) /* Non-standard but supported by at least gcc and clang */ #define FALLTHROUGH __attribute__((fallthrough)) @@ -86,4 +107,18 @@ #define FALLTHROUGH do { } while(0) #endif +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(__HAIKU__) && !defined(__USE_MISC) +#if !DETECT_OS_ANDROID +typedef unsigned int uint; +#endif +#endif + +#if defined(__cplusplus) +} +#endif + #endif /* COMPILER_H */ |