X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib%2Fcompiler.h;h=4bd92d78dee0bffcade4ff5b8247ef7f63094737;hp=78a7bef5b6a33adddce01fb336170ca39cdda8bd;hb=af795d1f88e9d8f1fad0613eac93c6775b4f6735;hpb=768d53aa2bde3b39dfa85fe0dd940d67ae97d5ef diff --git a/include/wimlib/compiler.h b/include/wimlib/compiler.h index 78a7bef5..4bd92d78 100644 --- a/include/wimlib/compiler.h +++ b/include/wimlib/compiler.h @@ -1,37 +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))) -# define likely(x) __builtin_expect(!!(x), 1) -# define unlikely(x) __builtin_expect(!!(x), 0) +# 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) -# define likely(x) (x) -# define unlikely(x) (x) -#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 */