summaryrefslogtreecommitdiff
path: root/src/util/compiler.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/compiler.h')
-rw-r--r--src/util/compiler.h65
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 */