X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib%2Fcompiler.h;h=5327318832f3c7ffb6dd9484117e73f9333a9f75;hp=d32d092b964dfda938aa82cd4343edb085e9e103;hb=a8343baff22193be4651a3a63b07cb1520ced4e8;hpb=047d0a95f3968037834af5dff0d79c1192626025 diff --git a/include/wimlib/compiler.h b/include/wimlib/compiler.h index d32d092b..53273188 100644 --- a/include/wimlib/compiler.h +++ b/include/wimlib/compiler.h @@ -1,38 +1,100 @@ +/* + * 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) -# define inline inline __attribute__((always_inline)) +# include "wimlib/compiler-gcc.h" +#else +# 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 + +/* Same as 'noinline', but 'noinline_for_stack' documents that 'noinline' is + * being used to prevent the annotated function from being inlined into a + * recursive function and increasing its stack usage. */ +#define noinline_for_stack noinline + +#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 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__ */ +# 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 */