diff options
author | Thorsten Glaser <tg@mirbsd.org> | 2012-05-15 16:30:19 +0000 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2012-05-15 11:33:07 -0700 |
commit | 7e911e43f51feb1a0255efaea3aa3bcb79adbede (patch) | |
tree | 1a9ec4e9e7c71ed3f4c5ba1bdefb74d25ac646dd | |
parent | 87259a8dd521fafff32734c5d844b7dd21859eb0 (diff) | |
download | klibc-7e911e43f51feb1a0255efaea3aa3bcb79adbede.tar.gz |
[klibc] Use GCC definitions for size_t, ssize_t, ptrdiff_t
Fall back to (unsigned) long if klibc userspace applications are
compiled with something that is not GCC or close enough to also
define its __SIZE_TYPE__ and __PTRDIFF_TYPE__ macros.
Change the definition of ssize_t to be decoupled from ptrdiff_t
and be derived from __SIZE_TYPE__ instead, dropping the unsigned.
Signed-off-by: Thorsten Glaser <tg@mirbsd.org>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
-rw-r--r-- | usr/include/bits32/bitsize/stddef.h | 18 | ||||
-rw-r--r-- | usr/include/bits64/bitsize/stddef.h | 13 | ||||
-rw-r--r-- | usr/include/stddef.h | 24 | ||||
-rw-r--r-- | usr/include/sys/types.h | 20 |
4 files changed, 27 insertions, 48 deletions
diff --git a/usr/include/bits32/bitsize/stddef.h b/usr/include/bits32/bitsize/stddef.h deleted file mode 100644 index 43d733cad8475..0000000000000 --- a/usr/include/bits32/bitsize/stddef.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * bits32/stddef.h - */ - -#ifndef _BITSIZE_STDDEF_H -#define _BITSIZE_STDDEF_H - -#define _SIZE_T -#if defined(__s390__) || defined(__cris__) -typedef unsigned long size_t; -#else -typedef unsigned int size_t; -#endif - -#define _PTRDIFF_T -typedef signed int ptrdiff_t; - -#endif /* _BITSIZE_STDDEF_H */ diff --git a/usr/include/bits64/bitsize/stddef.h b/usr/include/bits64/bitsize/stddef.h deleted file mode 100644 index 1e942a1d6f8d1..0000000000000 --- a/usr/include/bits64/bitsize/stddef.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * bits64/stddef.h - */ - -#ifndef _BITSIZE_STDDEF_H -#define _BITSIZE_STDDEF_H - -#define _SIZE_T -typedef unsigned long size_t; -#define _PTRDIFF_T -typedef signed long ptrdiff_t; - -#endif /* _BITSIZE_STDDEF_H */ diff --git a/usr/include/stddef.h b/usr/include/stddef.h index 338b0dd0ef7ef..68114513961f7 100644 --- a/usr/include/stddef.h +++ b/usr/include/stddef.h @@ -9,7 +9,29 @@ # error "__KLIBC__ not defined, compiler invocation error!" #endif -#include <bitsize/stddef.h> +/* + * __SIZE_TYPE__ and __PTRDIFF_TYPE__ are defined by GCC and + * many other compilers to what types the ABI expects on the + * target platform for size_t and ptrdiff_t, so we use these + * for size_t, ssize_t, ptrdiff_t definitions, if available; + * fall back to unsigned long, which is correct on ILP32 and + * LP64 platforms (Linux does not have any others) otherwise. + * + * Note: the order "long unsigned int" precisely matches GCC. + */ +#ifndef __SIZE_TYPE__ +#define __SIZE_TYPE__ long unsigned int +#endif + +#ifndef __PTRDIFF_TYPE__ +#define __PTRDIFF_TYPE__ long int +#endif + +#define _SIZE_T +typedef __SIZE_TYPE__ size_t; + +#define _PTRDIFF_T +typedef __PTRDIFF_TYPE__ ptrdiff_t; #undef NULL #ifdef __cplusplus diff --git a/usr/include/sys/types.h b/usr/include/sys/types.h index 4ad9930315466..229f7d6d74c72 100644 --- a/usr/include/sys/types.h +++ b/usr/include/sys/types.h @@ -10,7 +10,10 @@ #include <stdint.h> #define _SSIZE_T -typedef ptrdiff_t ssize_t; +/* __SIZE_TYPE__ defined either by GCC or <stddef.h> */ +#define unsigned /* nothing, temporarily */ +typedef signed __SIZE_TYPE__ ssize_t; +#undef unsigned #include <linux/posix_types.h> #include <asm/types.h> @@ -41,21 +44,6 @@ typedef __kernel_fsid_t fsid_t; * The following typedefs are also protected by individual ifdefs for * historical reasons: */ -#ifndef _SIZE_T -#define _SIZE_T -typedef __kernel_size_t size_t; -#endif - -#ifndef _SSIZE_T -#define _SSIZE_T -typedef __kernel_ssize_t ssize_t; -#endif - -#ifndef _PTRDIFF_T -#define _PTRDIFF_T -typedef __kernel_ptrdiff_t ptrdiff_t; -#endif - #ifndef _TIME_T #define _TIME_T typedef __kernel_time_t time_t; |