diff --git a/source/crisscross/cc_attr.h b/source/crisscross/cc_attr.h index 5ea6028..0a9c69d 100644 --- a/source/crisscross/cc_attr.h +++ b/source/crisscross/cc_attr.h @@ -12,23 +12,15 @@ #ifndef __included_cc_cc_attr_h #define __included_cc_cc_attr_h -#if __GNUC__ >= 3 +#if defined(__GNUC__) && __GNUC__ >= 3 #ifndef __pure #define __pure __attribute__ ((pure)) #endif -/* - GCC 3.x doesn't like to inline some of the things that - we use __forceinline on. - */ -#if __GNUC__ > 3 #ifndef __forceinline #define __forceinline __attribute__ ((always_inline)) #endif -#else -#define __forceinline inline -#endif #ifndef __noreturn #define __noreturn __attribute__ ((noreturn)) @@ -66,21 +58,64 @@ #define unlikely(x) __builtin_expect(!!(x), 0) #endif -#else +#define assume(x) do { if (!(x)) __builtin_unreachable(); } while (0) + +#elif defined(_MSC_VER) + +#define assume(x) __assume(x) +#endif + +#ifndef __pure #define __pure +#endif + +#ifndef __const #define __const +#endif + +#ifndef __forceinline #define __forceinline inline +#endif + +#ifndef __noreturn #define __noreturn +#endif + +#ifndef __malloc #define __malloc +#endif + +#ifndef __must_check #define __must_check +#endif + +#ifndef __deprecated #define __deprecated +#endif + +#ifndef __used #define __used +#endif + +#ifndef __unused_param #define __unused_param +#endif + +#ifndef __packed #define __packed +#endif + +#ifndef likely #define likely(x) (x) +#endif + +#ifndef unlikely #define unlikely(x) (x) +#endif +#ifndef assume +#define assume(x) #endif #endif