[klibc] [PATCH 4/5] Use GCC definitions for size_t, ssize_t, ptrdiff_t

Thorsten Glaser tg at mirbsd.org
Tue May 15 09:30:19 PDT 2012


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 at mirbsd.org>
---
 usr/include/bits32/bitsize/stddef.h |   18 ------------------
 usr/include/bits64/bitsize/stddef.h |   13 -------------
 usr/include/stddef.h                |   24 +++++++++++++++++++++++-
 usr/include/sys/types.h             |   20 ++++----------------
 4 files changed, 27 insertions(+), 48 deletions(-)
 delete mode 100644 usr/include/bits32/bitsize/stddef.h
 delete mode 100644 usr/include/bits64/bitsize/stddef.h

diff --git a/usr/include/bits32/bitsize/stddef.h b/usr/include/bits32/bitsize/stddef.h
deleted file mode 100644
index 43d733c..0000000
--- 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 1e942a1..0000000
--- 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 338b0dd..6811451 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 4ad9930..229f7d6 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;
-- 
1.7.10



More information about the klibc mailing list