]> wimlib.net Git - wimlib/blobdiff - include/wimlib/compiler.h
Adjust endianness detection
[wimlib] / include / wimlib / compiler.h
index 19a9ebe70c6763cd9efb91242487a80eb45dd78d..4bd92d78dee0bffcade4ff5b8247ef7f63094737 100644 (file)
@@ -1,33 +1,95 @@
+/*
+ * compiler.h
+ *
+ * The author dedicates this file to the public domain.
+ * You can do whatever you want with this file.
+ */
+
 #ifndef _WIMLIB_COMPILER_H
 #define _WIMLIB_COMPILER_H
 
 #ifdef __GNUC__
-#      if defined(__CYGWIN__) || defined(__WIN32__)
-#              define WIMLIBAPI __declspec(dllexport)
-#      else
-#              define WIMLIBAPI __attribute__((visibility("default")))
-#      endif
-#      define _always_inline_attribute inline __attribute__((always_inline))
-#      define _packed_attribute __attribute__((packed))
-#      define _format_attribute(type, format_str, args_start) \
-                       /*__attribute__((format(type, format_str, args_start))) */
-#      if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
-#              define _cold_attribute     __attribute__((cold))
-#      else
-#              define _cold_attribute
-#      endif
-#      define _malloc_attribute __attribute__((malloc))
-#      define _warn_unused_result_attribute __attribute__((warn_unused_result))
-#      define _aligned_attribute(size) __attribute__((aligned(size)))
+#  include "wimlib/compiler-gcc.h"
 #else
-#      define WIMLIBAPI
-#      define _always_inline_attribute inline
-#      define _format_attribute(type, format_str, args_start)
-#      define _cold_attribute
-#      define _packed_attribute
-#      define _malloc_attribute
-#      define _warn_unused_result_attribute
-#      define _aligned_attribute(size)
-#endif /* __GNUC__ */
+#  error "Unrecognized compiler.  Please add a header file for your compiler."
+#endif
+
+#ifndef WIMLIBAPI
+#  define WIMLIBAPI
+#endif
+
+#ifndef _packed_attribute
+#  error "missing required definition of _packed_attribute"
+#endif
+
+#ifndef _aligned_attribute
+#  error "missing required definition of _aligned_attribute"
+#endif
+
+#ifndef _may_alias_attribute
+#  error "missing required definition of _may_alias_attribute"
+#endif
+
+#ifndef likely
+#  define likely(expr)         (expr)
+#endif
+
+#ifndef unlikely
+#  define unlikely(expr)       (expr)
+#endif
+
+#ifndef prefetch
+#  define prefetch(addr)
+#endif
+
+#ifndef _cold_attribute
+#  define _cold_attribute
+#endif
+
+#ifndef _malloc_attribute
+#  define _malloc_attribute
+#endif
+
+#ifndef _format_attribute
+#  define _format_attribute(type, format_str, format_start)
+#endif
+
+#ifndef noinline
+#  define noinline
+#endif
+
+#ifndef CPU_IS_BIG_ENDIAN
+#  error "missing required endianness definition"
+#endif
+
+#define CPU_IS_LITTLE_ENDIAN (!CPU_IS_BIG_ENDIAN)
+
+#ifndef UNALIGNED_ACCESS_SPEED
+#  define UNALIGNED_ACCESS_SPEED 0
+#endif
+
+#define UNALIGNED_ACCESS_IS_ALLOWED    (UNALIGNED_ACCESS_SPEED >= 1)
+#define UNALIGNED_ACCESS_IS_FAST       (UNALIGNED_ACCESS_SPEED >= 2)
+#define UNALIGNED_ACCESS_IS_VERY_FAST  (UNALIGNED_ACCESS_SPEED >= 3)
+
+#ifndef typeof
+#  error "missing required definition of typeof"
+#endif
+
+#if !defined(min) || !defined(max) || !defined(swap)
+#  error "missing required definitions of min(), max(), and swap() macros"
+#endif
+
+#ifdef __CHECKER__
+#  define _bitwise_attr        __attribute__((bitwise))
+#  define _force_attr  __attribute__((force))
+#else
+#  define _bitwise_attr
+#  define _force_attr
+#endif
+
+#ifndef BUILD_BUG_ON
+#  define BUILD_BUG_ON(expr)   ((void)sizeof(char[1 - 2*!!(expr)]))
+#endif
 
 #endif /* _WIMLIB_COMPILER_H */