X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=include%2Fplatform.h;h=51934853b777106c48fc87e2d9785663df631ed2;hb=0b6c6a9c9f555a33d681290cce77510460457c03;hp=ad3cc93328cc5a0f7d60be256680ce8949bf27d8;hpb=ac678ec2f127fc02a93fff2c164e0b13a94a6abf;p=oweals%2Fbusybox.git diff --git a/include/platform.h b/include/platform.h index ad3cc9332..51934853b 100644 --- a/include/platform.h +++ b/include/platform.h @@ -52,20 +52,32 @@ # define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) # define ATTRIBUTE_PACKED __attribute__ ((__packed__)) # define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m))) -# if __GNUC_PREREQ (3,0) -# define ATTRIBUTE_ALWAYS_INLINE __attribute__ ((always_inline)) inline -# define ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__)) +/* __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 # else -# define ATTRIBUTE_ALWAYS_INLINE inline +# 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 ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((__externally_visible__)) +# define EXTERNALLY_VISIBLE __attribute__(( visibility("default") )); +//__attribute__ ((__externally_visible__)) # else -# define ATTRIBUTE_EXTERNALLY_VISIBLE +# define EXTERNALLY_VISIBLE # endif /* GNUC >= 4.1 */ /* We use __extension__ in some places to suppress -pedantic warnings @@ -126,29 +138,29 @@ /* ---- 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)) @@ -162,7 +174,7 @@ __extension__ typedef unsigned long long __u64; # error "Sorry, this libc version is not supported :(" #endif -// Don't perpetuate e2fsck crap into the headers. Clean up e2fsck instead. +/* Don't perpetuate e2fsck crap into the headers. Clean up e2fsck instead. */ #if defined __GLIBC__ || defined __UCLIBC__ \ || defined __dietlibc__ || defined _NEWLIB_VERSION @@ -170,7 +182,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; @@ -203,15 +215,25 @@ typedef unsigned smalluint; #include #endif +/* Try to defeat gcc's alignment of "char message[]"-like data */ +#if 1 /* if needed: !defined(arch1) && !defined(arch2) */ +#define ALIGN1 __attribute__((aligned(1))) +#define ALIGN2 __attribute__((aligned(2))) +#else +/* Arches which MUST have 2 or 4 byte alignment for everything are here */ +#define ALIGN1 +#define ALIGN2 +#endif + /* 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 defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \ - __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__ +#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__ @@ -234,7 +256,7 @@ typedef unsigned smalluint; #endif #if defined(__dietlibc__) -static ATTRIBUTE_ALWAYS_INLINE char* strchrnul(const char *s, char c) +static ALWAYS_INLINE char* strchrnul(const char *s, char c) { while (*s && *s != c) ++s; return (char*)s; @@ -247,12 +269,6 @@ static ATTRIBUTE_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 @@ -282,7 +298,7 @@ static ATTRIBUTE_ALWAYS_INLINE char* strchrnul(const char *s, char c) #if defined(__linux__) #include -// Make sure we have all the new mount flags we actually try to use. +/* Make sure we have all the new mount flags we actually try to use. */ #ifndef MS_BIND #define MS_BIND (1<<12) #endif @@ -296,7 +312,7 @@ static ATTRIBUTE_ALWAYS_INLINE char* strchrnul(const char *s, char c) #define MS_SILENT (1<<15) #endif -// The shared subtree stuff, which went in around 2.6.15 +/* The shared subtree stuff, which went in around 2.6.15. */ #ifndef MS_UNBINDABLE #define MS_UNBINDABLE (1<<17) #endif