[06/25] Clean up bits/types.h.

Message ID 20190626174954.8009-7-zackw@panix.com
State New
Headers show
Series
  • Public header file hygiene improvements for 2.30
Related show

Commit Message

Zack Weinberg June 26, 2019, 5:49 p.m.
This makes four linked changes to bits/types.h.  First, we use
__(u)?int(16|32|64)_t to define __[SU](16|32|64)_TYPE.  In addition
to reducing the amount of ifdeffage, this means __STD_TYPE is no longer
necessary, since gcc -std=c89 will complain about ‘typedef long long foo_t’
but not ‘typedef __int64_t foo_t’, even if the underlying type
of __int64_t is long long.

Second, we eliminate __UQUAD_TYPE and __SQUAD_TYPE from the set of
macros bits/typesizes.h should use to define __FOO_T_TYPE macros,
since they are always the same as __U64_TYPE and __S64_TYPE
respectively.

Third, we remove __u_char, __u_short, __u_int, __u_long, __u_quad_t,
and __quad_t, we add __uintptr_t, and we define __intmax_t and
__uintmax_t as __int64_t and __uint64_t.

Fourth, we reorganize the list of typedefs into groups by the
standard (if any) that defines them, and sort them alphabetically within
each group.

	* posix/bits/types.h: Move #error for __WORDSIZE neither 32 nor 64
	to first group of conditionals on __WORDSIZE, and make it more
	explicit.  Update commentary.  Define all __foo_t types with
	regular ‘typedef’.  Reorganize all __foo_t types into the same
	groups that sys/types.h uses.
	(__u_char, __u_short, __u_int, __u_long, __quad_t, __u_quad_t)
	(__UQUAD_TYPE, __SQUAD_TYPE, __STD_TYPE): Don’t define.
	(__S16_TYPE): Define unconditionally as __int16_t.
	(__U16_TYPE): Define unconditionally as __uint16_t.
	(__S32_TYPE): Define unconditionally as __int32_t.
	(__U32_TYPE): Define unconditionally as __uint32_t.
	(__S64_TYPE): Define unconditionally as __int64_t.
	(__U64_TYPE): Define unconditionally as __uint64_t.
	(__intmax_t): Define unconditionally as __int64_t.
	(__uintmax_t): Define unconditionally as __uint64_t.
        (__uintptr_t): New typedef.

	* bits/time64.h
	* bits/typesizes.h
	* sysdeps/mach/hurd/bits/typesizes.h
	* sysdeps/unix/sysv/linux/alpha/bits/typesizes.h
	* sysdeps/unix/sysv/linux/generic/bits/typesizes.h
	* sysdeps/unix/sysv/linux/mips/bits/typesizes.h
	* sysdeps/unix/sysv/linux/s390/bits/typesizes.h
	* sysdeps/unix/sysv/linux/sparc/bits/typesizes.h
	* sysdeps/unix/sysv/linux/x86/bits/typesizes.h:
	Replace all uses of __UQUAD_TYPE with __U64_TYPE, and all
	uses of __SQUAD_TYPE with __S64_TYPE.

        * posix/sys/types.h, rpc/sys/types.h
        (u_char): Define as unsigned char.
        (u_short): Define as unsigned short.
        (u_int): Define as unsigned int.
        (u_long): Define as unsigned long.
        (quad_t): Define as __int64_t.
        (u_quad_t): Define as __uint64_t.

        * stdlib/stdint.h (intptr_t): Define as __intptr_t.
        (uintptr_t): Define as __uintptr_t.

        * scripts/check-obsolete-constructs.py: Update allowed
        definitions for the obsolete types.  No longer allow
        __STD_TYPE as an alias for typedef.
---
 bits/time64.h                                 |   2 +-
 bits/typesizes.h                              |  14 +-
 posix/bits/types.h                            | 194 +++++++-----------
 posix/sys/types.h                             |  12 +-
 scripts/check-obsolete-constructs.py          |  71 +++----
 stdlib/stdint.h                               |  13 +-
 sunrpc/rpc/types.h                            |  12 +-
 sysdeps/mach/hurd/bits/typesizes.h            |  14 +-
 .../unix/sysv/linux/generic/bits/typesizes.h  |  14 +-
 sysdeps/unix/sysv/linux/mips/bits/typesizes.h |  16 +-
 sysdeps/unix/sysv/linux/s390/bits/typesizes.h |  14 +-
 .../unix/sysv/linux/sparc/bits/typesizes.h    |  14 +-
 sysdeps/unix/sysv/linux/x86/bits/typesizes.h  |  20 +-
 13 files changed, 177 insertions(+), 233 deletions(-)

-- 
2.20.1

Patch

diff --git a/bits/time64.h b/bits/time64.h
index c0f8a24d8a..de38d3da03 100644
--- a/bits/time64.h
+++ b/bits/time64.h
@@ -30,7 +30,7 @@ 
 # define __TIME64_T_TYPE		__TIME_T_TYPE
 #else
 /* Define a 64-bit time type alongsize the 32-bit one.  */
-# define __TIME64_T_TYPE		__SQUAD_TYPE
+# define __TIME64_T_TYPE		__S64_TYPE
 #endif
 
 #endif /* bits/time64.h */
diff --git a/bits/typesizes.h b/bits/typesizes.h
index a7291465ca..bd21cf31cd 100644
--- a/bits/typesizes.h
+++ b/bits/typesizes.h
@@ -26,24 +26,24 @@ 
 /* See <bits/types.h> for the meaning of these macros.  This file exists so
    that <bits/types.h> need not vary across different GNU platforms.  */
 
-#define __DEV_T_TYPE		__UQUAD_TYPE
+#define __DEV_T_TYPE		__U64_TYPE
 #define __UID_T_TYPE		__U32_TYPE
 #define __GID_T_TYPE		__U32_TYPE
 #define __INO_T_TYPE		__ULONGWORD_TYPE
-#define __INO64_T_TYPE		__UQUAD_TYPE
+#define __INO64_T_TYPE		__U64_TYPE
 #define __MODE_T_TYPE		__U32_TYPE
 #define __NLINK_T_TYPE		__UWORD_TYPE
 #define __OFF_T_TYPE		__SLONGWORD_TYPE
-#define __OFF64_T_TYPE		__SQUAD_TYPE
+#define __OFF64_T_TYPE		__S64_TYPE
 #define __PID_T_TYPE		__S32_TYPE
 #define __RLIM_T_TYPE		__ULONGWORD_TYPE
-#define __RLIM64_T_TYPE		__UQUAD_TYPE
+#define __RLIM64_T_TYPE		__U64_TYPE
 #define	__BLKCNT_T_TYPE		__SLONGWORD_TYPE
-#define	__BLKCNT64_T_TYPE	__SQUAD_TYPE
+#define	__BLKCNT64_T_TYPE	__S64_TYPE
 #define	__FSBLKCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSBLKCNT64_T_TYPE	__UQUAD_TYPE
+#define	__FSBLKCNT64_T_TYPE	__U64_TYPE
 #define	__FSFILCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSFILCNT64_T_TYPE	__UQUAD_TYPE
+#define	__FSFILCNT64_T_TYPE	__U64_TYPE
 #define	__FSWORD_T_TYPE		__SWORD_TYPE
 #define	__ID_T_TYPE		__U32_TYPE
 #define __CLOCK_T_TYPE		__SLONGWORD_TYPE
diff --git a/posix/bits/types.h b/posix/bits/types.h
index 1f079505a7..4a6043cdc8 100644
--- a/posix/bits/types.h
+++ b/posix/bits/types.h
@@ -27,12 +27,6 @@ 
 #include <bits/wordsize.h>
 #include <bits/timesize.h>
 
-/* Convenience types.  */
-typedef unsigned char __u_char;
-typedef unsigned short int __u_short;
-typedef unsigned int __u_int;
-typedef unsigned long int __u_long;
-
 /* Fixed-size types, underlying types depend on word size and compiler.  */
 typedef signed char __int8_t;
 typedef unsigned char __uint8_t;
@@ -43,9 +37,11 @@  typedef unsigned int __uint32_t;
 #if __WORDSIZE == 64
 typedef signed long int __int64_t;
 typedef unsigned long int __uint64_t;
-#else
+#elif __WORDSIZE == 32
 __extension__ typedef signed long long int __int64_t;
 __extension__ typedef unsigned long long int __uint64_t;
+#else
+# error "Unsupported value for __WORDSIZE"
 #endif
 
 /* Smallest types with at least a given width.  */
@@ -58,24 +54,9 @@  typedef __uint32_t __uint_least32_t;
 typedef __int64_t __int_least64_t;
 typedef __uint64_t __uint_least64_t;
 
-/* quad_t is also 64 bits.  */
-#if __WORDSIZE == 64
-typedef long int __quad_t;
-typedef unsigned long int __u_quad_t;
-#else
-__extension__ typedef long long int __quad_t;
-__extension__ typedef unsigned long long int __u_quad_t;
-#endif
-
 /* Largest integral types.  */
-#if __WORDSIZE == 64
-typedef long int __intmax_t;
-typedef unsigned long int __uintmax_t;
-#else
-__extension__ typedef long long int __intmax_t;
-__extension__ typedef unsigned long long int __uintmax_t;
-#endif
-
+typedef __int64_t __intmax_t;
+typedef __uint64_t __uintmax_t;
 
 /* The machine-dependent file <bits/typesizes.h> defines __*_T_TYPE
    macros for each of the OS types we define below.  The definitions
@@ -87,136 +68,107 @@  __extension__ typedef unsigned long long int __uintmax_t;
 	32		-- "natural" 32-bit type (always int)
 	64		-- "natural" 64-bit type (long or long long)
 	LONG32		-- 32-bit type, traditionally long
-	QUAD		-- 64-bit type, traditionally long long
 	WORD		-- natural type of __WORDSIZE bits (int or long)
 	LONGWORD	-- type of __WORDSIZE bits, traditionally long
 
-   We distinguish WORD/LONGWORD, 32/LONG32, and 64/QUAD so that the
-   conventional uses of `long' or `long long' type modifiers match the
-   types we define, even when a less-adorned type would be the same size.
-   This matters for (somewhat) portably writing printf/scanf formats for
-   these types, where using the appropriate l or ll format modifiers can
-   make the typedefs and the formats match up across all GNU platforms.  If
-   we used `long' when it's 64 bits where `long long' is expected, then the
-   compiler would warn about the formats not matching the argument types,
-   and the programmer changing them to shut up the compiler would break the
-   program's portability.
+   We distinguish WORD/LONGWORD and 64/QUAD so that the conventional
+   uses of `long' or `long long' type modifiers match the types we
+   define, even when a less-adorned type would be the same size.
+   This matters for (somewhat) portably writing printf/scanf formats
+   for these types, where using the appropriate l or ll format
+   modifiers can make the typedefs and the formats match up across all
+   GNU platforms.  If we used `long' when it's 64 bits where `long
+   long' is expected, then the compiler would warn about the formats
+   not matching the argument types, and the programmer changing them
+   to shut up the compiler would break the program's portability.
 
    Here we assume what is presently the case in all the GCC configurations
    we support: long long is always 64 bits, long is always word/address size,
    and int is always 32 bits.  */
 
-#define	__S16_TYPE		short int
-#define __U16_TYPE		unsigned short int
-#define	__S32_TYPE		int
-#define __U32_TYPE		unsigned int
+#define	__S16_TYPE		__int16_t
+#define __U16_TYPE		__uint16_t
+#define	__S32_TYPE		__int32_t
+#define __U32_TYPE		__uint32_t
+#define __S64_TYPE		__int64_t
+#define __U64_TYPE		__uint64_t
+
 #define __SLONGWORD_TYPE	long int
 #define __ULONGWORD_TYPE	unsigned long int
 #if __WORDSIZE == 32
-# define __SQUAD_TYPE		__int64_t
-# define __UQUAD_TYPE		__uint64_t
 # define __SWORD_TYPE		int
 # define __UWORD_TYPE		unsigned int
 # define __SLONG32_TYPE		long int
 # define __ULONG32_TYPE		unsigned long int
-# define __S64_TYPE		__int64_t
-# define __U64_TYPE		__uint64_t
-/* We want __extension__ before typedef's that use nonstandard base types
-   such as `long long' in C89 mode.  */
-# define __STD_TYPE		__extension__ typedef
-#elif __WORDSIZE == 64
-# define __SQUAD_TYPE		long int
-# define __UQUAD_TYPE		unsigned long int
+#else /* __WORDSIZE == 64 */
 # define __SWORD_TYPE		long int
 # define __UWORD_TYPE		unsigned long int
 # define __SLONG32_TYPE		int
 # define __ULONG32_TYPE		unsigned int
-# define __S64_TYPE		long int
-# define __U64_TYPE		unsigned long int
-/* No need to mark the typedef with __extension__.   */
-# define __STD_TYPE		typedef
-#else
-# error
 #endif
 #include <bits/typesizes.h>	/* Defines __*_T_TYPE macros.  */
 #include <bits/time64.h>	/* Defines __TIME*_T_TYPE macros.  */
 
+/* Types from core POSIX:  */
+typedef __BLKCNT_T_TYPE __blkcnt_t;	/* Disk block counts.  */
+typedef __CLOCKID_T_TYPE __clockid_t;	/* Clock IDs.  */
+typedef __DEV_T_TYPE __dev_t;		/* Device numbers.  */
+typedef __FSBLKCNT_T_TYPE __fsblkcnt_t;	/* File system block counts.  */
+typedef __FSFILCNT_T_TYPE __fsfilcnt_t;	/* File system inode counts.  */
+typedef __GID_T_TYPE __gid_t;		/* Group IDs.  */
+typedef __INO_T_TYPE __ino_t;		/* File serial numbers.  */
+typedef __MODE_T_TYPE __mode_t;		/* File attribute bitmasks.  */
+typedef __NLINK_T_TYPE __nlink_t;	/* File link counts.  */
+typedef __OFF_T_TYPE __off_t;		/* File sizes and offsets.  */
+typedef __PID_T_TYPE __pid_t;		/* Process IDs.  */
+typedef __RLIM_T_TYPE __rlim_t;		/* Resource measurements.  */
+typedef __SSIZE_T_TYPE __ssize_t;	/* Byte count, or error.  */
+typedef __TIME_T_TYPE __time_t;		/* Seconds since the Epoch.  */
+typedef __TIMER_T_TYPE __timer_t;	/* Timer IDs.  */
+typedef __UID_T_TYPE __uid_t;		/* Type of user identifications.  */
 
-__STD_TYPE __DEV_T_TYPE __dev_t;	/* Type of device numbers.  */
-__STD_TYPE __UID_T_TYPE __uid_t;	/* Type of user identifications.  */
-__STD_TYPE __GID_T_TYPE __gid_t;	/* Type of group identifications.  */
-__STD_TYPE __INO_T_TYPE __ino_t;	/* Type of file serial numbers.  */
-__STD_TYPE __INO64_T_TYPE __ino64_t;	/* Type of file serial numbers (LFS).*/
-__STD_TYPE __MODE_T_TYPE __mode_t;	/* Type of file attribute bitmasks.  */
-__STD_TYPE __NLINK_T_TYPE __nlink_t;	/* Type of file link counts.  */
-__STD_TYPE __OFF_T_TYPE __off_t;	/* Type of file sizes and offsets.  */
-__STD_TYPE __OFF64_T_TYPE __off64_t;	/* Type of file sizes and offsets (LFS).  */
-__STD_TYPE __PID_T_TYPE __pid_t;	/* Type of process identifications.  */
-__STD_TYPE __FSID_T_TYPE __fsid_t;	/* Type of file system IDs.  */
-__STD_TYPE __CLOCK_T_TYPE __clock_t;	/* Type of CPU usage counts.  */
-__STD_TYPE __RLIM_T_TYPE __rlim_t;	/* Type for resource measurement.  */
-__STD_TYPE __RLIM64_T_TYPE __rlim64_t;	/* Type for resource measurement (LFS).  */
-__STD_TYPE __ID_T_TYPE __id_t;		/* General type for IDs.  */
-__STD_TYPE __TIME_T_TYPE __time_t;	/* Seconds since the Epoch.  */
-__STD_TYPE __TIME64_T_TYPE __time64_t;	/* Seconds since the Epoch (Y2038).  */
-__STD_TYPE __USECONDS_T_TYPE __useconds_t; /* Count of microseconds.  */
-__STD_TYPE __SUSECONDS_T_TYPE __suseconds_t; /* Signed count of microseconds.  */
+/* Types added by LFS:  */
+typedef __BLKCNT64_T_TYPE __blkcnt64_t;
+typedef __FSBLKCNT64_T_TYPE __fsblkcnt64_t;
+typedef __FSFILCNT64_T_TYPE __fsfilcnt64_t;
+typedef __INO64_T_TYPE __ino64_t;
+typedef __OFF64_T_TYPE __off64_t;
+typedef __RLIM64_T_TYPE __rlim64_t;
 
-__STD_TYPE __KEY_T_TYPE __key_t;	/* Type of an IPC key.  */
+/* Types added by Y2038:  */
+typedef __TIME64_T_TYPE __time64_t;
 
-/* Clock ID used in clock and timer functions.  */
-__STD_TYPE __CLOCKID_T_TYPE __clockid_t;
+/* Types added by XSI:  */
+typedef __BLKSIZE_T_TYPE __blksize_t;	  /* Size of a disk block.  */
+typedef __CLOCK_T_TYPE __clock_t;	  /* CPU usage counts.  */
+typedef __ID_T_TYPE __id_t;		  /* General IDs.  */
+typedef __KEY_T_TYPE __key_t;		  /* "SysV" IPC keys.  */
+typedef __SUSECONDS_T_TYPE __suseconds_t; /* Signed count of microseconds.  */
+typedef __USECONDS_T_TYPE __useconds_t;	  /* Count of microseconds.  */
 
-/* Timer ID returned by `timer_create'.  */
-__STD_TYPE __TIMER_T_TYPE __timer_t;
+/* Types added by BSD:  */
+typedef __FSID_T_TYPE __fsid_t;		/* File system IDs.  */
+typedef __REGISTER_T_TYPE __register_t;	/* Integer register.  */
 
-/* Type to represent block size.  */
-__STD_TYPE __BLKSIZE_T_TYPE __blksize_t;
-
-/* Types from the Large File Support interface.  */
-
-/* Type to count number of disk blocks.  */
-__STD_TYPE __BLKCNT_T_TYPE __blkcnt_t;
-__STD_TYPE __BLKCNT64_T_TYPE __blkcnt64_t;
-
-/* Type to count file system blocks.  */
-__STD_TYPE __FSBLKCNT_T_TYPE __fsblkcnt_t;
-__STD_TYPE __FSBLKCNT64_T_TYPE __fsblkcnt64_t;
-
-/* Type to count file system nodes.  */
-__STD_TYPE __FSFILCNT_T_TYPE __fsfilcnt_t;
-__STD_TYPE __FSFILCNT64_T_TYPE __fsfilcnt64_t;
-
-/* Type of miscellaneous file system fields.  */
-__STD_TYPE __FSWORD_T_TYPE __fsword_t;
-
-__STD_TYPE __SSIZE_T_TYPE __ssize_t; /* Type of a byte count, or error.  */
-
-/* Signed long type used in system calls.  */
-__STD_TYPE __SYSCALL_SLONG_TYPE __syscall_slong_t;
-/* Unsigned long type used in system calls.  */
-__STD_TYPE __SYSCALL_ULONG_TYPE __syscall_ulong_t;
+/* Types added by Linux:  */
+typedef __FSWORD_T_TYPE __fsword_t;	/* Miscellaneous file system fields.  */
+typedef __SYSCALL_SLONG_TYPE __syscall_slong_t;
+typedef __SYSCALL_ULONG_TYPE __syscall_ulong_t;
 
 /* These few don't really vary by system, they always correspond
    to one of the other defined types.  */
-typedef __off64_t __loff_t;	/* Type of file sizes and offsets (LFS).  */
-typedef char *__caddr_t;                /* Type of a memory address (BSD).  */
-__STD_TYPE __S32_TYPE __daddr_t;	/* Type of a disk address (BSD).  */
 
-/* Duplicates info from stdint.h but this is used in unistd.h.  */
-__STD_TYPE __SWORD_TYPE __intptr_t;
+/* ISO C:  */
+typedef __SWORD_TYPE __intptr_t;	/* Signed type that can hold void*.  */
+typedef __UWORD_TYPE __uintptr_t;	/* Unsigned type that can hold void*.  */
+typedef int __sig_atomic_t;		/* Atomic access relative to signals.  */
 
-/* Duplicate info from sys/socket.h.  */
-__STD_TYPE __U32_TYPE __socklen_t;
+/* POSIX:  */
+typedef __U32_TYPE __socklen_t;		/* Size of a socket address.  */
 
-/* C99: An integer type that can be accessed as an atomic entity,
-   even in the presence of asynchronous interrupts.
-   It is not currently necessary for this to be machine-specific.  */
-typedef int __sig_atomic_t;
-
-/* BSD: Size of a general-purpose integer register.  */
-__STD_TYPE __REGISTER_T_TYPE __register_t;
-
-#undef __STD_TYPE
+/* BSD:  */
+typedef char *__caddr_t;                /* Memory address.  */
+typedef __S32_TYPE __daddr_t;		/* Disk address.  */
+typedef __off64_t __loff_t;		/* File sizes and offsets.  */
 
 #endif /* bits/types.h */
diff --git a/posix/sys/types.h b/posix/sys/types.h
index 7327904346..2d8cfd19d2 100644
--- a/posix/sys/types.h
+++ b/posix/sys/types.h
@@ -30,12 +30,12 @@  __BEGIN_DECLS
 
 #ifdef	__USE_MISC
 # ifndef __u_char_defined
-typedef __u_char u_char;
-typedef __u_short u_short;
-typedef __u_int u_int;
-typedef __u_long u_long;
-typedef __quad_t quad_t;
-typedef __u_quad_t u_quad_t;
+typedef unsigned char u_char;
+typedef unsigned short int u_short;
+typedef unsigned int u_int;
+typedef unsigned long int u_long;
+typedef __int64_t quad_t;
+typedef __uint64_t u_quad_t;
 typedef __fsid_t fsid_t;
 #  define __u_char_defined
 # endif
diff --git a/scripts/check-obsolete-constructs.py b/scripts/check-obsolete-constructs.py
index 701ad5af90..518de7523e 100755
--- a/scripts/check-obsolete-constructs.py
+++ b/scripts/check-obsolete-constructs.py
@@ -280,9 +280,8 @@  class ObsoletePrivateDefinitionsAllowed(ConstructChecker):
         self.prev_token = None
 
     def examine(self, tok):
-        # bits/types.h hides 'typedef' in a macro sometimes.
         if (tok.kind == "IDENT"
-            and tok.text in ("typedef", "__STD_TYPE")
+            and tok.text == "typedef"
             and tok.context is None):
             self.in_typedef = True
         elif tok.kind == "PUNCTUATOR" and tok.text == ";" and self.in_typedef:
@@ -312,9 +311,12 @@  class ObsoletePublicDefinitionsAllowed(ConstructChecker):
 
            typedef __obsolete obsolete;  // identifiers must agree
            typedef __uintN_t u_intN_t;   // N must agree
-           typedef unsigned long int ulong;
-           typedef unsigned short int ushort;
-           typedef unsigned int uint;
+           typedef unsigned long int u_?long;
+           typedef unsigned short int u_?short;
+           typedef unsigned int u_?int;
+           typedef unsigned char u_char;
+           typedef __int64_t quad_t;
+           typedef __uint64_t u_quad_t;
     """
     def __init__(self, reporter):
         super().__init__(reporter)
@@ -357,41 +359,40 @@  class ObsoletePublicDefinitionsAllowed(ConstructChecker):
         self._reset()
 
     def _permissible_public_definition(self, m):
-        if m.group(1) == "__": return False
-        name = m.group(2)
-        toks = self.typedef_tokens
-        ntok = len(toks)
-        if ntok == 3 and toks[1].kind == "IDENT":
-            defn = toks[1].text
-            n = OBSOLETE_TYPE_RE_.match(defn)
-            if n and n.group(1) == "__" and n.group(2) == name:
-                return True
-
-            if (name[:5] == "u_int" and name[-2:] == "_t"
-                and defn[:6] == "__uint" and defn[-2:] == "_t"
-                and name[5:-2] == defn[6:-2]):
-                return True
-
+        if m.group(1) == "__":
             return False
+        name = m.group(2)
 
-        if (name == "ulong" and ntok == 5
-            and toks[1].kind == "IDENT" and toks[1].text == "unsigned"
-            and toks[2].kind == "IDENT" and toks[2].text == "long"
-            and toks[3].kind == "IDENT" and toks[3].text == "int"):
-            return True
+        toks = self.typedef_tokens
+        if len(toks) > 5:
+            return False
+        if any(tk.kind != "IDENT" for tk in toks):
+            return False
+        defn = " ".join(tk.text for tk in toks[1:-1])
 
-        if (name == "ushort" and ntok == 5
-            and toks[1].kind == "IDENT" and toks[1].text == "unsigned"
-            and toks[2].kind == "IDENT" and toks[2].text == "short"
-            and toks[3].kind == "IDENT" and toks[3].text == "int"):
-            return True
+        if name == "u_char":
+            return defn == "unsigned char"
 
-        if (name == "uint" and ntok == 4
-            and toks[1].kind == "IDENT" and toks[1].text == "unsigned"
-            and toks[2].kind == "IDENT" and toks[2].text == "int"):
-            return True
+        if name in ("ushort", "u_short"):
+            return defn == "unsigned short int"
+
+        if name in ("uint", "u_int"):
+            return defn == "unsigned int"
+
+        if name in ("ulong", "u_long"):
+            return defn == "unsigned long int"
+
+        if name == "quad_t":
+            return defn == "__int64_t"
+
+        if name == "u_quad_t":
+            return defn == "__uint64_t"
+
+        if name[:5] == "u_int" and name[-2:] == "_t":
+            return defn == "__uint" + name[5:-2] + "_t"
+
+        return defn == "__" + name
 
-        return False
 
 def ObsoleteTypedefChecker(reporter, fname):
     """Factory: produce an instance of the appropriate
diff --git a/stdlib/stdint.h b/stdlib/stdint.h
index 1ad538fc48..8645d91cfc 100644
--- a/stdlib/stdint.h
+++ b/stdlib/stdint.h
@@ -82,20 +82,11 @@  typedef unsigned long long int	uint_fast64_t;
 
 
 /* Types for `void *' pointers.  */
-#if __WORDSIZE == 64
 # ifndef __intptr_t_defined
-typedef long int		intptr_t;
+typedef __intptr_t		intptr_t;
 #  define __intptr_t_defined
 # endif
-typedef unsigned long int	uintptr_t;
-#else
-# ifndef __intptr_t_defined
-typedef int			intptr_t;
-#  define __intptr_t_defined
-# endif
-typedef unsigned int		uintptr_t;
-#endif
-
+typedef __uintptr_t		uintptr_t;
 
 /* Largest integral types.  */
 typedef __intmax_t		intmax_t;
diff --git a/sunrpc/rpc/types.h b/sunrpc/rpc/types.h
index beded52555..99e5f4f151 100644
--- a/sunrpc/rpc/types.h
+++ b/sunrpc/rpc/types.h
@@ -75,12 +75,12 @@  typedef unsigned long rpcport_t;
 #endif
 
 #ifndef __u_char_defined
-typedef __u_char u_char;
-typedef __u_short u_short;
-typedef __u_int u_int;
-typedef __u_long u_long;
-typedef __quad_t quad_t;
-typedef __u_quad_t u_quad_t;
+typedef unsigned char u_char;
+typedef unsigned short int u_short;
+typedef unsigned int u_int;
+typedef unsigned long int u_long;
+typedef __int64_t quad_t;
+typedef __uint64_t u_quad_t;
 typedef __fsid_t fsid_t;
 # define __u_char_defined
 #endif
diff --git a/sysdeps/mach/hurd/bits/typesizes.h b/sysdeps/mach/hurd/bits/typesizes.h
index 23ee7af95c..eaeaab1e32 100644
--- a/sysdeps/mach/hurd/bits/typesizes.h
+++ b/sysdeps/mach/hurd/bits/typesizes.h
@@ -30,20 +30,20 @@ 
 #define __UID_T_TYPE		__U32_TYPE
 #define __GID_T_TYPE		__U32_TYPE
 #define __INO_T_TYPE		__ULONGWORD_TYPE
-#define __INO64_T_TYPE		__UQUAD_TYPE
+#define __INO64_T_TYPE		__U64_TYPE
 #define __MODE_T_TYPE		__U32_TYPE
 #define __NLINK_T_TYPE		__UWORD_TYPE
 #define __OFF_T_TYPE		__SLONGWORD_TYPE
-#define __OFF64_T_TYPE		__SQUAD_TYPE
+#define __OFF64_T_TYPE		__S64_TYPE
 #define __PID_T_TYPE		__S32_TYPE
 #define __RLIM_T_TYPE		__ULONGWORD_TYPE
-#define __RLIM64_T_TYPE		__UQUAD_TYPE
+#define __RLIM64_T_TYPE		__U64_TYPE
 #define	__BLKCNT_T_TYPE		__SLONGWORD_TYPE
-#define	__BLKCNT64_T_TYPE	__SQUAD_TYPE
+#define	__BLKCNT64_T_TYPE	__S64_TYPE
 #define	__FSBLKCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSBLKCNT64_T_TYPE	__UQUAD_TYPE
+#define	__FSBLKCNT64_T_TYPE	__U64_TYPE
 #define	__FSFILCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSFILCNT64_T_TYPE	__UQUAD_TYPE
+#define	__FSFILCNT64_T_TYPE	__U64_TYPE
 #define	__FSWORD_T_TYPE		__SWORD_TYPE
 #define	__ID_T_TYPE		__U32_TYPE
 #define __CLOCK_T_TYPE		__SLONGWORD_TYPE
@@ -54,7 +54,7 @@ 
 #define __CLOCKID_T_TYPE	__S32_TYPE
 #define __TIMER_T_TYPE		__S32_TYPE
 #define __BLKSIZE_T_TYPE	__SLONGWORD_TYPE
-#define __FSID_T_TYPE		__UQUAD_TYPE
+#define __FSID_T_TYPE		__U64_TYPE
 #define __SSIZE_T_TYPE		__SWORD_TYPE
 #define __SYSCALL_SLONG_TYPE	__SLONGWORD_TYPE
 #define __SYSCALL_ULONG_TYPE	__ULONGWORD_TYPE
diff --git a/sysdeps/unix/sysv/linux/generic/bits/typesizes.h b/sysdeps/unix/sysv/linux/generic/bits/typesizes.h
index 26dabcfb39..fb4a5605f2 100644
--- a/sysdeps/unix/sysv/linux/generic/bits/typesizes.h
+++ b/sysdeps/unix/sysv/linux/generic/bits/typesizes.h
@@ -27,24 +27,24 @@ 
 /* See <bits/types.h> for the meaning of these macros.  This file exists so
    that <bits/types.h> need not vary across different GNU platforms.  */
 
-#define __DEV_T_TYPE		__UQUAD_TYPE
+#define __DEV_T_TYPE		__U64_TYPE
 #define __UID_T_TYPE		__U32_TYPE
 #define __GID_T_TYPE		__U32_TYPE
 #define __INO_T_TYPE		__ULONGWORD_TYPE
-#define __INO64_T_TYPE		__UQUAD_TYPE
+#define __INO64_T_TYPE		__U64_TYPE
 #define __MODE_T_TYPE		__U32_TYPE
 #define __NLINK_T_TYPE		__U32_TYPE
 #define __OFF_T_TYPE		__SLONGWORD_TYPE
-#define __OFF64_T_TYPE		__SQUAD_TYPE
+#define __OFF64_T_TYPE		__S64_TYPE
 #define __PID_T_TYPE		__S32_TYPE
 #define __RLIM_T_TYPE		__ULONGWORD_TYPE
-#define __RLIM64_T_TYPE		__UQUAD_TYPE
+#define __RLIM64_T_TYPE		__U64_TYPE
 #define	__BLKCNT_T_TYPE		__SLONGWORD_TYPE
-#define	__BLKCNT64_T_TYPE	__SQUAD_TYPE
+#define	__BLKCNT64_T_TYPE	__S64_TYPE
 #define	__FSBLKCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSBLKCNT64_T_TYPE	__UQUAD_TYPE
+#define	__FSBLKCNT64_T_TYPE	__U64_TYPE
 #define	__FSFILCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSFILCNT64_T_TYPE	__UQUAD_TYPE
+#define	__FSFILCNT64_T_TYPE	__U64_TYPE
 #define	__FSWORD_T_TYPE		__SWORD_TYPE
 #define	__ID_T_TYPE		__U32_TYPE
 #define __CLOCK_T_TYPE		__SLONGWORD_TYPE
diff --git a/sysdeps/unix/sysv/linux/mips/bits/typesizes.h b/sysdeps/unix/sysv/linux/mips/bits/typesizes.h
index 7c1bedd9af..e73bba4ee7 100644
--- a/sysdeps/unix/sysv/linux/mips/bits/typesizes.h
+++ b/sysdeps/unix/sysv/linux/mips/bits/typesizes.h
@@ -26,24 +26,24 @@ 
 /* See <bits/types.h> for the meaning of these macros.  This file exists so
    that <bits/types.h> need not vary across different GNU platforms.  */
 
-#define __DEV_T_TYPE		__UQUAD_TYPE
+#define __DEV_T_TYPE		__U64_TYPE
 #define __UID_T_TYPE		__U32_TYPE
 #define __GID_T_TYPE		__U32_TYPE
 #define __INO_T_TYPE		__ULONGWORD_TYPE
-#define __INO64_T_TYPE		__UQUAD_TYPE
+#define __INO64_T_TYPE		__U64_TYPE
 #define __MODE_T_TYPE		__U32_TYPE
 #define __NLINK_T_TYPE		__UWORD_TYPE
 #define __OFF_T_TYPE		__SLONGWORD_TYPE
-#define __OFF64_T_TYPE		__SQUAD_TYPE
+#define __OFF64_T_TYPE		__S64_TYPE
 #define __PID_T_TYPE		__S32_TYPE
 #define __RLIM_T_TYPE		__ULONGWORD_TYPE
-#define __RLIM64_T_TYPE		__UQUAD_TYPE
+#define __RLIM64_T_TYPE		__U64_TYPE
 #define	__BLKCNT_T_TYPE		__SLONGWORD_TYPE
-#define	__BLKCNT64_T_TYPE	__SQUAD_TYPE
+#define	__BLKCNT64_T_TYPE	__S64_TYPE
 #define	__FSBLKCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSBLKCNT64_T_TYPE	__UQUAD_TYPE
+#define	__FSBLKCNT64_T_TYPE	__U64_TYPE
 #define	__FSFILCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSFILCNT64_T_TYPE	__UQUAD_TYPE
+#define	__FSFILCNT64_T_TYPE	__U64_TYPE
 #define	__FSWORD_T_TYPE		__SWORD_TYPE
 #define	__ID_T_TYPE		__U32_TYPE
 #define __CLOCK_T_TYPE		__SLONGWORD_TYPE
@@ -61,7 +61,7 @@ 
 #define __CPU_MASK_TYPE 	__ULONGWORD_TYPE
 
 #if defined _ABIN32 && _MIPS_SIM == _ABIN32
-#define __REGISTER_T_TYPE	__SQUAD_TYPE
+#define __REGISTER_T_TYPE	__S64_TYPE
 #else
 #define __REGISTER_T_TYPE	__SWORD_TYPE
 #endif
diff --git a/sysdeps/unix/sysv/linux/s390/bits/typesizes.h b/sysdeps/unix/sysv/linux/s390/bits/typesizes.h
index 712264a84f..741dfaed77 100644
--- a/sysdeps/unix/sysv/linux/s390/bits/typesizes.h
+++ b/sysdeps/unix/sysv/linux/s390/bits/typesizes.h
@@ -26,24 +26,24 @@ 
 /* See <bits/types.h> for the meaning of these macros.  This file exists so
    that <bits/types.h> need not vary across different GNU platforms.  */
 
-#define __DEV_T_TYPE		__UQUAD_TYPE
+#define __DEV_T_TYPE		__U64_TYPE
 #define __UID_T_TYPE		__U32_TYPE
 #define __GID_T_TYPE		__U32_TYPE
 #define __INO_T_TYPE		__ULONGWORD_TYPE
-#define __INO64_T_TYPE		__UQUAD_TYPE
+#define __INO64_T_TYPE		__U64_TYPE
 #define __MODE_T_TYPE		__U32_TYPE
 #define __NLINK_T_TYPE		__UWORD_TYPE
 #define __OFF_T_TYPE		__SLONGWORD_TYPE
-#define __OFF64_T_TYPE		__SQUAD_TYPE
+#define __OFF64_T_TYPE		__S64_TYPE
 #define __PID_T_TYPE		__S32_TYPE
 #define __RLIM_T_TYPE		__ULONGWORD_TYPE
-#define __RLIM64_T_TYPE		__UQUAD_TYPE
+#define __RLIM64_T_TYPE		__U64_TYPE
 #define	__BLKCNT_T_TYPE		__SLONGWORD_TYPE
-#define	__BLKCNT64_T_TYPE	__SQUAD_TYPE
+#define	__BLKCNT64_T_TYPE	__S64_TYPE
 #define	__FSBLKCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSBLKCNT64_T_TYPE	__UQUAD_TYPE
+#define	__FSBLKCNT64_T_TYPE	__U64_TYPE
 #define	__FSFILCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSFILCNT64_T_TYPE	__UQUAD_TYPE
+#define	__FSFILCNT64_T_TYPE	__U64_TYPE
 #define	__FSWORD_T_TYPE		__SWORD_TYPE
 #define	__ID_T_TYPE		__U32_TYPE
 #define __CLOCK_T_TYPE		__SLONGWORD_TYPE
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h b/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h
index b2d39294e9..c084ebd6b6 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/typesizes.h
@@ -26,24 +26,24 @@ 
 /* See <bits/types.h> for the meaning of these macros.  This file exists so
    that <bits/types.h> need not vary across different GNU platforms.  */
 
-#define __DEV_T_TYPE		__UQUAD_TYPE
+#define __DEV_T_TYPE		__U64_TYPE
 #define __UID_T_TYPE		__U32_TYPE
 #define __GID_T_TYPE		__U32_TYPE
 #define __INO_T_TYPE		__ULONGWORD_TYPE
-#define __INO64_T_TYPE		__UQUAD_TYPE
+#define __INO64_T_TYPE		__U64_TYPE
 #define __MODE_T_TYPE		__U32_TYPE
 #define __NLINK_T_TYPE		__U32_TYPE
 #define __OFF_T_TYPE		__SLONGWORD_TYPE
-#define __OFF64_T_TYPE		__SQUAD_TYPE
+#define __OFF64_T_TYPE		__S64_TYPE
 #define __PID_T_TYPE		__S32_TYPE
 #define __RLIM_T_TYPE		__ULONGWORD_TYPE
-#define __RLIM64_T_TYPE		__UQUAD_TYPE
+#define __RLIM64_T_TYPE		__U64_TYPE
 #define	__BLKCNT_T_TYPE		__SLONGWORD_TYPE
-#define	__BLKCNT64_T_TYPE	__SQUAD_TYPE
+#define	__BLKCNT64_T_TYPE	__S64_TYPE
 #define	__FSBLKCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSBLKCNT64_T_TYPE	__UQUAD_TYPE
+#define	__FSBLKCNT64_T_TYPE	__U64_TYPE
 #define	__FSFILCNT_T_TYPE	__ULONGWORD_TYPE
-#define	__FSFILCNT64_T_TYPE	__UQUAD_TYPE
+#define	__FSFILCNT64_T_TYPE	__U64_TYPE
 #define	__FSWORD_T_TYPE		__SWORD_TYPE
 #define	__ID_T_TYPE		__U32_TYPE
 #define __CLOCK_T_TYPE		__SLONGWORD_TYPE
diff --git a/sysdeps/unix/sysv/linux/x86/bits/typesizes.h b/sysdeps/unix/sysv/linux/x86/bits/typesizes.h
index fb724e6a7a..37fac92bf8 100644
--- a/sysdeps/unix/sysv/linux/x86/bits/typesizes.h
+++ b/sysdeps/unix/sysv/linux/x86/bits/typesizes.h
@@ -28,20 +28,20 @@ 
 
 /* X32 kernel interface is 64-bit.  */
 #if defined __x86_64__ && defined __ILP32__
-# define __SYSCALL_SLONG_TYPE	__SQUAD_TYPE
-# define __SYSCALL_ULONG_TYPE	__UQUAD_TYPE
-# define __REGISTER_T_TYPE	__SQUAD_TYPE
+# define __SYSCALL_SLONG_TYPE	__S64_TYPE
+# define __SYSCALL_ULONG_TYPE	__U64_TYPE
+# define __REGISTER_T_TYPE	__S64_TYPE
 #else
 # define __SYSCALL_SLONG_TYPE	__SLONGWORD_TYPE
 # define __SYSCALL_ULONG_TYPE	__ULONGWORD_TYPE
 # define __REGISTER_T_TYPE	__SWORD_TYPE
 #endif
 
-#define __DEV_T_TYPE		__UQUAD_TYPE
+#define __DEV_T_TYPE		__U64_TYPE
 #define __UID_T_TYPE		__U32_TYPE
 #define __GID_T_TYPE		__U32_TYPE
 #define __INO_T_TYPE		__SYSCALL_ULONG_TYPE
-#define __INO64_T_TYPE		__UQUAD_TYPE
+#define __INO64_T_TYPE		__U64_TYPE
 #define __MODE_T_TYPE		__U32_TYPE
 #ifdef __x86_64__
 # define __NLINK_T_TYPE		__SYSCALL_ULONG_TYPE
@@ -51,16 +51,16 @@ 
 # define __FSWORD_T_TYPE	__SWORD_TYPE
 #endif
 #define __OFF_T_TYPE		__SYSCALL_SLONG_TYPE
-#define __OFF64_T_TYPE		__SQUAD_TYPE
+#define __OFF64_T_TYPE		__S64_TYPE
 #define __PID_T_TYPE		__S32_TYPE
 #define __RLIM_T_TYPE		__SYSCALL_ULONG_TYPE
-#define __RLIM64_T_TYPE		__UQUAD_TYPE
+#define __RLIM64_T_TYPE		__U64_TYPE
 #define __BLKCNT_T_TYPE		__SYSCALL_SLONG_TYPE
-#define __BLKCNT64_T_TYPE	__SQUAD_TYPE
+#define __BLKCNT64_T_TYPE	__S64_TYPE
 #define __FSBLKCNT_T_TYPE	__SYSCALL_ULONG_TYPE
-#define __FSBLKCNT64_T_TYPE	__UQUAD_TYPE
+#define __FSBLKCNT64_T_TYPE	__U64_TYPE
 #define __FSFILCNT_T_TYPE	__SYSCALL_ULONG_TYPE
-#define __FSFILCNT64_T_TYPE	__UQUAD_TYPE
+#define __FSFILCNT64_T_TYPE	__U64_TYPE
 #define __ID_T_TYPE		__U32_TYPE
 #define __CLOCK_T_TYPE		__SYSCALL_SLONG_TYPE
 #define __TIME_T_TYPE		__SYSCALL_SLONG_TYPE