aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThorsten Glaser <tg@mirbsd.org>2012-05-15 16:30:19 +0000
committerH. Peter Anvin <hpa@linux.intel.com>2012-05-15 11:33:07 -0700
commit7e911e43f51feb1a0255efaea3aa3bcb79adbede (patch)
tree1a9ec4e9e7c71ed3f4c5ba1bdefb74d25ac646dd
parent87259a8dd521fafff32734c5d844b7dd21859eb0 (diff)
downloadklibc-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.h18
-rw-r--r--usr/include/bits64/bitsize/stddef.h13
-rw-r--r--usr/include/stddef.h24
-rw-r--r--usr/include/sys/types.h20
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;