X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=include%2Fplatform.h;h=8d6ed9a3e4166a9a743a01caaa2393483dc03b87;hb=defc1ea34074e7882724c460260d307cdf981a70;hp=4c38c6ae4675ef96fe817b32ef12e04578401d3b;hpb=d2c450ce811454fb77679d049538530d2cf54dd8;p=oweals%2Fbusybox.git diff --git a/include/platform.h b/include/platform.h index 4c38c6ae4..8d6ed9a3e 100644 --- a/include/platform.h +++ b/include/platform.h @@ -17,7 +17,7 @@ #endif /* __restrict is known in EGCS 1.2 and above. */ -#if !__GNUC_PREREQ (2,92) +#if !__GNUC_PREREQ(2,92) # ifndef __restrict # define __restrict /* Ignore */ # endif @@ -27,7 +27,7 @@ macros freely, and know that they will come into play for the version of gcc in which they are supported. */ -#if !__GNUC_PREREQ (2,7) +#if !__GNUC_PREREQ(2,7) # ifndef __attribute__ # define __attribute__(x) # endif @@ -37,7 +37,7 @@ #if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L /* it's a keyword */ #else -# if __GNUC_PREREQ (2,7) +# if __GNUC_PREREQ(2,7) # define inline __inline__ # else # define inline @@ -48,54 +48,62 @@ # define __const const #endif -# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) -# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) -# define ATTRIBUTE_PACKED __attribute__ ((__packed__)) -# define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m))) -# if __GNUC_PREREQ (3,0) -# define ALWAYS_INLINE __attribute__ ((always_inline)) inline +#define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +#define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) +#define ATTRIBUTE_PACKED __attribute__ ((__packed__)) +#define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m))) +/* __NO_INLINE__: some gcc's do not honor inlining! :( */ +#if __GNUC_PREREQ(3,0) && !defined(__NO_INLINE__) +# define ALWAYS_INLINE __attribute__ ((always_inline)) inline /* I've seen a toolchain where I needed __noinline__ instead of noinline */ -# define NOINLINE __attribute__((__noinline__)) -# if !ENABLE_WERROR -# define ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__)) -# define ATTRIBUTE_UNUSED_RESULT __attribute__ ((warn_unused_result)) -# else -# define ATTRIBUTE_DEPRECATED /* n/a */ -# define ATTRIBUTE_UNUSED_RESULT /* n/a */ -# endif +# define NOINLINE __attribute__((__noinline__)) +# if !ENABLE_WERROR +# define ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__)) +# define ATTRIBUTE_UNUSED_RESULT __attribute__ ((warn_unused_result)) # else -# define ALWAYS_INLINE inline /* n/a */ -# define NOINLINE /* n/a */ # define ATTRIBUTE_DEPRECATED /* n/a */ # define ATTRIBUTE_UNUSED_RESULT /* n/a */ # endif +#else +# define ALWAYS_INLINE inline /* n/a */ +# define NOINLINE /* n/a */ +# define ATTRIBUTE_DEPRECATED /* n/a */ +# define ATTRIBUTE_UNUSED_RESULT /* n/a */ +#endif /* -fwhole-program makes all symbols local. The attribute externally_visible forces a symbol global. */ -# if __GNUC_PREREQ (4,1) -# define EXTERNALLY_VISIBLE __attribute__(( visibility("default") )); +#if __GNUC_PREREQ(4,1) +# define EXTERNALLY_VISIBLE __attribute__(( visibility("default") )) //__attribute__ ((__externally_visible__)) -# else -# define EXTERNALLY_VISIBLE -# endif /* GNUC >= 4.1 */ +#else +# define EXTERNALLY_VISIBLE +#endif /* GNUC >= 4.1 */ /* We use __extension__ in some places to suppress -pedantic warnings about GCC extensions. This feature didn't work properly before gcc 2.8. */ -#if !__GNUC_PREREQ (2,8) +#if !__GNUC_PREREQ(2,8) # ifndef __extension__ # define __extension__ # endif #endif /* gcc-2.95 had no va_copy but only __va_copy. */ -#if !__GNUC_PREREQ (3,0) +#if !__GNUC_PREREQ(3,0) # include # if !defined va_copy && defined __va_copy # define va_copy(d,s) __va_copy((d),(s)) # endif #endif +#if __GNUC_PREREQ(3,0) && defined(i386) +/* || defined(__x86_64__)? */ +# define FAST_FUNC __attribute__((regparm(3))) +#else +# define FAST_FUNC +#endif + /* ---- Endian Detection ------------------------------------ */ #if (defined __digital__ && defined __unix__) @@ -134,37 +142,50 @@ #define SWAP_LE64(x) (x) #endif +/* ---- Unaligned access ------------------------------------ */ + +/* parameter is supposed to be an uint32_t* ptr */ +#if defined(i386) || defined(__x86_64__) /* + other arches? */ +#define get_unaligned_u32p(u32p) (*(u32p)) +#else +/* performs reasonably well (gcc usually inlines memcpy here) */ +#define get_unaligned_u32p(u32p) ({ uint32_t __t; memcpy(&__t, (u32p), 4); __t; }) +#endif + /* ---- Networking ------------------------------------------ */ + #ifndef __APPLE__ # include +# ifndef __socklen_t_defined +typedef int socklen_t; +# endif #else # include #endif -#ifndef __socklen_t_defined -typedef int socklen_t; -#endif - /* ---- Compiler dependent settings ------------------------- */ -#if (defined __digital__ && defined __unix__) + +#if (defined __digital__ && defined __unix__) || defined __APPLE__ # undef HAVE_MNTENT_H +# undef HAVE_SYS_STATFS_H #else # define HAVE_MNTENT_H 1 +# define HAVE_SYS_STATFS_H 1 #endif /* ___digital__ && __unix__ */ /* linux/loop.h relies on __u64. Make sure we have that as a proper type * until userspace is widely fixed. */ -#ifndef __GNUC__ -#if defined __INTEL_COMPILER +#if (defined __INTEL_COMPILER && !defined __GNUC__) || \ + (defined __GNUC__ && defined __STRICT_ANSI__) __extension__ typedef __signed__ long long __s64; __extension__ typedef unsigned long long __u64; -#endif /* __INTEL_COMPILER */ -#endif /* ifndef __GNUC__ */ +#endif /*----- Kernel versioning ------------------------------------*/ + #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) -/* ---- miscellaneous --------------------------------------- */ +/* ---- Miscellaneous --------------------------------------- */ #if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \ !defined(__dietlibc__) && \ @@ -181,7 +202,7 @@ __extension__ typedef unsigned long long __u64; #define HAVE_FEATURES_H #include #define HAVE_STDINT_H -#else +#elif !defined __APPLE__ /* Largest integral types. */ #if __BIG_ENDIAN__ typedef long intmax_t; @@ -228,19 +249,16 @@ typedef unsigned smalluint; /* uclibc does not implement daemon() for no-mmu systems. * For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably. * For earlier versions there is no reliable way to check if we are building - * for a mmu-less system; the user should pass EXTRA_CFLAGS="-DBB_NOMMU" - * on his own. + * for a mmu-less system. */ #if ENABLE_NOMMU || \ (defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \ __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__) #define BB_MMU 0 -#define BB_NOMMU 1 #define USE_FOR_NOMMU(...) __VA_ARGS__ #define USE_FOR_MMU(...) #else #define BB_MMU 1 -/* BB_NOMMU is not defined in this case! */ #define USE_FOR_NOMMU(...) #define USE_FOR_MMU(...) __VA_ARGS__ #endif @@ -269,12 +287,6 @@ static ALWAYS_INLINE char* strchrnul(const char *s, char c) # define lchown chown #endif -/* THIS SHOULD BE CLEANED OUT OF THE TREE ENTIRELY */ -/* FIXME: fix tar.c! */ -#ifndef FNM_LEADING_DIR -#define FNM_LEADING_DIR 0 -#endif - #if (defined __digital__ && defined __unix__) #include #define HAVE_STANDARDS_H