public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 1/6] Committed: Remove __need_list_t and __need_res_state.
  2017-05-20 23:18 [PATCH 0/6] Elimination of __need macros, round 3(?) Zack Weinberg
  2017-05-20 23:18 ` [PATCH 3/6] Remove __need macros from errno.h (__need_Emath, __need_error_t) Zack Weinberg
@ 2017-05-20 23:18 ` Zack Weinberg
  2017-05-20 23:18 ` [PATCH 6/6] Remove __need_schedparam and __cpu_set_t_defined Zack Weinberg
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: Zack Weinberg @ 2017-05-20 23:18 UTC (permalink / raw)
  To: libc-alpha

These __need macros are only used internally, by nptl/descr.h.
However, including all of resolv.h from descr.h causes build failures
due to resolv.h's dozens of pseudo-struct-field macros, some of which
collide with struct fields in NPTL internal data structures.
Similarly, including all of list.h from descr.h produces an include
cycle, atomic.h -> atomic-machine.h -> tls.h -> descr.h -> list.h ->
atomic.h, and then list.h tries to use atomic.h macros that haven't
been defined yet.  So we do need mini-headers for these.  In the
list.h case I called it include/list_t.h since it isn't going to be
installed.

	* resolv/resolv.h: Remove __need_res_state logic.
	Move definition of res_state and related constants to ...
	* resolv/bits/types/res_state.h: ...this new file.
	* resolv/Makefile: Install bits/types/res_state.h.
	* include/bits/types/res_state.h: New wrapper.
	* include/list.h: Remove __need_list_t logic.
	Move definition of list_t to ...
	* include/list_t.h: ...this new file.

	* nptl/descr.h: Include list_t.h and bits/types/res_state.h
	instead of list.h and resolv.h.
---
 include/bits/types/res_state.h |  1 +
 include/list.h                 | 38 +++++------------
 include/list_t.h               | 31 ++++++++++++++
 nptl/descr.h                   |  6 +--
 resolv/Makefile                |  2 +-
 resolv/bits/types/res_state.h  | 61 ++++++++++++++++++++++++++++
 resolv/resolv.h                | 92 +++++++-----------------------------------
 7 files changed, 121 insertions(+), 110 deletions(-)
 create mode 100644 include/bits/types/res_state.h
 create mode 100644 include/list_t.h
 create mode 100644 resolv/bits/types/res_state.h

diff --git a/include/bits/types/res_state.h b/include/bits/types/res_state.h
new file mode 100644
index 0000000000..4b99b68da9
--- /dev/null
+++ b/include/bits/types/res_state.h
@@ -0,0 +1 @@
+#include <resolv/bits/types/res_state.h>
diff --git a/include/list.h b/include/list.h
index 6846783594..dec5deef8e 100644
--- a/include/list.h
+++ b/include/list.h
@@ -17,39 +17,23 @@
    <http://www.gnu.org/licenses/>.  */
 
 #ifndef _LIST_H
+#define _LIST_H	1
 
-#ifndef __need_list_t
-# define _LIST_H	1
-#endif
+/* Internal: doubly linked lists.  */
 
 /* The definitions of this file are adopted from those which can be
    found in the Linux kernel headers to enable people familiar with
    the latter find their way in these sources as well.  */
 
-
-#if defined __need_list_t || defined _LIST_H
-# ifndef __list_t_defined
-#  define __list_t_defined
-/* Basic type for the double-link list.  */
-typedef struct list_head
-{
-  struct list_head *next;
-  struct list_head *prev;
-} list_t;
-# endif
-# undef __need_list_t
-#endif
-
-#ifdef _LIST_H
-
-# include <atomic.h>
+#include <list_t.h>
+#include <atomic.h>
 
 /* Define a variable with the head and tail of the list.  */
-# define LIST_HEAD(name) \
+#define LIST_HEAD(name) \
   list_t name = { &(name), &(name) }
 
 /* Initialize a new list head.  */
-# define INIT_LIST_HEAD(ptr) \
+#define INIT_LIST_HEAD(ptr) \
   (ptr)->next = (ptr)->prev = (ptr)
 
 
@@ -90,28 +74,26 @@ list_splice (list_t *add, list_t *head)
 
 
 /* Get typed element from list at a given position.  */
-# define list_entry(ptr, type, member) \
+#define list_entry(ptr, type, member) \
   ((type *) ((char *) (ptr) - (unsigned long) (&((type *) 0)->member)))
 
 
 
 /* Iterate forward over the elements of the list.  */
-# define list_for_each(pos, head) \
+#define list_for_each(pos, head) \
   for (pos = (head)->next; pos != (head); pos = pos->next)
 
 
 /* Iterate forward over the elements of the list.  */
-# define list_for_each_prev(pos, head) \
+#define list_for_each_prev(pos, head) \
   for (pos = (head)->prev; pos != (head); pos = pos->prev)
 
 
 /* Iterate backwards over the elements list.  The list elements can be
    removed from the list while doing this.  */
-# define list_for_each_prev_safe(pos, p, head) \
+#define list_for_each_prev_safe(pos, p, head) \
   for (pos = (head)->prev, p = pos->prev; \
        pos != (head); \
        pos = p, p = pos->prev)
 
-#endif /* _LIST_H */
-
 #endif	/* list.h */
diff --git a/include/list_t.h b/include/list_t.h
new file mode 100644
index 0000000000..d737e2e214
--- /dev/null
+++ b/include/list_t.h
@@ -0,0 +1,31 @@
+/* Copyright (C) 2002-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _LIST_T_H
+#define _LIST_T_H 1
+
+/* Internal: doubly linked lists.  */
+
+/* Basic type for the double-link list.  */
+typedef struct list_head
+{
+  struct list_head *next;
+  struct list_head *prev;
+} list_t;
+
+#endif /* list_t.h */
diff --git a/nptl/descr.h b/nptl/descr.h
index a145860f07..c5ad0c8dba 100644
--- a/nptl/descr.h
+++ b/nptl/descr.h
@@ -25,16 +25,14 @@
 #include <stdbool.h>
 #include <sys/types.h>
 #include <hp-timing.h>
-#define __need_list_t
-#include <list.h>
+#include <list_t.h>
 #include <lowlevellock.h>
 #include <pthreaddef.h>
 #include <dl-sysdep.h>
 #include "../nptl_db/thread_db.h"
 #include <tls.h>
 #include <unwind.h>
-#define __need_res_state
-#include <resolv.h>
+#include <bits/types/res_state.h>
 #include <kernel-features.h>
 
 #ifndef TCB_ALIGNMENT
diff --git a/resolv/Makefile b/resolv/Makefile
index d41fd4603d..70b6f4ffe8 100644
--- a/resolv/Makefile
+++ b/resolv/Makefile
@@ -22,7 +22,7 @@ subdir	:= resolv
 
 include ../Makeconfig
 
-headers	:= resolv.h \
+headers	:= resolv.h bits/types/res_state.h \
 	   netdb.h bits/netdb.h \
 	   arpa/nameser.h arpa/nameser_compat.h \
 	   sys/bitypes.h
diff --git a/resolv/bits/types/res_state.h b/resolv/bits/types/res_state.h
new file mode 100644
index 0000000000..cee4b6ddd0
--- /dev/null
+++ b/resolv/bits/types/res_state.h
@@ -0,0 +1,61 @@
+#ifndef __res_state_defined
+#define __res_state_defined 1
+
+#include <sys/types.h>
+#include <netinet/in.h>
+
+/* res_state: the global state used by the resolver stub.  */
+#define MAXNS			3	/* max # name servers we'll track */
+#define MAXDFLSRCH		3	/* # default domain levels to try */
+#define MAXDNSRCH		6	/* max # domains in search path */
+#define MAXRESOLVSORT		10	/* number of net to sort on */
+
+struct __res_state {
+	int	retrans;		/* retransmition time interval */
+	int	retry;			/* number of times to retransmit */
+	unsigned long options;		/* option flags - see below. */
+	int	nscount;		/* number of name servers */
+	struct sockaddr_in
+		nsaddr_list[MAXNS];	/* address of name server */
+	unsigned short id;		/* current message id */
+	/* 2 byte hole here.  */
+	char	*dnsrch[MAXDNSRCH+1];	/* components of domain to search */
+	char	defdname[256];		/* default domain (deprecated) */
+	unsigned long pfcode;		/* RES_PRF_ flags - see below. */
+	unsigned ndots:4;		/* threshold for initial abs. query */
+	unsigned nsort:4;		/* number of elements in sort_list[] */
+	unsigned ipv6_unavail:1;	/* connecting to IPv6 server failed */
+	unsigned unused:23;
+	struct {
+		struct in_addr	addr;
+		uint32_t	mask;
+	} sort_list[MAXRESOLVSORT];
+	/* 4 byte hole here on 64-bit architectures.  */
+	void * __glibc_unused_qhook;
+	void * __glibc_unused_rhook;
+	int	res_h_errno;		/* last one set for this context */
+	int	_vcsock;		/* PRIVATE: for res_send VC i/o */
+	unsigned int _flags;		/* PRIVATE: see below */
+	/* 4 byte hole here on 64-bit architectures.  */
+	union {
+		char	pad[52];	/* On an i386 this means 512b total. */
+		struct {
+			uint16_t		nscount;
+			uint16_t		nsmap[MAXNS];
+			int			nssocks[MAXNS];
+			uint16_t		nscount6;
+			uint16_t		nsinit;
+			struct sockaddr_in6	*nsaddrs[MAXNS];
+#ifdef _LIBC
+			unsigned long long int	initstamp
+			  __attribute__((packed));
+#else
+			unsigned int		_initstamp[2];
+#endif
+		} _ext;
+	} _u;
+};
+
+typedef struct __res_state *res_state;
+
+#endif /* __res_state_defined */
diff --git a/resolv/resolv.h b/resolv/resolv.h
index 9fef8e9f24..1fb0ad459c 100644
--- a/resolv/resolv.h
+++ b/resolv/resolv.h
@@ -50,92 +50,30 @@
  */
 
 #ifndef _RESOLV_H_
+#define _RESOLV_H_
 
-/* These headers are needed for types used in the `struct res_state'
-   declaration.  */
+#include <sys/cdefs.h>
+#include <sys/param.h>
 #include <sys/types.h>
+#include <stdio.h>
 #include <netinet/in.h>
-
-#ifndef __need_res_state
-# define _RESOLV_H_
-
-# include <sys/param.h>
-# include <sys/cdefs.h>
-# include <stdio.h>
-# include <arpa/nameser.h>
-#endif
-
-#ifndef __res_state_defined
-# define __res_state_defined
+#include <arpa/nameser.h>
+#include <bits/types/res_state.h>
 
 /*
  * Global defines and variables for resolver stub.
  */
-# define MAXNS			3	/* max # name servers we'll track */
-# define MAXDFLSRCH		3	/* # default domain levels to try */
-# define MAXDNSRCH		6	/* max # domains in search path */
-# define LOCALDOMAINPARTS	2	/* min levels in name that is "local" */
+#define LOCALDOMAINPARTS	2	/* min levels in name that is "local" */
 
-# define RES_TIMEOUT		5	/* min. seconds between retries */
-# define MAXRESOLVSORT		10	/* number of net to sort on */
-# define RES_MAXNDOTS		15	/* should reflect bit field size */
-# define RES_MAXRETRANS		30	/* only for resolv.conf/RES_OPTIONS */
-# define RES_MAXRETRY		5	/* only for resolv.conf/RES_OPTIONS */
-# define RES_DFLRETRY		2	/* Default #/tries. */
-# define RES_MAXTIME		65535	/* Infinity, in milliseconds. */
+#define RES_TIMEOUT		5	/* min. seconds between retries */
+#define RES_MAXNDOTS		15	/* should reflect bit field size */
+#define RES_MAXRETRANS		30	/* only for resolv.conf/RES_OPTIONS */
+#define RES_MAXRETRY		5	/* only for resolv.conf/RES_OPTIONS */
+#define RES_DFLRETRY		2	/* Default #/tries. */
+#define RES_MAXTIME		65535	/* Infinity, in milliseconds. */
 
-struct __res_state {
-	int	retrans;		/* retransmition time interval */
-	int	retry;			/* number of times to retransmit */
-	unsigned long options;		/* option flags - see below. */
-	int	nscount;		/* number of name servers */
-	struct sockaddr_in
-		nsaddr_list[MAXNS];	/* address of name server */
-# define nsaddr	nsaddr_list[0]		/* for backward compatibility */
-	unsigned short id;		/* current message id */
-	/* 2 byte hole here.  */
-	char	*dnsrch[MAXDNSRCH+1];	/* components of domain to search */
-	char	defdname[256];		/* default domain (deprecated) */
-	unsigned long pfcode;		/* RES_PRF_ flags - see below. */
-	unsigned ndots:4;		/* threshold for initial abs. query */
-	unsigned nsort:4;		/* number of elements in sort_list[] */
-	unsigned ipv6_unavail:1;	/* connecting to IPv6 server failed */
-	unsigned unused:23;
-	struct {
-		struct in_addr	addr;
-		uint32_t	mask;
-	} sort_list[MAXRESOLVSORT];
-	/* 4 byte hole here on 64-bit architectures.  */
-	void * __glibc_unused_qhook;
-	void * __glibc_unused_rhook;
-	int	res_h_errno;		/* last one set for this context */
-	int	_vcsock;		/* PRIVATE: for res_send VC i/o */
-	unsigned int _flags;		/* PRIVATE: see below */
-	/* 4 byte hole here on 64-bit architectures.  */
-	union {
-		char	pad[52];	/* On an i386 this means 512b total. */
-		struct {
-			uint16_t		nscount;
-			uint16_t		nsmap[MAXNS];
-			int			nssocks[MAXNS];
-			uint16_t		nscount6;
-			uint16_t		nsinit;
-			struct sockaddr_in6	*nsaddrs[MAXNS];
-#ifdef _LIBC
-			unsigned long long int	initstamp
-			  __attribute__((packed));
-#else
-			unsigned int		_initstamp[2];
-#endif
-		} _ext;
-	} _u;
-};
+#define nsaddr	nsaddr_list[0]		/* for backward compatibility */
 
-typedef struct __res_state *res_state;
-# undef __need_res_state
-#endif
-
-#ifdef _RESOLV_H_
 /*
  * Revision information.  This is the release date in YYYYMMDD format.
  * It can change every day so the right thing to do with it is use it
@@ -361,7 +299,7 @@ int		res_nmkquery (res_state, int, const char *, int, int,
 int		res_nsend (res_state, const unsigned char *, int,
 			   unsigned char *, int) __THROW;
 void		res_nclose (res_state) __THROW;
+
 __END_DECLS
-#endif
 
 #endif /* !_RESOLV_H_ */
-- 
2.11.0

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 4/6] Remove __need macros from stdio.h and wchar.h.
  2017-05-20 23:18 [PATCH 0/6] Elimination of __need macros, round 3(?) Zack Weinberg
                   ` (3 preceding siblings ...)
  2017-05-20 23:18 ` [PATCH 2/6] Committed: Remove __need macros from signal.h Zack Weinberg
@ 2017-05-20 23:18 ` Zack Weinberg
  2017-05-20 23:18 ` [PATCH 5/6] Remove __need_IOV_MAX and __need_FOPEN_MAX Zack Weinberg
  2017-05-23 17:42 ` [PATCH 0/6] Elimination of __need macros, round 3(?) Chris Metcalf
  6 siblings, 0 replies; 14+ messages in thread
From: Zack Weinberg @ 2017-05-20 23:18 UTC (permalink / raw)
  To: libc-alpha

wint_t is a little finicky because it might be defined by stddef.h, which
belongs to the compiler.

In addition to the _types_, a bunch of other declarations shared between
wctype.h and wchar.h are factored out to their own header.

	* libio/bits/types/FILE.h, libio/bits/types/__FILE.h
	* wcsmbs/bits/types/mbstate_t.h, wcsmbs/bits/types/__mbstate_t.h
	* wcsmbs/bits/types/wint_t.h: New single-type definition files.
	* wctype/bits/wctype-wchar.h: New file holding declarations shared
	between wctype.h and wchar.h.

	* libio/Makefile, wcsmbs/Makefile, wctype/Makefile:
	Install them.

	* include/bits/types/FILE.h, include/bits/types/__FILE.h
	* include/bits/types/mbstate_t.h, include/bits/types/__mbstate_t.h
	* include/bits/types/wint_t.h, include/bits/wcsmbs-wchar.h:
	New wrappers.
	* include/stdio.h, include/wchar.h, include/wctype.h:
	No need to handle __need macros.

	* grp/grp.h, gshadow/gshadow.h, hurd/hurd.h, iconv/gconv.h
	* libio/stdio.h, mach/mach.h, misc/mntent.h, pwd/pwd.h
	* shadow/shadow.h, stdio-common/printf.h, wcsmbs/uchar.h
	* wcsmbs/wchar.h, wctype/wctype.h
	* sysdeps/generic/_G_config.h, sysdeps/unix/sysv/linux/_G_config.h
	Use the new files instead of __need macros.
---
 grp/grp.h                           |   3 +-
 gshadow/gshadow.h                   |   4 +-
 hurd/hurd.h                         |   3 +-
 iconv/gconv.h                       |   6 +-
 include/bits/types/FILE.h           |   1 +
 include/bits/types/__FILE.h         |   1 +
 include/bits/types/__mbstate_t.h    |   1 +
 include/bits/types/mbstate_t.h      |   1 +
 include/bits/types/wint_t.h         |   1 +
 include/bits/wctype-wchar.h         |   1 +
 include/stdio.h                     |  16 ++--
 include/wchar.h                     |  10 +-
 include/wctype.h                    |  29 +-----
 libio/Makefile                      |   3 +-
 libio/bits/types/FILE.h             |   9 ++
 libio/bits/types/__FILE.h           |   7 ++
 libio/stdio.h                       |  47 ++--------
 mach/mach.h                         |   6 +-
 misc/mntent.h                       |   4 +-
 pwd/pwd.h                           |   3 +-
 shadow/shadow.h                     |   4 +-
 stdio-common/printf.h               |   5 +-
 sysdeps/generic/_G_config.h         |   7 +-
 sysdeps/unix/sysv/linux/_G_config.h |   7 +-
 wcsmbs/Makefile                     |   3 +-
 wcsmbs/bits/types/__mbstate_t.h     |  23 +++++
 wcsmbs/bits/types/mbstate_t.h       |   8 ++
 wcsmbs/bits/types/wint_t.h          |  23 +++++
 wcsmbs/uchar.h                      |   9 +-
 wcsmbs/wchar.h                      | 125 +++++++------------------
 wctype/Makefile                     |   2 +-
 wctype/bits/wctype-wchar.h          | 173 ++++++++++++++++++++++++++++++++++
 wctype/wctype.h                     | 179 +++---------------------------------
 33 files changed, 337 insertions(+), 387 deletions(-)
 create mode 100644 include/bits/types/FILE.h
 create mode 100644 include/bits/types/__FILE.h
 create mode 100644 include/bits/types/__mbstate_t.h
 create mode 100644 include/bits/types/mbstate_t.h
 create mode 100644 include/bits/types/wint_t.h
 create mode 100644 include/bits/wctype-wchar.h
 create mode 100644 libio/bits/types/FILE.h
 create mode 100644 libio/bits/types/__FILE.h
 create mode 100644 wcsmbs/bits/types/__mbstate_t.h
 create mode 100644 wcsmbs/bits/types/mbstate_t.h
 create mode 100644 wcsmbs/bits/types/wint_t.h
 create mode 100644 wctype/bits/wctype-wchar.h

diff --git a/grp/grp.h b/grp/grp.h
index d829e4c626..0f833fff89 100644
--- a/grp/grp.h
+++ b/grp/grp.h
@@ -49,8 +49,7 @@ struct group
 
 
 #ifdef __USE_MISC
-# define __need_FILE
-# include <stdio.h>
+# include <bits/types/FILE.h>
 #endif
 
 
diff --git a/gshadow/gshadow.h b/gshadow/gshadow.h
index a93b3bd8b2..70ab83ddbd 100644
--- a/gshadow/gshadow.h
+++ b/gshadow/gshadow.h
@@ -21,11 +21,9 @@
 #define _GSHADOW_H	1
 
 #include <features.h>
-
 #include <paths.h>
+#include <bits/types/FILE.h>
 
-#define	__need_FILE
-#include <stdio.h>
 #define __need_size_t
 #include <stddef.h>
 
diff --git a/hurd/hurd.h b/hurd/hurd.h
index e51d3c58a7..3caa69fbdf 100644
--- a/hurd/hurd.h
+++ b/hurd/hurd.h
@@ -141,8 +141,7 @@ extern struct mutex _hurd_brk_lock;
 
 extern int _hurd_set_brk (vm_address_t newbrk);
 \f
-#define __need_FILE
-#include <stdio.h>
+#include <bits/types/FILE.h>
 
 /* Calls to get and set basic ports.  */
 
diff --git a/iconv/gconv.h b/iconv/gconv.h
index 71d91a0ef3..db678dba49 100644
--- a/iconv/gconv.h
+++ b/iconv/gconv.h
@@ -23,9 +23,9 @@
 #define _GCONV_H	1
 
 #include <features.h>
-#define __need_mbstate_t
-#define __need_wint_t
-#include <wchar.h>
+#include <bits/types/__mbstate_t.h>
+#include <bits/types/wint_t.h>
+
 #define __need_size_t
 #define __need_wchar_t
 #include <stddef.h>
diff --git a/include/bits/types/FILE.h b/include/bits/types/FILE.h
new file mode 100644
index 0000000000..09b599baa0
--- /dev/null
+++ b/include/bits/types/FILE.h
@@ -0,0 +1 @@
+#include <libio/bits/types/FILE.h>
diff --git a/include/bits/types/__FILE.h b/include/bits/types/__FILE.h
new file mode 100644
index 0000000000..236f60bacd
--- /dev/null
+++ b/include/bits/types/__FILE.h
@@ -0,0 +1 @@
+#include <libio/bits/types/__FILE.h>
diff --git a/include/bits/types/__mbstate_t.h b/include/bits/types/__mbstate_t.h
new file mode 100644
index 0000000000..13e764e8c9
--- /dev/null
+++ b/include/bits/types/__mbstate_t.h
@@ -0,0 +1 @@
+#include <wcsmbs/bits/types/__mbstate_t.h>
diff --git a/include/bits/types/mbstate_t.h b/include/bits/types/mbstate_t.h
new file mode 100644
index 0000000000..99ec08a91a
--- /dev/null
+++ b/include/bits/types/mbstate_t.h
@@ -0,0 +1 @@
+#include <wcsmbs/bits/types/mbstate_t.h>
diff --git a/include/bits/types/wint_t.h b/include/bits/types/wint_t.h
new file mode 100644
index 0000000000..f1e373d294
--- /dev/null
+++ b/include/bits/types/wint_t.h
@@ -0,0 +1 @@
+#include <wcsmbs/bits/types/wint_t.h>
diff --git a/include/bits/wctype-wchar.h b/include/bits/wctype-wchar.h
new file mode 100644
index 0000000000..8273cd743e
--- /dev/null
+++ b/include/bits/wctype-wchar.h
@@ -0,0 +1 @@
+#include <wctype/bits/wctype-wchar.h>
diff --git a/include/stdio.h b/include/stdio.h
index ed6593ba50..f68f633bd6 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -1,8 +1,6 @@
 #ifndef _STDIO_H
-# if defined _ISOMAC || defined __need_FILE || defined __need___FILE
-#  include <libio/stdio.h>
-# else
-#  include <libio/stdio.h>
+# include <libio/stdio.h>
+# ifndef _ISOMAC
 
 /* Now define the internal interfaces.  */
 
@@ -71,11 +69,11 @@ libc_hidden_proto (__isoc99_vfscanf)
 extern FILE *__new_tmpfile (void);
 extern FILE *__old_tmpfile (void);
 
-
-
 #  define __need_size_t
-#  define __need_wint_t
 #  include <stddef.h>
+
+#  include <bits/types/wint_t.h>
+
 /* Generate a unique file name (and possibly open it).  */
 extern int __path_search (char *__tmpl, size_t __tmpl_len,
 			  const char *__dir, const char *__pfx,
@@ -183,5 +181,5 @@ libc_hidden_proto (__obstack_vprintf_chk)
 extern FILE * __fmemopen (void *buf, size_t len, const char *mode);
 libc_hidden_proto (__fmemopen)
 
-# endif
-#endif
+# endif /* not _ISOMAC */
+#endif /* stdio.h */
diff --git a/include/wchar.h b/include/wchar.h
index e2579a176a..6a7af27c47 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -1,8 +1,6 @@
 #ifndef _WCHAR_H
-#include <wcsmbs/wchar.h>
-
+# include <wcsmbs/wchar.h>
 # ifndef _ISOMAC
-# ifdef _WCHAR_H
 
 extern __typeof (wcscasecmp_l) __wcscasecmp_l;
 extern __typeof (wcsncasecmp_l) __wcsncasecmp_l;
@@ -216,10 +214,4 @@ extern size_t __mbsrtowcs_l (wchar_t *dst, const char **src, size_t len,
 #  define __mbsinit(state) ((state)->__count == 0)
 
 # endif
-# endif
 #endif
-
-/* Undefine all __need_* constants in case we are included to get those
-   constants but the whole file was already read.  */
-#undef __need_mbstate_t
-#undef __need_wint_t
diff --git a/include/wctype.h b/include/wctype.h
index a71b10377b..5fd3f863ae 100644
--- a/include/wctype.h
+++ b/include/wctype.h
@@ -1,30 +1,7 @@
 #ifndef _WCTYPE_H
+#include <wctype/wctype.h>
 
 #ifndef _ISOMAC
-/* We try to get wint_t from <stddef.h>, but not all GCC versions define it
-   there.  So define it ourselves if it remains undefined.  */
-# define __need_wint_t
-# include <stddef.h>
-# ifndef _WINT_T
-/* Integral type unchanged by default argument promotions that can
-   hold any value corresponding to members of the extended character
-   set, as well as at least one value that does not correspond to any
-   member of the extended character set.  */
-#  define _WINT_T
-typedef unsigned int wint_t;
-# endif
-
-/* Need to repeat these prototypes here, as wctype/wctype.h defines all
-   these as macros and thus we couldn't add libc_hidden_proto.  */
-
-extern int iswalpha (wint_t __wc);
-extern int iswalnum (wint_t __wc);
-extern int iswdigit (wint_t __wc);
-extern int iswlower (wint_t __wc);
-extern int iswspace (wint_t __wc);
-extern int iswxdigit (wint_t __wc);
-extern wint_t towlower (wint_t __wc);
-extern wint_t towupper (wint_t __wc);
 
 libc_hidden_proto (iswalpha)
 libc_hidden_proto (iswalnum)
@@ -34,11 +11,7 @@ libc_hidden_proto (iswspace)
 libc_hidden_proto (iswxdigit)
 libc_hidden_proto (towlower)
 libc_hidden_proto (towupper)
-#endif
 
-#include <wctype/wctype.h>
-
-#ifndef _ISOMAC
 /* Internal interfaces.  */
 extern int __iswspace (wint_t __wc);
 extern int __iswctype (wint_t __wc, wctype_t __desc);
diff --git a/libio/Makefile b/libio/Makefile
index be252f740f..a002a3365c 100644
--- a/libio/Makefile
+++ b/libio/Makefile
@@ -23,7 +23,8 @@ subdir	:= libio
 include ../Makeconfig
 
 headers	:= stdio.h libio.h _G_config.h bits/stdio.h \
-	   bits/sys_errlist.h bits/stdio2.h bits/stdio-ldbl.h bits/libio-ldbl.h
+	   bits/sys_errlist.h bits/stdio2.h bits/stdio-ldbl.h bits/libio-ldbl.h \
+	   bits/types/FILE.h bits/types/__FILE.h
 
 routines	:=							      \
 	filedoalloc iofclose iofdopen iofflush iofgetpos iofgets iofopen      \
diff --git a/libio/bits/types/FILE.h b/libio/bits/types/FILE.h
new file mode 100644
index 0000000000..f268263209
--- /dev/null
+++ b/libio/bits/types/FILE.h
@@ -0,0 +1,9 @@
+#ifndef __FILE_defined
+#define __FILE_defined 1
+
+struct _IO_FILE;
+
+/* The opaque type of streams.  This is the definition used elsewhere.  */
+typedef struct _IO_FILE FILE;
+
+#endif
diff --git a/libio/bits/types/__FILE.h b/libio/bits/types/__FILE.h
new file mode 100644
index 0000000000..06dd79bc83
--- /dev/null
+++ b/libio/bits/types/__FILE.h
@@ -0,0 +1,7 @@
+#ifndef ____FILE_defined
+#define ____FILE_defined 1
+
+struct _IO_FILE;
+typedef struct _IO_FILE __FILE;
+
+#endif
diff --git a/libio/stdio.h b/libio/stdio.h
index 422f39daf5..47490c8299 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -21,48 +21,21 @@
  */
 
 #ifndef _STDIO_H
+#define _STDIO_H	1
 
-#if !defined __need_FILE && !defined __need___FILE
-# define _STDIO_H	1
-# define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
-# include <bits/libc-header-start.h>
+#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+#include <bits/libc-header-start.h>
 
 __BEGIN_DECLS
 
-# define __need_size_t
-# define __need_NULL
-# include <stddef.h>
+#define __need_size_t
+#define __need_NULL
+#include <stddef.h>
 
-# include <bits/types.h>
-# define __need_FILE
-# define __need___FILE
-#endif /* Don't need FILE.  */
+#include <bits/types.h>
+#include <bits/types/__FILE.h>
+#include <bits/types/FILE.h>
 
-
-#if !defined __FILE_defined && defined __need_FILE
-
-/* Define outside of namespace so the C++ is happy.  */
-struct _IO_FILE;
-
-/* The opaque type of streams.  This is the definition used elsewhere.  */
-typedef struct _IO_FILE FILE;
-
-# define __FILE_defined	1
-#endif /* FILE not defined.  */
-#undef	__need_FILE
-
-
-#if !defined ____FILE_defined && defined __need___FILE
-
-/* The opaque type of streams.  This is the definition used elsewhere.  */
-typedef struct _IO_FILE __FILE;
-
-# define ____FILE_defined	1
-#endif /* __FILE not defined.  */
-#undef	__need___FILE
-
-
-#ifdef	_STDIO_H
 #define _STDIO_USES_IOSTREAM
 
 #include <libio.h>
@@ -895,5 +868,3 @@ extern void funlockfile (FILE *__stream) __THROW;
 __END_DECLS
 
 #endif /* <stdio.h> included.  */
-
-#endif /* !_STDIO_H */
diff --git a/mach/mach.h b/mach/mach.h
index 3ceb7b6c8c..42605af865 100644
--- a/mach/mach.h
+++ b/mach/mach.h
@@ -20,10 +20,8 @@
 
 #define	_MACH_H	1
 
-/* We must include this before using __need_FILE with <stdio.h> below.  */
 #include <features.h>
 
-
 /* Get the basic types used by Mach.  */
 #include <mach/mach_types.h>
 
@@ -79,9 +77,7 @@ extern void
 __mach_msg_destroy (mach_msg_header_t *msg),
 mach_msg_destroy (mach_msg_header_t *msg);
 
-
-#define __need_FILE
-#include <stdio.h>
+#include <bits/types/FILE.h>
 
 /* Open a stream on a Mach device.  */
 extern FILE *mach_open_devstream (mach_port_t device_port, const char *mode);
diff --git a/misc/mntent.h b/misc/mntent.h
index 039a454512..e54e165637 100644
--- a/misc/mntent.h
+++ b/misc/mntent.h
@@ -20,10 +20,8 @@
 #define	_MNTENT_H	1
 
 #include <features.h>
-#define __need_FILE
-#include <stdio.h>
 #include <paths.h>
-
+#include <bits/types/FILE.h>
 
 /* File listing canonical interesting mount points.  */
 #define	MNTTAB		_PATH_MNTTAB	/* Deprecated alias.  */
diff --git a/pwd/pwd.h b/pwd/pwd.h
index fabd95044c..100f33eb4e 100644
--- a/pwd/pwd.h
+++ b/pwd/pwd.h
@@ -59,8 +59,7 @@ struct passwd
 
 
 #ifdef __USE_MISC
-# define __need_FILE
-# include <stdio.h>
+# include <bits/types/FILE.h>
 #endif
 
 
diff --git a/shadow/shadow.h b/shadow/shadow.h
index 855fe632a1..f55c946f59 100644
--- a/shadow/shadow.h
+++ b/shadow/shadow.h
@@ -24,11 +24,11 @@
 
 #include <paths.h>
 
-#define	__need_FILE
-#include <stdio.h>
 #define __need_size_t
 #include <stddef.h>
 
+#include <bits/types/FILE.h>
+
 /* Paths to the user database files.  */
 #define	SHADOW _PATH_SHADOW
 
diff --git a/stdio-common/printf.h b/stdio-common/printf.h
index 5d82e8d01e..b90fae68f3 100644
--- a/stdio-common/printf.h
+++ b/stdio-common/printf.h
@@ -22,11 +22,12 @@
 
 __BEGIN_DECLS
 
-#define	__need_FILE
-#include <stdio.h>
+#include <bits/types/FILE.h>
+
 #define	__need_size_t
 #define __need_wchar_t
 #include <stddef.h>
+
 #include <stdarg.h>
 
 
diff --git a/sysdeps/generic/_G_config.h b/sysdeps/generic/_G_config.h
index f44a3d4eee..c49eed395b 100644
--- a/sysdeps/generic/_G_config.h
+++ b/sysdeps/generic/_G_config.h
@@ -13,11 +13,12 @@
 #endif
 #define __need_NULL
 #include <stddef.h>
-#define __need_mbstate_t
+
+#include <bits/types/__mbstate_t.h>
 #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# define __need_wint_t
+# include <bits/types/wint_t.h>
 #endif
-#include <wchar.h>
+
 typedef struct
 {
   __off_t __pos;
diff --git a/sysdeps/unix/sysv/linux/_G_config.h b/sysdeps/unix/sysv/linux/_G_config.h
index abec245606..3bc6cfd595 100644
--- a/sysdeps/unix/sysv/linux/_G_config.h
+++ b/sysdeps/unix/sysv/linux/_G_config.h
@@ -13,11 +13,12 @@
 #endif
 #define __need_NULL
 #include <stddef.h>
-#define __need_mbstate_t
+
+#include <bits/types/__mbstate_t.h>
 #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# define __need_wint_t
+# include <bits/types/wint_t.h>
 #endif
-#include <wchar.h>
+
 typedef struct
 {
   __off_t __pos;
diff --git a/wcsmbs/Makefile b/wcsmbs/Makefile
index d6b214b2ab..08b1de11a8 100644
--- a/wcsmbs/Makefile
+++ b/wcsmbs/Makefile
@@ -22,7 +22,8 @@ subdir	:= wcsmbs
 
 include ../Makeconfig
 
-headers	:= wchar.h bits/wchar.h bits/wchar2.h bits/wchar-ldbl.h uchar.h
+headers	:= wchar.h bits/wchar.h bits/wchar2.h bits/wchar-ldbl.h uchar.h \
+	   bits/types/__mbstate_t.h bits/types/mbstate_t.h bits/types/wint_t.h
 
 routines := wcscat wcschr wcscmp wcscpy wcscspn wcsdup wcslen wcsncat \
 	    wcsncmp wcsncpy wcspbrk wcsrchr wcsspn wcstok wcsstr wmemchr \
diff --git a/wcsmbs/bits/types/__mbstate_t.h b/wcsmbs/bits/types/__mbstate_t.h
new file mode 100644
index 0000000000..1d8a4e28d1
--- /dev/null
+++ b/wcsmbs/bits/types/__mbstate_t.h
@@ -0,0 +1,23 @@
+#ifndef ____mbstate_t_defined
+#define ____mbstate_t_defined 1
+
+/* Integral type unchanged by default argument promotions that can
+   hold any value corresponding to members of the extended character
+   set, as well as at least one value that does not correspond to any
+   member of the extended character set.  */
+#ifndef __WINT_TYPE__
+# define __WINT_TYPE__ unsigned int
+#endif
+
+/* Conversion state information.  */
+typedef struct
+{
+  int __count;
+  union
+  {
+    __WINT_TYPE__ __wch;
+    char __wchb[4];
+  } __value;		/* Value so far.  */
+} __mbstate_t;
+
+#endif
diff --git a/wcsmbs/bits/types/mbstate_t.h b/wcsmbs/bits/types/mbstate_t.h
new file mode 100644
index 0000000000..8d1baa5c3b
--- /dev/null
+++ b/wcsmbs/bits/types/mbstate_t.h
@@ -0,0 +1,8 @@
+#ifndef __mbstate_t_defined
+#define __mbstate_t_defined 1
+
+#include <bits/types/__mbstate_t.h>
+
+typedef __mbstate_t mbstate_t;
+
+#endif
diff --git a/wcsmbs/bits/types/wint_t.h b/wcsmbs/bits/types/wint_t.h
new file mode 100644
index 0000000000..fbd63dbc84
--- /dev/null
+++ b/wcsmbs/bits/types/wint_t.h
@@ -0,0 +1,23 @@
+#ifndef __wint_t_defined
+#define __wint_t_defined 1
+
+/* Some versions of stddef.h provide wint_t, even though neither the
+   C nor C++ standards, nor POSIX, specifies this.  We assume that
+   stddef.h will define the macro _WINT_T if and only if it provides
+   wint_t, and conversely, that it will avoid providing wint_t if
+   _WINT_T is already defined.  */
+#ifndef _WINT_T
+#define _WINT_T 1
+
+/* Integral type unchanged by default argument promotions that can
+   hold any value corresponding to members of the extended character
+   set, as well as at least one value that does not correspond to any
+   member of the extended character set.  */
+#ifndef __WINT_TYPE__
+# define __WINT_TYPE__ unsigned int
+#endif
+
+typedef __WINT_TYPE__ wint_t;
+
+#endif /* _WINT_T */
+#endif /* bits/types/wint_t.h */
diff --git a/wcsmbs/uchar.h b/wcsmbs/uchar.h
index a6569825fd..f937519cf4 100644
--- a/wcsmbs/uchar.h
+++ b/wcsmbs/uchar.h
@@ -27,15 +27,8 @@
 
 #define __need_size_t
 #include <stddef.h>
-#define __need_mbstate_t
-#include <wchar.h>
-
-#ifndef __mbstate_t_defined
-/* Public type.  */
-typedef __mbstate_t mbstate_t;
-# define __mbstate_t_defined 1
-#endif
 
+#include <bits/types/mbstate_t.h>
 
 #if defined __GNUC__ && !defined __USE_ISOCXX11
 /* Define the 16-bit and 32-bit character types.  Use the information
diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
index 79be9fc41d..d389428daa 100644
--- a/wcsmbs/wchar.h
+++ b/wcsmbs/wchar.h
@@ -21,83 +21,33 @@
  */
 
 #ifndef _WCHAR_H
+#define _WCHAR_H 1
 
-#if !defined __need_mbstate_t && !defined __need_wint_t
-# define _WCHAR_H 1
-# define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
-# include <bits/libc-header-start.h>
+#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+#include <bits/libc-header-start.h>
+
+#define __need_size_t
+#define __need_wchar_t
+#define __need_NULL
+#include <stddef.h>
+
+#define __need___va_list
+#include <stdarg.h>
+
+#include <bits/wchar.h>
+#include <bits/types/wint_t.h>
+#include <bits/types/mbstate_t.h>
+#include <bits/types/__FILE.h>
+
+#if defined __USE_UNIX98 || defined __USE_XOPEN2K
+# include <bits/types/FILE.h>
 #endif
 
-#ifdef _WCHAR_H
-/* Get FILE definition.  */
-# define __need___FILE
-# if defined __USE_UNIX98 || defined __USE_XOPEN2K
-#  define __need_FILE
-# endif
-# include <stdio.h>
-/* Get va_list definition.  */
-# define __need___va_list
-# include <stdarg.h>
-
-# include <bits/wchar.h>
-
-/* Get size_t, wchar_t, wint_t and NULL from <stddef.h>.  */
-# define __need_size_t
-# define __need_wchar_t
-# define __need_NULL
-#endif
-#if defined _WCHAR_H || defined __need_wint_t || !defined __WINT_TYPE__
-# undef __need_wint_t
-# define __need_wint_t
-# include <stddef.h>
-
-/* We try to get wint_t from <stddef.h>, but not all GCC versions define it
-   there.  So define it ourselves if it remains undefined.  */
-# ifndef _WINT_T
-/* Integral type unchanged by default argument promotions that can
-   hold any value corresponding to members of the extended character
-   set, as well as at least one value that does not correspond to any
-   member of the extended character set.  */
-#  define _WINT_T
-typedef unsigned int wint_t;
-# endif
-
 /* Tell the caller that we provide correct C++ prototypes.  */
-# if defined __cplusplus && __GNUC_PREREQ (4, 4)
-#  define __CORRECT_ISO_CPP_WCHAR_H_PROTO
-# endif
+#if defined __cplusplus && __GNUC_PREREQ (4, 4)
+# define __CORRECT_ISO_CPP_WCHAR_H_PROTO
 #endif
 
-#if (defined _WCHAR_H || defined __need_mbstate_t) && !defined ____mbstate_t_defined
-# define ____mbstate_t_defined	1
-/* Conversion state information.  */
-typedef struct
-{
-  int __count;
-  union
-  {
-# ifdef __WINT_TYPE__
-    __WINT_TYPE__ __wch;
-# else
-    wint_t __wch;
-# endif
-    char __wchb[4];
-  } __value;		/* Value so far.  */
-} __mbstate_t;
-#endif
-#undef __need_mbstate_t
-
-
-/* The rest of the file is only used if used if __need_mbstate_t is not
-   defined.  */
-#ifdef _WCHAR_H
-
-# ifndef __mbstate_t_defined
-/* Public type.  */
-typedef __mbstate_t mbstate_t;
-#  define __mbstate_t_defined 1
-# endif
-
 #ifndef WCHAR_MIN
 /* These constants might also be defined in <inttypes.h>.  */
 # define WCHAR_MIN __WCHAR_MIN
@@ -108,13 +58,18 @@ typedef __mbstate_t mbstate_t;
 # define WEOF (0xffffffffu)
 #endif
 
-/* For XPG4 compliance we have to define the stuff from <wctype.h> here
-   as well.  */
-#if defined __USE_XOPEN && !defined __USE_UNIX98
-# include <wctype.h>
+/* All versions of XPG prior to the publication of ISO C99 required
+   the bulk of <wctype.h>'s declarations to appear in this header
+   (because <wctype.h> did not exist prior to C99).  In POSIX.1-2001
+   those declarations were marked as XSI extensions; in -2008 they
+   were additionally marked as obsolescent.  _GNU_SOURCE mode
+   anticipates the removal of these declarations in the next revision
+   of POSIX.  */
+#if (defined __USE_XOPEN && !defined __USE_GNU \
+     && !(defined __USE_XOPEN2K && !defined __USE_XOPEN2KXSI))
+# include <bits/wctype-wchar.h>
 #endif
 
-
 __BEGIN_DECLS
 
 /* This incomplete type is defined in <time.h> but needed here because
@@ -823,17 +778,6 @@ extern size_t wcsftime_l (wchar_t *__restrict __s, size_t __maxsize,
 			  __locale_t __loc) __THROW;
 # endif
 
-/* The X/Open standard demands that most of the functions defined in
-   the <wctype.h> header must also appear here.  This is probably
-   because some X/Open members wrote their implementation before the
-   ISO C standard was published and introduced the better solution.
-   We have to provide these definitions for compliance reasons but we
-   do this nonsense only if really necessary.  */
-#if defined __USE_UNIX98 && !defined __USE_GNU
-# define __need_iswxxx
-# include <wctype.h>
-#endif
-
 /* Define some macros helping to catch buffer overflows.  */
 #if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function
 # include <bits/wchar2.h>
@@ -845,11 +789,4 @@ extern size_t wcsftime_l (wchar_t *__restrict __s, size_t __maxsize,
 
 __END_DECLS
 
-#endif	/* _WCHAR_H defined */
-
 #endif /* wchar.h  */
-
-/* Undefine all __need_* constants in case we are included to get those
-   constants but the whole file was already read.  */
-#undef __need_mbstate_t
-#undef __need_wint_t
diff --git a/wctype/Makefile b/wctype/Makefile
index 18756c38e6..2cb2a6dc86 100644
--- a/wctype/Makefile
+++ b/wctype/Makefile
@@ -22,7 +22,7 @@ subdir	:= wctype
 
 include ../Makeconfig
 
-headers		:= wctype.h
+headers		:= wctype.h bits/wctype-wchar.h
 routines	:= wcfuncs wctype iswctype wctrans towctrans \
 		   wcfuncs_l wctype_l iswctype_l wctrans_l towctrans_l
 
diff --git a/wctype/bits/wctype-wchar.h b/wctype/bits/wctype-wchar.h
new file mode 100644
index 0000000000..df5fd0396f
--- /dev/null
+++ b/wctype/bits/wctype-wchar.h
@@ -0,0 +1,173 @@
+/* Copyright (C) 1996-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/*
+ *	ISO C99 Standard: 7.25
+ *	Wide character classification and mapping utilities  <wctype.h>
+ */
+
+#ifndef _BITS_WCTYPE_WCHAR_H
+#define _BITS_WCTYPE_WCHAR_H 1
+
+#if !defined _WCTYPE_H && !defined _WCHAR_H
+#error "Never include <bits/wctype-wchar.h> directly; include <wctype.h> or <wchar.h> instead."
+#endif
+
+#include <bits/types.h>
+#include <bits/types/wint_t.h>
+
+/* The definitions in this header are specified to appear in <wctype.h>
+   in ISO C99, but in <wchar.h> in Unix98.  _GNU_SOURCE follows C99.  */
+
+/* Scalar type that can hold values which represent locale-specific
+   character classifications.  */
+typedef unsigned long int wctype_t;
+
+# ifndef _ISwbit
+/* The characteristics are stored always in network byte order (big
+   endian).  We define the bit value interpretations here dependent on the
+   machine's byte order.  */
+
+#  include <endian.h>
+#  if __BYTE_ORDER == __BIG_ENDIAN
+#   define _ISwbit(bit)	(1 << (bit))
+#  else /* __BYTE_ORDER == __LITTLE_ENDIAN */
+#   define _ISwbit(bit)	\
+	((bit) < 8 ? (int) ((1UL << (bit)) << 24)			      \
+	 : ((bit) < 16 ? (int) ((1UL << (bit)) << 8)			      \
+	    : ((bit) < 24 ? (int) ((1UL << (bit)) >> 8)			      \
+	       : (int) ((1UL << (bit)) >> 24))))
+#  endif
+
+enum
+{
+  __ISwupper = 0,			/* UPPERCASE.  */
+  __ISwlower = 1,			/* lowercase.  */
+  __ISwalpha = 2,			/* Alphabetic.  */
+  __ISwdigit = 3,			/* Numeric.  */
+  __ISwxdigit = 4,			/* Hexadecimal numeric.  */
+  __ISwspace = 5,			/* Whitespace.  */
+  __ISwprint = 6,			/* Printing.  */
+  __ISwgraph = 7,			/* Graphical.  */
+  __ISwblank = 8,			/* Blank (usually SPC and TAB).  */
+  __ISwcntrl = 9,			/* Control character.  */
+  __ISwpunct = 10,			/* Punctuation.  */
+  __ISwalnum = 11,			/* Alphanumeric.  */
+
+  _ISwupper = _ISwbit (__ISwupper),	/* UPPERCASE.  */
+  _ISwlower = _ISwbit (__ISwlower),	/* lowercase.  */
+  _ISwalpha = _ISwbit (__ISwalpha),	/* Alphabetic.  */
+  _ISwdigit = _ISwbit (__ISwdigit),	/* Numeric.  */
+  _ISwxdigit = _ISwbit (__ISwxdigit),	/* Hexadecimal numeric.  */
+  _ISwspace = _ISwbit (__ISwspace),	/* Whitespace.  */
+  _ISwprint = _ISwbit (__ISwprint),	/* Printing.  */
+  _ISwgraph = _ISwbit (__ISwgraph),	/* Graphical.  */
+  _ISwblank = _ISwbit (__ISwblank),	/* Blank (usually SPC and TAB).  */
+  _ISwcntrl = _ISwbit (__ISwcntrl),	/* Control character.  */
+  _ISwpunct = _ISwbit (__ISwpunct),	/* Punctuation.  */
+  _ISwalnum = _ISwbit (__ISwalnum)	/* Alphanumeric.  */
+};
+# endif /* Not _ISwbit  */
+
+
+__BEGIN_DECLS
+
+/*
+ * Wide-character classification functions: 7.15.2.1.
+ */
+
+/* Test for any wide character for which `iswalpha' or `iswdigit' is
+   true.  */
+extern int iswalnum (wint_t __wc) __THROW;
+
+/* Test for any wide character for which `iswupper' or 'iswlower' is
+   true, or any wide character that is one of a locale-specific set of
+   wide-characters for which none of `iswcntrl', `iswdigit',
+   `iswpunct', or `iswspace' is true.  */
+extern int iswalpha (wint_t __wc) __THROW;
+
+/* Test for any control wide character.  */
+extern int iswcntrl (wint_t __wc) __THROW;
+
+/* Test for any wide character that corresponds to a decimal-digit
+   character.  */
+extern int iswdigit (wint_t __wc) __THROW;
+
+/* Test for any wide character for which `iswprint' is true and
+   `iswspace' is false.  */
+extern int iswgraph (wint_t __wc) __THROW;
+
+/* Test for any wide character that corresponds to a lowercase letter
+   or is one of a locale-specific set of wide characters for which
+   none of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true.  */
+extern int iswlower (wint_t __wc) __THROW;
+
+/* Test for any printing wide character.  */
+extern int iswprint (wint_t __wc) __THROW;
+
+/* Test for any printing wide character that is one of a
+   locale-specific et of wide characters for which neither `iswspace'
+   nor `iswalnum' is true.  */
+extern int iswpunct (wint_t __wc) __THROW;
+
+/* Test for any wide character that corresponds to a locale-specific
+   set of wide characters for which none of `iswalnum', `iswgraph', or
+   `iswpunct' is true.  */
+extern int iswspace (wint_t __wc) __THROW;
+
+/* Test for any wide character that corresponds to an uppercase letter
+   or is one of a locale-specific set of wide character for which none
+   of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true.  */
+extern int iswupper (wint_t __wc) __THROW;
+
+/* Test for any wide character that corresponds to a hexadecimal-digit
+   character equivalent to that performed be the functions described
+   in the previous subclause.  */
+extern int iswxdigit (wint_t __wc) __THROW;
+
+/* Test for any wide character that corresponds to a standard blank
+   wide character or a locale-specific set of wide characters for
+   which `iswalnum' is false.  */
+# ifdef __USE_ISOC99
+extern int iswblank (wint_t __wc) __THROW;
+# endif
+
+/*
+ * Extensible wide-character classification functions: 7.15.2.2.
+ */
+
+/* Construct value that describes a class of wide characters identified
+   by the string argument PROPERTY.  */
+extern wctype_t wctype (const char *__property) __THROW;
+
+/* Determine whether the wide-character WC has the property described by
+   DESC.  */
+extern int iswctype (wint_t __wc, wctype_t __desc) __THROW;
+
+/*
+ * Wide-character case-mapping functions: 7.15.3.1.
+ */
+
+/* Converts an uppercase letter to the corresponding lowercase letter.  */
+extern wint_t towlower (wint_t __wc) __THROW;
+
+/* Converts an lowercase letter to the corresponding uppercase letter.  */
+extern wint_t towupper (wint_t __wc) __THROW;
+
+__END_DECLS
+
+#endif /* bits/wctype-wchar.h.  */
diff --git a/wctype/wctype.h b/wctype/wctype.h
index 73165bbda2..962aef1de6 100644
--- a/wctype/wctype.h
+++ b/wctype/wctype.h
@@ -21,179 +21,21 @@
  */
 
 #ifndef _WCTYPE_H
+#define _WCTYPE_H 1
 
 #include <features.h>
 #include <bits/types.h>
-
-#ifndef __need_iswxxx
-# define _WCTYPE_H	1
-
-/* Get wint_t from <wchar.h>.  */
-# define __need_wint_t
-# include <wchar.h>
+#include <bits/types/wint_t.h>
 
 /* Constant expression of type `wint_t' whose value does not correspond
    to any member of the extended character set.  */
-# ifndef WEOF
-#  define WEOF (0xffffffffu)
-# endif
+#ifndef WEOF
+# define WEOF (0xffffffffu)
 #endif
-#undef __need_iswxxx
 
-
-/* The following part is also used in the <wcsmbs.h> header when compiled
-   in the Unix98 compatibility mode.  */
-#ifndef __iswxxx_defined
-# define __iswxxx_defined	1
-
-/* Scalar type that can hold values which represent locale-specific
-   character classifications.  */
-typedef unsigned long int wctype_t;
-
-# ifndef _ISwbit
-/* The characteristics are stored always in network byte order (big
-   endian).  We define the bit value interpretations here dependent on the
-   machine's byte order.  */
-
-#  include <endian.h>
-#  if __BYTE_ORDER == __BIG_ENDIAN
-#   define _ISwbit(bit)	(1 << (bit))
-#  else /* __BYTE_ORDER == __LITTLE_ENDIAN */
-#   define _ISwbit(bit)	\
-	((bit) < 8 ? (int) ((1UL << (bit)) << 24)			      \
-	 : ((bit) < 16 ? (int) ((1UL << (bit)) << 8)			      \
-	    : ((bit) < 24 ? (int) ((1UL << (bit)) >> 8)			      \
-	       : (int) ((1UL << (bit)) >> 24))))
-#  endif
-
-enum
-{
-  __ISwupper = 0,			/* UPPERCASE.  */
-  __ISwlower = 1,			/* lowercase.  */
-  __ISwalpha = 2,			/* Alphabetic.  */
-  __ISwdigit = 3,			/* Numeric.  */
-  __ISwxdigit = 4,			/* Hexadecimal numeric.  */
-  __ISwspace = 5,			/* Whitespace.  */
-  __ISwprint = 6,			/* Printing.  */
-  __ISwgraph = 7,			/* Graphical.  */
-  __ISwblank = 8,			/* Blank (usually SPC and TAB).  */
-  __ISwcntrl = 9,			/* Control character.  */
-  __ISwpunct = 10,			/* Punctuation.  */
-  __ISwalnum = 11,			/* Alphanumeric.  */
-
-  _ISwupper = _ISwbit (__ISwupper),	/* UPPERCASE.  */
-  _ISwlower = _ISwbit (__ISwlower),	/* lowercase.  */
-  _ISwalpha = _ISwbit (__ISwalpha),	/* Alphabetic.  */
-  _ISwdigit = _ISwbit (__ISwdigit),	/* Numeric.  */
-  _ISwxdigit = _ISwbit (__ISwxdigit),	/* Hexadecimal numeric.  */
-  _ISwspace = _ISwbit (__ISwspace),	/* Whitespace.  */
-  _ISwprint = _ISwbit (__ISwprint),	/* Printing.  */
-  _ISwgraph = _ISwbit (__ISwgraph),	/* Graphical.  */
-  _ISwblank = _ISwbit (__ISwblank),	/* Blank (usually SPC and TAB).  */
-  _ISwcntrl = _ISwbit (__ISwcntrl),	/* Control character.  */
-  _ISwpunct = _ISwbit (__ISwpunct),	/* Punctuation.  */
-  _ISwalnum = _ISwbit (__ISwalnum)	/* Alphanumeric.  */
-};
-# endif /* Not _ISwbit  */
-
-
-__BEGIN_DECLS
-
-/*
- * Wide-character classification functions: 7.15.2.1.
- */
-
-/* Test for any wide character for which `iswalpha' or `iswdigit' is
-   true.  */
-extern int iswalnum (wint_t __wc) __THROW;
-
-/* Test for any wide character for which `iswupper' or 'iswlower' is
-   true, or any wide character that is one of a locale-specific set of
-   wide-characters for which none of `iswcntrl', `iswdigit',
-   `iswpunct', or `iswspace' is true.  */
-extern int iswalpha (wint_t __wc) __THROW;
-
-/* Test for any control wide character.  */
-extern int iswcntrl (wint_t __wc) __THROW;
-
-/* Test for any wide character that corresponds to a decimal-digit
-   character.  */
-extern int iswdigit (wint_t __wc) __THROW;
-
-/* Test for any wide character for which `iswprint' is true and
-   `iswspace' is false.  */
-extern int iswgraph (wint_t __wc) __THROW;
-
-/* Test for any wide character that corresponds to a lowercase letter
-   or is one of a locale-specific set of wide characters for which
-   none of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true.  */
-extern int iswlower (wint_t __wc) __THROW;
-
-/* Test for any printing wide character.  */
-extern int iswprint (wint_t __wc) __THROW;
-
-/* Test for any printing wide character that is one of a
-   locale-specific et of wide characters for which neither `iswspace'
-   nor `iswalnum' is true.  */
-extern int iswpunct (wint_t __wc) __THROW;
-
-/* Test for any wide character that corresponds to a locale-specific
-   set of wide characters for which none of `iswalnum', `iswgraph', or
-   `iswpunct' is true.  */
-extern int iswspace (wint_t __wc) __THROW;
-
-/* Test for any wide character that corresponds to an uppercase letter
-   or is one of a locale-specific set of wide character for which none
-   of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true.  */
-extern int iswupper (wint_t __wc) __THROW;
-
-/* Test for any wide character that corresponds to a hexadecimal-digit
-   character equivalent to that performed be the functions described
-   in the previous subclause.  */
-extern int iswxdigit (wint_t __wc) __THROW;
-
-/* Test for any wide character that corresponds to a standard blank
-   wide character or a locale-specific set of wide characters for
-   which `iswalnum' is false.  */
-# ifdef __USE_ISOC99
-extern int iswblank (wint_t __wc) __THROW;
-# endif
-
-/*
- * Extensible wide-character classification functions: 7.15.2.2.
- */
-
-/* Construct value that describes a class of wide characters identified
-   by the string argument PROPERTY.  */
-extern wctype_t wctype (const char *__property) __THROW;
-
-/* Determine whether the wide-character WC has the property described by
-   DESC.  */
-extern int iswctype (wint_t __wc, wctype_t __desc) __THROW;
-
-
-/*
- * Wide-character case-mapping functions: 7.15.3.1.
- */
-
-/* Scalar type that can hold values which represent locale-specific
-   character mappings.  */
-typedef const __int32_t *wctrans_t;
-
-/* Converts an uppercase letter to the corresponding lowercase letter.  */
-extern wint_t towlower (wint_t __wc) __THROW;
-
-/* Converts an lowercase letter to the corresponding uppercase letter.  */
-extern wint_t towupper (wint_t __wc) __THROW;
-
-__END_DECLS
-
-#endif	/* need iswxxx.  */
-
-
-/* The remaining definitions and declarations must not appear in the
-   <wchar.h> header.  */
-#ifdef _WCTYPE_H
+/* Some definitions from this header also appear in <wchar.h> in
+   Unix98 mode.  */
+#include <bits/wctype-wchar.h>
 
 /*
  * Extensible wide-character mapping functions: 7.15.3.2.
@@ -201,6 +43,10 @@ __END_DECLS
 
 __BEGIN_DECLS
 
+/* Scalar type that can hold values which represent locale-specific
+   character mappings.  */
+typedef const __int32_t *wctrans_t;
+
 /* Construct value that describes a mapping between wide characters
    identified by the string argument PROPERTY.  */
 extern wctrans_t wctrans (const char *__property) __THROW;
@@ -276,7 +122,6 @@ extern wctype_t wctype_l (const char *__property, __locale_t __locale)
 extern int iswctype_l (wint_t __wc, wctype_t __desc, __locale_t __locale)
      __THROW;
 
-
 /*
  * Wide-character case-mapping functions.
  */
@@ -300,6 +145,4 @@ extern wint_t towctrans_l (wint_t __wc, wctrans_t __desc,
 
 __END_DECLS
 
-#endif	/* __WCTYPE_H defined.  */
-
 #endif /* wctype.h  */
-- 
2.11.0

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 0/6] Elimination of __need macros, round 3(?)
@ 2017-05-20 23:18 Zack Weinberg
  2017-05-20 23:18 ` [PATCH 3/6] Remove __need macros from errno.h (__need_Emath, __need_error_t) Zack Weinberg
                   ` (6 more replies)
  0 siblings, 7 replies; 14+ messages in thread
From: Zack Weinberg @ 2017-05-20 23:18 UTC (permalink / raw)
  To: libc-alpha

Patches 1 and 2 in this series were approved with modifications in the
previous round, and have been applied to master.  Patches 3, 4, 5
appeared in the previous round and are still in need of review.
(Patch 3 was partially reviewed but has changed substantially and
should probably be re-reviewed from scratch.)  Patch 6 is new.

After all of these patches are applied, the remaining __need_ macros
all interact with non-glibc headers:

__need_NULL, __need_ptrdiff_t, __need_size_t, __need_wchar_t, and
__need___va_list interact with headers provided by the compiler
(stddef.h and stdarg.h).  We could in principle get rid of
__need_va_list by relying on __builtin_va_list, which might at least
_seem_ less GCC-dependent than relying on stdarg.h to define a typedef
named __gnuc_va_list.  stddef.h interactions are, unfortunately, a
ginormous mess - just have a look at GCC's stddef.h sometime.

__need_int_reg_t interacts with a kernel header; a patch was posted,
but I don't know if the replacement micro-header is available in a
released kernel yet.

zw

Zack Weinberg (6):
  Remove __need_list_t and __need_res_state.
  Remove __need macros from signal.h.
  Remove __need macros from errno.h (__need_Emath, __need_error_t).
  Remove __need macros from stdio.h and wchar.h.
  Remove __need_IOV_MAX and __need_FOPEN_MAX.
  Remove __need_schedparam and __cpu_set_t_defined.

 Makeconfig                                         |  26 +-
 Makerules                                          |  10 +-
 NEWS                                               |   9 +
 argp/argp.h                                        |   8 +-
 bits/errno.h                                       |  38 +-
 bits/sched.h                                       | 121 +----
 bits/sigevent-consts.h                             |  37 ++
 bits/{siginfo.h => siginfo-consts.h}               |  74 +--
 bits/sigset.h                                      |  84 ----
 bits/types/__sigset_t.h                            |   7 +
 bits/types/sigevent_t.h                            |  17 +
 bits/types/siginfo_t.h                             |  21 +
 bits/{uio.h => uio_lim.h}                          |  12 +-
 grp/grp.h                                          |   3 +-
 gshadow/gshadow.h                                  |   4 +-
 hurd/hurd.h                                        |   3 +-
 iconv/gconv.h                                      |   6 +-
 include/bits/cpu-set.h                             |   1 +
 include/bits/types/FILE.h                          |   1 +
 include/bits/types/__FILE.h                        |   1 +
 include/bits/types/__mbstate_t.h                   |   1 +
 include/bits/types/error_t.h                       |   1 +
 include/bits/types/mbstate_t.h                     |   1 +
 include/bits/types/res_state.h                     |   1 +
 include/bits/types/sig_atomic_t.h                  |   1 +
 include/bits/types/sigset_t.h                      |   1 +
 include/bits/types/sigval_t.h                      |   1 +
 include/bits/types/wint_t.h                        |   1 +
 include/bits/wctype-wchar.h                        |   1 +
 include/bits/xopen_lim.h                           |  13 +-
 include/errno.h                                    |  13 +-
 include/list.h                                     |  38 +-
 include/list_t.h                                   |  31 ++
 include/signal.h                                   |  15 +-
 include/stdio.h                                    |  16 +-
 include/wchar.h                                    |  10 +-
 include/wctype.h                                   |  29 +-
 inet/rcmd.c                                        |  16 +-
 io/sys/poll.h                                      |   6 +-
 libio/Makefile                                     |   3 +-
 libio/bits/types/FILE.h                            |   9 +
 libio/bits/types/__FILE.h                          |   7 +
 libio/stdio.h                                      |  47 +-
 login/utmp_file.c                                  |   1 +
 mach/mach.h                                        |   6 +-
 misc/Makefile                                      |   3 +-
 misc/mntent.h                                      |   4 +-
 misc/sys/select.h                                  |   9 +-
 misc/sys/uio.h                                     |  18 +-
 nptl/descr.h                                       |   6 +-
 posix/Makefile                                     |   4 +-
 posix/bits/cpu-set.h                               | 124 +++++
 posix/bits/types.h                                 |   4 +
 posix/sched.h                                      |   8 +-
 posix/spawn.h                                      |   3 +-
 posix/sys/wait.h                                   |   3 +-
 pwd/pwd.h                                          |   3 +-
 resolv/Makefile                                    |   2 +-
 resolv/bits/types/res_state.h                      |  61 +++
 resolv/netdb.h                                     |   3 +-
 resolv/resolv.h                                    |  92 +---
 rt/aio.h                                           |   4 +-
 rt/mqueue.h                                        |   3 +-
 scripts/make-errno-enum.sh                         |  67 +++
 setjmp/setjmp.h                                    |   3 +-
 shadow/lckpwdf.c                                   |   1 +
 shadow/shadow.h                                    |   4 +-
 signal/Makefile                                    |  12 +-
 signal/Versions                                    |   8 +-
 signal/bits/types/sig_atomic_t.h                   |  10 +
 signal/bits/types/sigset_t.h                       |   9 +
 signal/bits/types/sigval_t.h                       |  13 +
 signal/sigaddset.c                                 |   7 +-
 signal/sigandset.c                                 |   8 +-
 signal/sigdelset.c                                 |   7 +-
 signal/sigisempty.c                                |   7 +-
 signal/sigismem.c                                  |   4 +-
 signal/signal.h                                    |  43 +-
 signal/sigorset.c                                  |   8 +-
 signal/sigsetops.c                                 |  58 ++-
 socket/sys/socket.h                                |   5 -
 stdio-common/printf.h                              |   5 +-
 stdio-common/stdio_lim.h.in                        |  31 +-
 stdlib/Makefile                                    |   3 +-
 stdlib/abort.c                                     |   9 +-
 stdlib/bits/types/error_t.h                        |  14 +
 stdlib/errno.h                                     |  55 +--
 string/argz.h                                      |   9 +-
 sysdeps/arm/sys/ucontext.h                         |   1 +
 sysdeps/generic/_G_config.h                        |   7 +-
 sysdeps/generic/sigsetops.h                        |  77 ++++
 sysdeps/generic/sys/ucontext.h                     |   1 +
 .../sigsetops.h => sysdeps/generic/sys/uio_ext.h   |  17 +-
 sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S      |   3 +-
 sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S   |   3 +-
 sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S      |   3 +-
 sysdeps/i386/sys/ucontext.h                        |   1 +
 sysdeps/m68k/sys/ucontext.h                        |   1 +
 sysdeps/mach/hurd/bits/errno.h                     | 505 ++++++++-------------
 sysdeps/mach/hurd/errnos.awk                       | 101 ++---
 sysdeps/mach/hurd/i386/bits/sigcontext.h           |   1 +
 sysdeps/mips/sys/ucontext.h                        |   1 +
 sysdeps/posix/profil.c                             |   1 +
 sysdeps/posix/sigignore.c                          |   5 +-
 sysdeps/posix/sigintr.c                            |   1 +
 sysdeps/posix/signal.c                             |   7 +-
 sysdeps/posix/sigset.c                             |  67 ++-
 sysdeps/posix/sprofil.c                            |   1 +
 sysdeps/posix/sysv_signal.c                        |   5 +-
 sysdeps/powerpc/novmxsetjmp.h                      |   2 +-
 sysdeps/pthread/bits/sigthread.h                   |   1 +
 sysdeps/unix/sysv/linux/Makefile                   |   3 +-
 sysdeps/unix/sysv/linux/_G_config.h                |   7 +-
 sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h     |   1 +
 sysdeps/unix/sysv/linux/alpha/bits/errno.h         |  46 +-
 sysdeps/unix/sysv/linux/alpha/sys/ucontext.h       |   1 +
 sysdeps/unix/sysv/linux/arm/sys/ucontext.h         |   1 +
 sysdeps/unix/sysv/linux/bits/errno.h               |  47 +-
 sysdeps/unix/sysv/linux/bits/fcntl-linux.h         |  56 +--
 sysdeps/unix/sysv/linux/bits/sched.h               | 130 +-----
 sysdeps/unix/sysv/linux/bits/sigevent-consts.h     |  41 ++
 sysdeps/unix/sysv/linux/bits/siginfo-arch.h        |   7 +
 sysdeps/unix/sysv/linux/bits/siginfo-consts-arch.h |   7 +
 sysdeps/unix/sysv/linux/bits/siginfo-consts.h      | 185 ++++++++
 sysdeps/unix/sysv/linux/bits/siginfo.h             | 341 --------------
 sysdeps/unix/sysv/linux/bits/sigset.h              | 124 -----
 sysdeps/unix/sysv/linux/bits/types/__sigset_t.h    |  10 +
 sysdeps/unix/sysv/linux/bits/types/sigevent_t.h    |  48 ++
 sysdeps/unix/sysv/linux/bits/types/siginfo_t.h     | 139 ++++++
 sysdeps/unix/sysv/linux/bits/uio_lim.h             |  31 ++
 sysdeps/unix/sysv/linux/hppa/bits/errno.h          |  39 +-
 sysdeps/unix/sysv/linux/hppa/sys/ucontext.h        |   1 +
 sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h   |  19 +
 .../sysv/linux/ia64/bits/siginfo-consts-arch.h     |  45 ++
 sysdeps/unix/sysv/linux/ia64/bits/siginfo.h        | 360 ---------------
 sysdeps/unix/sysv/linux/m68k/sys/ucontext.h        |   1 +
 sysdeps/unix/sysv/linux/mips/bits/errno.h          |  45 +-
 sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h   |  15 +
 sysdeps/unix/sysv/linux/mips/bits/siginfo.h        | 344 --------------
 sysdeps/unix/sysv/linux/mips/sys/ucontext.h        |   1 +
 sysdeps/unix/sysv/linux/nios2/sys/ucontext.h       |   1 +
 sysdeps/unix/sysv/linux/nptl-signals.h             |   1 +
 sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h     |   3 +-
 sysdeps/unix/sysv/linux/s390/bits/siginfo.h        | 341 --------------
 sysdeps/unix/sysv/linux/s390/sys/ucontext.h        |   1 +
 sysdeps/unix/sysv/linux/sh/sys/ucontext.h          |   1 +
 sysdeps/unix/sysv/linux/sigsetops.h                | 108 +++++
 sysdeps/unix/sysv/linux/sparc/bits/errno.h         |  46 +-
 sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h  |  14 +
 .../sysv/linux/sparc/bits/siginfo-consts-arch.h    |  12 +
 sysdeps/unix/sysv/linux/sparc/bits/siginfo.h       | 352 --------------
 sysdeps/unix/sysv/linux/sparc/sys/ucontext.h       |   1 +
 sysdeps/unix/sysv/linux/sys/epoll.h                |   8 +-
 sysdeps/unix/sysv/linux/sys/signalfd.h             |   3 +-
 .../unix/sysv/linux/{bits/uio.h => sys/uio_ext.h}  |  37 +-
 sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h   |  11 +
 .../sysv/linux/tile/bits/siginfo-consts-arch.h     |  14 +
 sysdeps/unix/sysv/linux/tile/bits/siginfo.h        | 347 --------------
 sysdeps/unix/sysv/linux/tile/sys/ucontext.h        |   1 +
 sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h    |  19 +
 sysdeps/unix/sysv/linux/x86/bits/siginfo.h         | 360 ---------------
 sysdeps/unix/sysv/linux/x86/sys/ucontext.h         |   1 +
 sysdeps/x86_64/fpu/s_cosf.S                        |   3 +-
 sysdeps/x86_64/fpu/s_sincosf.S                     |   3 +-
 sysdeps/x86_64/fpu/s_sinf.S                        |   3 +-
 wcsmbs/Makefile                                    |   3 +-
 wcsmbs/bits/types/__mbstate_t.h                    |  23 +
 wcsmbs/bits/types/mbstate_t.h                      |   8 +
 wcsmbs/bits/types/wint_t.h                         |  23 +
 wcsmbs/uchar.h                                     |   9 +-
 wcsmbs/wchar.h                                     | 125 ++---
 wctype/Makefile                                    |   2 +-
 wctype/bits/wctype-wchar.h                         | 173 +++++++
 wctype/wctype.h                                    | 179 +-------
 174 files changed, 2274 insertions(+), 4375 deletions(-)
 create mode 100644 bits/sigevent-consts.h
 rename bits/{siginfo.h => siginfo-consts.h} (68%)
 delete mode 100644 bits/sigset.h
 create mode 100644 bits/types/__sigset_t.h
 create mode 100644 bits/types/sigevent_t.h
 create mode 100644 bits/types/siginfo_t.h
 rename bits/{uio.h => uio_lim.h} (79%)
 create mode 100644 include/bits/cpu-set.h
 create mode 100644 include/bits/types/FILE.h
 create mode 100644 include/bits/types/__FILE.h
 create mode 100644 include/bits/types/__mbstate_t.h
 create mode 100644 include/bits/types/error_t.h
 create mode 100644 include/bits/types/mbstate_t.h
 create mode 100644 include/bits/types/res_state.h
 create mode 100644 include/bits/types/sig_atomic_t.h
 create mode 100644 include/bits/types/sigset_t.h
 create mode 100644 include/bits/types/sigval_t.h
 create mode 100644 include/bits/types/wint_t.h
 create mode 100644 include/bits/wctype-wchar.h
 create mode 100644 include/list_t.h
 create mode 100644 libio/bits/types/FILE.h
 create mode 100644 libio/bits/types/__FILE.h
 create mode 100644 posix/bits/cpu-set.h
 create mode 100644 resolv/bits/types/res_state.h
 create mode 100644 scripts/make-errno-enum.sh
 create mode 100644 signal/bits/types/sig_atomic_t.h
 create mode 100644 signal/bits/types/sigset_t.h
 create mode 100644 signal/bits/types/sigval_t.h
 create mode 100644 stdlib/bits/types/error_t.h
 create mode 100644 sysdeps/generic/sigsetops.h
 rename signal/sigsetops.h => sysdeps/generic/sys/uio_ext.h (70%)
 create mode 100644 sysdeps/unix/sysv/linux/bits/sigevent-consts.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/siginfo-arch.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/siginfo-consts-arch.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/siginfo-consts.h
 delete mode 100644 sysdeps/unix/sysv/linux/bits/siginfo.h
 delete mode 100644 sysdeps/unix/sysv/linux/bits/sigset.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/types/__sigset_t.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/types/sigevent_t.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/types/siginfo_t.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/uio_lim.h
 create mode 100644 sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h
 create mode 100644 sysdeps/unix/sysv/linux/ia64/bits/siginfo-consts-arch.h
 delete mode 100644 sysdeps/unix/sysv/linux/ia64/bits/siginfo.h
 create mode 100644 sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h
 delete mode 100644 sysdeps/unix/sysv/linux/mips/bits/siginfo.h
 delete mode 100644 sysdeps/unix/sysv/linux/s390/bits/siginfo.h
 create mode 100644 sysdeps/unix/sysv/linux/sigsetops.h
 create mode 100644 sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
 create mode 100644 sysdeps/unix/sysv/linux/sparc/bits/siginfo-consts-arch.h
 delete mode 100644 sysdeps/unix/sysv/linux/sparc/bits/siginfo.h
 rename sysdeps/unix/sysv/linux/{bits/uio.h => sys/uio_ext.h} (57%)
 create mode 100644 sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h
 create mode 100644 sysdeps/unix/sysv/linux/tile/bits/siginfo-consts-arch.h
 delete mode 100644 sysdeps/unix/sysv/linux/tile/bits/siginfo.h
 create mode 100644 sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h
 delete mode 100644 sysdeps/unix/sysv/linux/x86/bits/siginfo.h
 create mode 100644 wcsmbs/bits/types/__mbstate_t.h
 create mode 100644 wcsmbs/bits/types/mbstate_t.h
 create mode 100644 wcsmbs/bits/types/wint_t.h
 create mode 100644 wctype/bits/wctype-wchar.h

-- 
2.11.0

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 3/6] Remove __need macros from errno.h (__need_Emath, __need_error_t).
  2017-05-20 23:18 [PATCH 0/6] Elimination of __need macros, round 3(?) Zack Weinberg
@ 2017-05-20 23:18 ` Zack Weinberg
  2017-05-20 23:18 ` [PATCH 1/6] Committed: Remove __need_list_t and __need_res_state Zack Weinberg
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: Zack Weinberg @ 2017-05-20 23:18 UTC (permalink / raw)
  To: libc-alpha

This is fairly complicated, not because the users of __need_Emath and
__need_error_t have complicated requirements, but because the core
changes had a lot of fallout.

__need_Emath is defined only by .S files; what they _really_ need is
for errno.h to avoid declaring anything other than the E-constants
(e.g. 'extern int __errno_location(void);' is a syntax error in
assembly language). This is replaced with a check for __ASSEMBLER__ in
errno.h, plus a carefully documented requirement for bits/errno.h not
to define anything other than macros.  That in turn has the
consequence that bits/errno.h must not define errno - fortunately,
all live ports use the same definition of errno, so I've moved it to
errno.h.

__need_error_t exists for gnulib compatibility in argz.h and argp.h.
error_t itself is a Hurdism, an enum containing all the E-constants,
so you can do 'p (error_t) errno' in gdb and get a symbolic value.
argz.h and argp.h use it for function return values, and they want to
fall back to 'int' when that's not available.  Also, to comply with
the rule that bits/errno.h may only define macros anymore, the
definition of error_t had to be removed from
sysdeps/mach/hurd/bits/errno.h somehow.  I have elected to move
error_t to a file generated at build time and make it available for
all supported hosts, not just Hurd.  This allows creation of a generic
bits/types/error_t.h.  However, the price is that the new definition
requires a GCC >=4.5 feature - otherwise it falls back to 'int'.  And
you may regret reading the generated bits/errno-enum.h.

	* stdlib/errno.h: Remove __need_Emath and __need_error_t
	logic.  Declare errno here.  Include bits/types/error_t.h for
	error_t.  When __ASSEMBLER__ is defined, provide only the
	E-constants, as macros.  Reorganize file.

	* stdlib/bits/types/error_t.h: New file.
	* include/bits/types/error_t.h: New wrapper.
	* scripts/make-errno-enum.sh: New file.
	* Makeconfig: Add rules to generate bits/errno-enum.h.
	(common-generated): Add bits/errno-enum.h and bits/errno-enum.h.stmp.
	Also add dl-tunable-list.h and dl-tunable-list.stmp, missed in a
	previous patch.
	(dl-tunable-list.h): Generate using a stamp file.
	* stdlib/Makefile: Install bits/types/error_t.h and bits/errno-enum.h.

	* bits/errno.h: Remove logic for __need_Emath.  Document
	requirements for a port-specific bits/errno.h.

	* include/errno.h: Change conditional for exposing internal
	declarations to (not _ISOMAC and not __ASSEMBLER__).  Use
	__attribute_const__ instead of __attribute__((__const__)).

	* sysdeps/mach/hurd/errnos.awk
	* sysdeps/unix/sysv/linux/bits/errno.h
	* sysdeps/unix/sysv/linux/alpha/bits/errno.h
	* sysdeps/unix/sysv/linux/hppa/bits/errno.h
	* sysdeps/unix/sysv/linux/mips/bits/errno.h
	* sysdeps/unix/sysv/linux/sparc/bits/errno.h:
	Add multiple-include guard and check against improper inclusion.
	Remove __need_Emath logic. Don't declare errno here. Ensure all
	constants are defined as simple integer literals.  Redefine
	__GLIBC_USE_TLS_ERRNO to 1 if appropriate.  Consistent formatting.
	* sysdeps/mach/hurd/bits/errno.h: Regenerate.

	* argp/argp.h, string/argz.h: Include bits/types/error_t.h for error_t.

	* sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S
	* sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S
	* sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S
	* sysdeps/x86_64/fpu/s_cosf.S
	* sysdeps/x86_64/fpu/s_sincosf.S
	* sysdeps/x86_64/fpu/s_sinf.S
	Just include errno.h; don't define __need_Emath or include
	bits/errno.h directly.
---
 Makeconfig                                       |  26 +-
 NEWS                                             |   9 +
 argp/argp.h                                      |   8 +-
 bits/errno.h                                     |  38 +-
 include/bits/types/error_t.h                     |   1 +
 include/errno.h                                  |  13 +-
 scripts/make-errno-enum.sh                       |  67 +++
 stdlib/Makefile                                  |   3 +-
 stdlib/bits/types/error_t.h                      |  14 +
 stdlib/errno.h                                   |  55 +--
 string/argz.h                                    |   9 +-
 sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S    |   3 +-
 sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S |   3 +-
 sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S    |   3 +-
 sysdeps/mach/hurd/bits/errno.h                   | 505 +++++++++--------------
 sysdeps/mach/hurd/errnos.awk                     | 101 ++---
 sysdeps/unix/sysv/linux/alpha/bits/errno.h       |  46 +--
 sysdeps/unix/sysv/linux/bits/errno.h             |  47 +--
 sysdeps/unix/sysv/linux/hppa/bits/errno.h        |  39 +-
 sysdeps/unix/sysv/linux/mips/bits/errno.h        |  45 +-
 sysdeps/unix/sysv/linux/sparc/bits/errno.h       |  46 +--
 sysdeps/x86_64/fpu/s_cosf.S                      |   3 +-
 sysdeps/x86_64/fpu/s_sincosf.S                   |   3 +-
 sysdeps/x86_64/fpu/s_sinf.S                      |   3 +-
 24 files changed, 471 insertions(+), 619 deletions(-)
 create mode 100644 include/bits/types/error_t.h
 create mode 100644 scripts/make-errno-enum.sh
 create mode 100644 stdlib/bits/types/error_t.h

diff --git a/Makeconfig b/Makeconfig
index b494b82b40..0e7777fe57 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -1107,6 +1107,7 @@ postclean-generated += soversions.mk soversions.i \
 		       shlib-versions.v shlib-versions.v.i
 
 before-compile += $(common-objpfx)libc-modules.h
+common-generated += libc-modules.h libc-modules.stmp
 ifeq ($(soversions.mk-done),t)
 # Generate a header with macro definitions for use with the IS_IN macro.
 # These are the possible values for the MODULE_NAME macro defined when building
@@ -1125,14 +1126,29 @@ endif
 # glibc.
 ifneq (no,$(have-tunables))
 before-compile += $(common-objpfx)dl-tunable-list.h
+common-generated += dl-tunable-list.h dl-tunable-list.stmp \
+
+$(common-objpfx)dl-tunable-list.h: $(common-objpfx)dl-tunable-list.stmp; @:
+$(common-objpfx)dl-tunable-list.stmp: $(..)scripts/gen-tunables.awk \
+				      $(..)elf/dl-tunables.list
+	$(AWK) -f $^ > ${@:stmp=T}
+	$(move-if-change) ${@:stmp=T} ${@:stmp=h}
+	touch $@
 
-$(common-objpfx)dl-tunable-list.h: $(..)scripts/gen-tunables.awk \
-				   $(..)elf/dl-tunables.list
-	$(AWK) -f $^ > $@.tmp
-	mv $@.tmp $@
 endif
 
-common-generated += libc-modules.h libc-modules.stmp
+# Build errno-enum.h early, ditto.
+before-compile += $(common-objpfx)bits/errno-enum.h
+common-generated += bits/error_t.h bits/errno-enum.stmp
+$(common-objpfx)bits/errno-enum.h: $(common-objpfx)bits/errno-enum.stmp; @:
+$(common-objpfx)bits/errno-enum.stmp: $(..)scripts/make-errno-enum.sh \
+				      bits/errno.h
+	[ -d $(common-objpfx)bits ] || mkdir $(common-objpfx)bits
+	CC="$(CC)" AWK="$(AWK)" \
+	    $(SHELL) $(..)scripts/make-errno-enum.sh $(+includes) \
+	    > ${@:stmp=T}
+	$(move-if-change) ${@:stmp=T} ${@:stmp=h}
+	touch $@
 
 # The name under which the run-time dynamic linker is installed.
 # We are currently going for the convention that `/lib/ld.so.1'
diff --git a/NEWS b/NEWS
index b4ecd6201d..0dff566b3a 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,15 @@ Version 2.26
   transliteration tables are all updated to Unicode 9.0.0, using
   generator scripts contributed by Mike FABIAN (Red Hat).
 
+* errno.h is now safe to use from C-preprocessed assembly language on all
+  supported operating systems.  In this context, it will only define the
+  Exxxx constants, as preprocessor macros expanding to integer literals.
+
+* error_t, a debugging aid, is now available on all supported operating
+  systems for programs compiled with GCC 4.5 or higher.  'p (error_t) errno'
+  in GDB will print the Exxxx constant corresponding to the current value of
+  errno.
+
 * The rpcgen, librpcsvc and related headers will only be built and
   installed when glibc is configured with --enable-obsolete-rpc.
   This allows alternative RPC implementations, like TIRPC, to be used
diff --git a/argp/argp.h b/argp/argp.h
index 86b8e5a1e9..f48c007554 100644
--- a/argp/argp.h
+++ b/argp/argp.h
@@ -24,15 +24,9 @@
 #include <ctype.h>
 #include <getopt.h>
 #include <limits.h>
-
-#define __need_error_t
 #include <errno.h>
+#include <bits/types/error_t.h>
 
-#ifndef __error_t_defined
-typedef int error_t;
-# define __error_t_defined
-#endif
-\f
 __BEGIN_DECLS
 
 /* A description of a particular option.  A pointer to an array of
diff --git a/bits/errno.h b/bits/errno.h
index cd4fcfa428..a51fc3ee34 100644
--- a/bits/errno.h
+++ b/bits/errno.h
@@ -15,20 +15,32 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-/* This file defines the `errno' constants.  */
+/* This file defines the errno constants.  */
 
-#if !defined __Emath_defined && (defined _ERRNO_H || defined __need_Emath)
-#undef	__need_Emath
-#define	__Emath_defined	1
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
 
-# define EDOM	XXX	<--- fill in what is actually needed
-# define EILSEQ	XXX	<--- fill in what is actually needed
-# define ERANGE	XXX	<--- fill in what is actually needed
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
 #endif
 
-#ifdef	_ERRNO_H
-# error "Define here all the missing error messages for the port.  These"
-# error "must match the numbers of the kernel."
-# define Exxxx	XXX
-...
-#endif
+#error "Generic bits/errno.h included -- port is incomplete."
+
+/* Authors of new ports of the GNU C Library must override this file
+   with their own bits/errno.h in an appropriate subdirectory of
+   sysdeps/.  Its function is to define all of the error constants
+   from C2011 and POSIX.1-2008, with values appropriate to the operating
+   system, and any additional OS-specific error constants.
+
+   C2011 requires all error constants to be object-like macros that
+   expand to "integer constant expressions with type int, positive
+   values, and suitable for use in #if directives".  Moreover, all
+   of their names must begin with a capital E, followed immediately
+   by either another capital letter, or a digit.
+
+   errno.h is sometimes included from assembly language, so
+   bits/errno.h may only define macros; it may not make any other kind
+   of C declaration or definition.  It is OK to define macros that are
+   not E-constants, but only in the implementation namespace.  */
+
+#endif /* bits/errno.h.  */
diff --git a/include/bits/types/error_t.h b/include/bits/types/error_t.h
new file mode 100644
index 0000000000..1ce1f79202
--- /dev/null
+++ b/include/bits/types/error_t.h
@@ -0,0 +1 @@
+#include <stdlib/bits/types/error_t.h>
diff --git a/include/errno.h b/include/errno.h
index 73fc32e5e0..3c3d2288c8 100644
--- a/include/errno.h
+++ b/include/errno.h
@@ -1,8 +1,6 @@
 #ifndef _ERRNO_H
-
 #include <stdlib/errno.h>
-
-#if defined _ERRNO_H && !defined _ISOMAC
+#if !defined _ISOMAC && !defined __ASSEMBLER__
 
 # if IS_IN (rtld)
 #  include <dl-sysdep.h>
@@ -38,15 +36,12 @@ extern __thread int errno attribute_tls_model_ie;
 
 # define __set_errno(val) (errno = (val))
 
-# ifndef __ASSEMBLER__
-extern int *__errno_location (void) __THROW __attribute__ ((__const__))
+extern int *__errno_location (void) __THROW __attribute_const__
 #  if RTLD_PRIVATE_ERRNO
      attribute_hidden
 #  endif
 ;
 libc_hidden_proto (__errno_location)
-# endif
 
-#endif /* _ERRNO_H */
-
-#endif /* ! _ERRNO_H */
+#endif /* !_ISOMAC && !__ASSEMBLER__ */
+#endif /* !_ERRNO_H */
diff --git a/scripts/make-errno-enum.sh b/scripts/make-errno-enum.sh
new file mode 100644
index 0000000000..99a07d3f29
--- /dev/null
+++ b/scripts/make-errno-enum.sh
@@ -0,0 +1,67 @@
+#! /bin/sh
+# Script to produce bits/error_t.h.
+
+# Copyright (C) 2017 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, see
+# <http://www.gnu.org/licenses/>.
+
+# This script is invoked with no input.
+# AWK and CC are expected to be set in the environment.
+# "$@" is expected to be a sequence of -I switches to pass to the compiler.
+# The generated error_t.h is written to stdout.
+
+set -e
+
+# Note: the steps below that may fail under normal circumstances are
+# carefully arranged to be at the ends of pipelines.
+tmp1=`mktemp -t me1.XXXXXXXXX`
+tmp2=`mktemp -t me2.XXXXXXXXX`
+trap "rm -f '$tmp1' '$tmp2'" 0
+
+printf '#include <features.h>\n#include <bits/errno.h>\n' |
+    "$CC" -E -dM -xc -D_GNU_SOURCE -D_ERRNO_H "$@" - > "$tmp1"
+
+LC_ALL=C sort < "$tmp1" | "$AWK" > "$tmp2" '
+  /^#define E[A-Z0-9]/ {
+    name = $2;
+    printf("\n#ifdef %s\n# pragma push_macro (\"%s\")\n# undef %s\n  %s =\n",
+           name, name, name, name);
+    printf("# pragma pop_macro (\"%s\")\n    %s,\n#endif\n",
+           name, name);
+  }
+'
+
+echo '/* Errno codes as enum constants.'
+echo '   This file was generated by make-errno-enum.sh from bits/errno.h.  */'
+echo
+echo '#ifndef _BITS_ERRNO_ENUM_H'
+echo '#define _BITS_ERRNO_ENUM_H 1'
+echo
+echo '#include <bits/errno.h>'
+echo
+echo 'enum __error_t_codes'
+echo '{'
+echo '  /* Force the enum to be a signed type.  */'
+echo '  __FORCE_ERROR_T_CODES_SIGNED = -1,'
+echo
+echo '  /* Zero indicates success.  Including this entry may prevent'
+echo '     warnings from some compilers if "case 0" appears in a switch'
+echo '     statement over an error_t value.  */'
+echo '  ESUCCESS = 0,'
+cat "$tmp2"
+echo '};'
+echo
+echo '#endif /* bits/errno-enum.h */'
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 9b0acce8cc..770dedfa02 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -25,7 +25,8 @@ include ../Makeconfig
 headers	:= stdlib.h bits/stdlib.h bits/stdlib-ldbl.h bits/stdlib-float.h      \
 	   monetary.h bits/monetary-ldbl.h				      \
 	   inttypes.h stdint.h bits/wordsize.h				      \
-	   errno.h sys/errno.h bits/errno.h				      \
+	   errno.h sys/errno.h bits/errno.h bits/errno-enum.h		      \
+	   bits/types/error_t.h						      \
 	   ucontext.h sys/ucontext.h					      \
 	   alloca.h fmtmsg.h						      \
 	   bits/stdlib-bsearch.h sys/random.h bits/stdint-intn.h	      \
diff --git a/stdlib/bits/types/error_t.h b/stdlib/bits/types/error_t.h
new file mode 100644
index 0000000000..2b6197c84c
--- /dev/null
+++ b/stdlib/bits/types/error_t.h
@@ -0,0 +1,14 @@
+#ifndef __error_t_defined
+#define __error_t_defined 1
+
+/* The type error_t, a debugging aid.  With sufficiently new compilers
+   you can type 'p (error_t) errno' in GDB and see the symbolic name
+   of the errno value.  */
+#if __GNUC_PREREQ (4, 5)
+# include <bits/errno-enum.h>
+typedef enum __error_t_codes error_t;
+# else
+typedef int error_t;
+# endif
+
+#endif
diff --git a/stdlib/errno.h b/stdlib/errno.h
index 65f2f4570c..83c29979c7 100644
--- a/stdlib/errno.h
+++ b/stdlib/errno.h
@@ -20,53 +20,36 @@
  */
 
 #ifndef	_ERRNO_H
+#define _ERRNO_H 1
 
-/* The includer defined __need_Emath if he wants only the definitions
-   of EDOM and ERANGE, and not everything else.  */
-#ifndef	__need_Emath
-# define _ERRNO_H	1
 # include <features.h>
-#endif
+
+/* The system-specific definitions of the E* constants, as macros.  */
+# include <bits/errno.h>
+
+/* When included from assembly language, this header only provides the
+   E* constants.  */
+# ifndef __ASSEMBLER__
 
 __BEGIN_DECLS
 
-/* Get the error number constants from the system-specific file.
-   This file will test __need_Emath and _ERRNO_H.  */
-#include <bits/errno.h>
-#undef	__need_Emath
+/* The error code set by various library functions.  */
+extern int *__errno_location (void) __THROW __attribute_const__;
+#  define errno (*__errno_location ())
 
-#ifdef	_ERRNO_H
+#  ifdef __USE_GNU
 
-/* Declare the `errno' variable, unless it's defined as a macro by
-   bits/errno.h.  This is the case in GNU, where it is a per-thread
-   variable.  This redeclaration using the macro still works, but it
-   will be a function declaration without a prototype and may trigger
-   a -Wstrict-prototypes warning.  */
-#ifndef	errno
-extern int errno;
-#endif
-
-#ifdef __USE_GNU
+#include <bits/types/error_t.h>
 
 /* The full and simple forms of the name with which the program was
    invoked.  These variables are set up automatically at startup based on
    the value of ARGV[0] (this works only if you use GNU ld).  */
-extern char *program_invocation_name, *program_invocation_short_name;
-#endif /* __USE_GNU */
-#endif /* _ERRNO_H */
+extern char *program_invocation_name;
+extern char *program_invocation_short_name;
+
+#  endif /* __USE_GNU */
 
 __END_DECLS
 
-#endif /* _ERRNO_H */
-
-/* The Hurd <bits/errno.h> defines `error_t' as an enumerated type so
-   that printing `error_t' values in the debugger shows the names.  We
-   might need this definition sometimes even if this file was included
-   before.  */
-#if defined __USE_GNU || defined __need_error_t
-# ifndef __error_t_defined
-typedef int error_t;
-#  define __error_t_defined	1
-# endif
-# undef __need_error_t
-#endif
+# endif /* !__ASSEMBLER__ */
+#endif /* errno.h */
diff --git a/string/argz.h b/string/argz.h
index f9d0ac9950..58fcbd04de 100644
--- a/string/argz.h
+++ b/string/argz.h
@@ -20,15 +20,8 @@
 #define _ARGZ_H	1
 
 #include <features.h>
-
-#define __need_error_t
-#include <errno.h>
 #include <string.h>		/* Need size_t, and strchr is called below.  */
-
-#ifndef __error_t_defined
-typedef int error_t;
-#endif
-
+#include <bits/types/error_t.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S b/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S
index f37850d0b3..a5b76e9fb2 100644
--- a/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S
+++ b/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S
@@ -17,8 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
 
 /* Short algorithm description:
  *
diff --git a/sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S b/sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S
index f31a925522..1e99ee6416 100644
--- a/sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S
+++ b/sysdeps/i386/i686/fpu/multiarch/s_sincosf-sse2.S
@@ -17,8 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
 
 /* Short algorithm description:
  *
diff --git a/sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S b/sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S
index ee96018061..03b925491e 100644
--- a/sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S
+++ b/sysdeps/i386/i686/fpu/multiarch/s_sinf-sse2.S
@@ -17,8 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
 
 /* Short algorithm description:
  *
diff --git a/sysdeps/mach/hurd/bits/errno.h b/sysdeps/mach/hurd/bits/errno.h
index d20ffe654a..7aa76b5d3a 100644
--- a/sysdeps/mach/hurd/bits/errno.h
+++ b/sysdeps/mach/hurd/bits/errno.h
@@ -1,329 +1,198 @@
 /* This file generated by errnos.awk.  */
 
-/* The Hurd uses Mach error system 0x10, currently only subsystem 0. */
-#ifndef _HURD_ERRNO
-#define _HURD_ERRNO(n)	((0x10 << 26) | ((n) & 0x3fff))
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
 #endif
 
-#ifdef _ERRNO_H
+/* The Hurd uses Mach error system 0x10, currently only subsystem 0. */
+#define EPERM                          0x40000001 /* Operation not permitted */
+#define ENOENT                         0x40000002 /* No such file or directory */
+#define ESRCH                          0x40000003 /* No such process */
+#define EINTR                          0x40000004 /* Interrupted system call */
+#define EIO                            0x40000005 /* Input/output error */
+#define ENXIO                          0x40000006 /* No such device or address */
+#define E2BIG                          0x40000007 /* Argument list too long */
+#define ENOEXEC                        0x40000008 /* Exec format error */
+#define EBADF                          0x40000009 /* Bad file descriptor */
+#define ECHILD                         0x4000000a /* No child processes */
+#define EDEADLK                        0x4000000b /* Resource deadlock avoided */
+#define ENOMEM                         0x4000000c /* Cannot allocate memory */
+#define EACCES                         0x4000000d /* Permission denied */
+#define EFAULT                         0x4000000e /* Bad address */
+#define ENOTBLK                        0x4000000f /* Block device required */
+#define EBUSY                          0x40000010 /* Device or resource busy */
+#define EEXIST                         0x40000011 /* File exists */
+#define EXDEV                          0x40000012 /* Invalid cross-device link */
+#define ENODEV                         0x40000013 /* No such device */
+#define ENOTDIR                        0x40000014 /* Not a directory */
+#define EISDIR                         0x40000015 /* Is a directory */
+#define EINVAL                         0x40000016 /* Invalid argument */
+#define EMFILE                         0x40000018 /* Too many open files */
+#define ENFILE                         0x40000017 /* Too many open files in system */
+#define ENOTTY                         0x40000019 /* Inappropriate ioctl for device */
+#define ETXTBSY                        0x4000001a /* Text file busy */
+#define EFBIG                          0x4000001b /* File too large */
+#define ENOSPC                         0x4000001c /* No space left on device */
+#define ESPIPE                         0x4000001d /* Illegal seek */
+#define EROFS                          0x4000001e /* Read-only file system */
+#define EMLINK                         0x4000001f /* Too many links */
+#define EPIPE                          0x40000020 /* Broken pipe */
+#define EDOM                           0x40000021 /* Numerical argument out of domain */
+#define ERANGE                         0x40000022 /* Numerical result out of range */
+#define EAGAIN                         0x40000023 /* Resource temporarily unavailable */
+#define EWOULDBLOCK                    EAGAIN     /* Operation would block */
+#define EINPROGRESS                    0x40000024 /* Operation now in progress */
+#define EALREADY                       0x40000025 /* Operation already in progress */
+#define ENOTSOCK                       0x40000026 /* Socket operation on non-socket */
+#define EMSGSIZE                       0x40000028 /* Message too long */
+#define EPROTOTYPE                     0x40000029 /* Protocol wrong type for socket */
+#define ENOPROTOOPT                    0x4000002a /* Protocol not available */
+#define EPROTONOSUPPORT                0x4000002b /* Protocol not supported */
+#define ESOCKTNOSUPPORT                0x4000002c /* Socket type not supported */
+#define EOPNOTSUPP                     0x4000002d /* Operation not supported */
+#define EPFNOSUPPORT                   0x4000002e /* Protocol family not supported */
+#define EAFNOSUPPORT                   0x4000002f /* Address family not supported by protocol */
+#define EADDRINUSE                     0x40000030 /* Address already in use */
+#define EADDRNOTAVAIL                  0x40000031 /* Cannot assign requested address */
+#define ENETDOWN                       0x40000032 /* Network is down */
+#define ENETUNREACH                    0x40000033 /* Network is unreachable */
+#define ENETRESET                      0x40000034 /* Network dropped connection on reset */
+#define ECONNABORTED                   0x40000035 /* Software caused connection abort */
+#define ECONNRESET                     0x40000036 /* Connection reset by peer */
+#define ENOBUFS                        0x40000037 /* No buffer space available */
+#define EISCONN                        0x40000038 /* Transport endpoint is already connected */
+#define ENOTCONN                       0x40000039 /* Transport endpoint is not connected */
+#define EDESTADDRREQ                   0x40000027 /* Destination address required */
+#define ESHUTDOWN                      0x4000003a /* Cannot send after transport endpoint shutdown */
+#define ETOOMANYREFS                   0x4000003b /* Too many references: cannot splice */
+#define ETIMEDOUT                      0x4000003c /* Connection timed out */
+#define ECONNREFUSED                   0x4000003d /* Connection refused */
+#define ELOOP                          0x4000003e /* Too many levels of symbolic links */
+#define ENAMETOOLONG                   0x4000003f /* File name too long */
+#define EHOSTDOWN                      0x40000040 /* Host is down */
+#define EHOSTUNREACH                   0x40000041 /* No route to host */
+#define ENOTEMPTY                      0x40000042 /* Directory not empty */
+#define EPROCLIM                       0x40000043 /* Too many processes */
+#define EUSERS                         0x40000044 /* Too many users */
+#define EDQUOT                         0x40000045 /* Disk quota exceeded */
+#define ESTALE                         0x40000046 /* Stale file handle */
+#define EREMOTE                        0x40000047 /* Object is remote */
+#define EBADRPC                        0x40000048 /* RPC struct is bad */
+#define ERPCMISMATCH                   0x40000049 /* RPC version wrong */
+#define EPROGUNAVAIL                   0x4000004a /* RPC program not available */
+#define EPROGMISMATCH                  0x4000004b /* RPC program version wrong */
+#define EPROCUNAVAIL                   0x4000004c /* RPC bad procedure for program */
+#define ENOLCK                         0x4000004d /* No locks available */
+#define EFTYPE                         0x4000004f /* Inappropriate file type or format */
+#define EAUTH                          0x40000050 /* Authentication error */
+#define ENEEDAUTH                      0x40000051 /* Need authenticator */
+#define ENOSYS                         0x4000004e /* Function not implemented */
+#define ENOTSUP                        0x40000076 /* Not supported */
+#define EILSEQ                         0x4000006a /* Invalid or incomplete multibyte or wide character */
+#define EBACKGROUND                    0x40000064 /* Inappropriate operation for background process */
+#define EDIED                          0x40000065 /* Translator died */
+#define ED                             0x40000066 /* ? */
+#define EGREGIOUS                      0x40000067 /* You really blew it this time */
+#define EIEIO                          0x40000068 /* Computer bought the farm */
+#define EGRATUITOUS                    0x40000069 /* Gratuitous error */
+#define EBADMSG                        0x4000006b /* Bad message */
+#define EIDRM                          0x4000006c /* Identifier removed */
+#define EMULTIHOP                      0x4000006d /* Multihop attempted */
+#define ENODATA                        0x4000006e /* No data available */
+#define ENOLINK                        0x4000006f /* Link has been severed */
+#define ENOMSG                         0x40000070 /* No message of desired type */
+#define ENOSR                          0x40000071 /* Out of streams resources */
+#define ENOSTR                         0x40000072 /* Device not a stream */
+#define EOVERFLOW                      0x40000073 /* Value too large for defined data type */
+#define EPROTO                         0x40000074 /* Protocol error */
+#define ETIME                          0x40000075 /* Timer expired */
+#define ECANCELED                      0x40000077 /* Operation canceled */
 
-enum __error_t_codes
-{
-	/* The value zero always means success and it is perfectly fine for
-	   code to use 0 explicitly (or implicitly, e.g. via Boolean coercion).
-	   Having an enum entry for zero both makes the debugger print the name
-	   for error_t-typed zero values, and prevents the compiler from
-	   issuing warnings about 'case 0:' in a switch on an error_t-typed
-	   value.  */
-	ESUCCESS = 0,
+/* Errors from <mach/message.h>.  */
+#define EMACH_SEND_IN_PROGRESS         0x10000001
+#define EMACH_SEND_INVALID_DATA        0x10000002
+#define EMACH_SEND_INVALID_DEST        0x10000003
+#define EMACH_SEND_TIMED_OUT           0x10000004
+#define EMACH_SEND_WILL_NOTIFY         0x10000005
+#define EMACH_SEND_NOTIFY_IN_PROGRESS  0x10000006
+#define EMACH_SEND_INTERRUPTED         0x10000007
+#define EMACH_SEND_MSG_TOO_SMALL       0x10000008
+#define EMACH_SEND_INVALID_REPLY       0x10000009
+#define EMACH_SEND_INVALID_RIGHT       0x1000000a
+#define EMACH_SEND_INVALID_NOTIFY      0x1000000b
+#define EMACH_SEND_INVALID_MEMORY      0x1000000c
+#define EMACH_SEND_NO_BUFFER           0x1000000d
+#define EMACH_SEND_NO_NOTIFY           0x1000000e
+#define EMACH_SEND_INVALID_TYPE        0x1000000f
+#define EMACH_SEND_INVALID_HEADER      0x10000010
+#define EMACH_RCV_IN_PROGRESS          0x10004001
+#define EMACH_RCV_INVALID_NAME         0x10004002
+#define EMACH_RCV_TIMED_OUT            0x10004003
+#define EMACH_RCV_TOO_LARGE            0x10004004
+#define EMACH_RCV_INTERRUPTED          0x10004005
+#define EMACH_RCV_PORT_CHANGED         0x10004006
+#define EMACH_RCV_INVALID_NOTIFY       0x10004007
+#define EMACH_RCV_INVALID_DATA         0x10004008
+#define EMACH_RCV_PORT_DIED            0x10004009
+#define EMACH_RCV_IN_SET               0x1000400a
+#define EMACH_RCV_HEADER_ERROR         0x1000400b
+#define EMACH_RCV_BODY_ERROR           0x1000400c
 
-#undef EDOM
-#undef ERANGE
-	EPERM           = _HURD_ERRNO (1),
-#define	EPERM           _HURD_ERRNO (1) /* Operation not permitted */
-	ENOENT          = _HURD_ERRNO (2),
-#define	ENOENT          _HURD_ERRNO (2) /* No such file or directory */
-	ESRCH           = _HURD_ERRNO (3),
-#define	ESRCH           _HURD_ERRNO (3) /* No such process */
-	EINTR           = _HURD_ERRNO (4),
-#define	EINTR           _HURD_ERRNO (4) /* Interrupted system call */
-	EIO             = _HURD_ERRNO (5),
-#define	EIO             _HURD_ERRNO (5) /* Input/output error */
-	ENXIO           = _HURD_ERRNO (6),
-#define	ENXIO           _HURD_ERRNO (6) /* No such device or address */
-	E2BIG           = _HURD_ERRNO (7),
-#define	E2BIG           _HURD_ERRNO (7) /* Argument list too long */
-	ENOEXEC         = _HURD_ERRNO (8),
-#define	ENOEXEC         _HURD_ERRNO (8) /* Exec format error */
-	EBADF           = _HURD_ERRNO (9),
-#define	EBADF           _HURD_ERRNO (9) /* Bad file descriptor */
-	ECHILD          = _HURD_ERRNO (10),
-#define	ECHILD          _HURD_ERRNO (10)/* No child processes */
-	EDEADLK         = _HURD_ERRNO (11),
-#define	EDEADLK         _HURD_ERRNO (11)/* Resource deadlock avoided */
-	ENOMEM          = _HURD_ERRNO (12),
-#define	ENOMEM          _HURD_ERRNO (12)/* Cannot allocate memory */
-	EACCES          = _HURD_ERRNO (13),
-#define	EACCES          _HURD_ERRNO (13)/* Permission denied */
-	EFAULT          = _HURD_ERRNO (14),
-#define	EFAULT          _HURD_ERRNO (14)/* Bad address */
-	ENOTBLK         = _HURD_ERRNO (15),
-#define	ENOTBLK         _HURD_ERRNO (15)/* Block device required */
-	EBUSY           = _HURD_ERRNO (16),
-#define	EBUSY           _HURD_ERRNO (16)/* Device or resource busy */
-	EEXIST          = _HURD_ERRNO (17),
-#define	EEXIST          _HURD_ERRNO (17)/* File exists */
-	EXDEV           = _HURD_ERRNO (18),
-#define	EXDEV           _HURD_ERRNO (18)/* Invalid cross-device link */
-	ENODEV          = _HURD_ERRNO (19),
-#define	ENODEV          _HURD_ERRNO (19)/* No such device */
-	ENOTDIR         = _HURD_ERRNO (20),
-#define	ENOTDIR         _HURD_ERRNO (20)/* Not a directory */
-	EISDIR          = _HURD_ERRNO (21),
-#define	EISDIR          _HURD_ERRNO (21)/* Is a directory */
-	EINVAL          = _HURD_ERRNO (22),
-#define	EINVAL          _HURD_ERRNO (22)/* Invalid argument */
-	EMFILE          = _HURD_ERRNO (24),
-#define	EMFILE          _HURD_ERRNO (24)/* Too many open files */
-	ENFILE          = _HURD_ERRNO (23),
-#define	ENFILE          _HURD_ERRNO (23)/* Too many open files in system */
-	ENOTTY          = _HURD_ERRNO (25),
-#define	ENOTTY          _HURD_ERRNO (25)/* Inappropriate ioctl for device */
-	ETXTBSY         = _HURD_ERRNO (26),
-#define	ETXTBSY         _HURD_ERRNO (26)/* Text file busy */
-	EFBIG           = _HURD_ERRNO (27),
-#define	EFBIG           _HURD_ERRNO (27)/* File too large */
-	ENOSPC          = _HURD_ERRNO (28),
-#define	ENOSPC          _HURD_ERRNO (28)/* No space left on device */
-	ESPIPE          = _HURD_ERRNO (29),
-#define	ESPIPE          _HURD_ERRNO (29)/* Illegal seek */
-	EROFS           = _HURD_ERRNO (30),
-#define	EROFS           _HURD_ERRNO (30)/* Read-only file system */
-	EMLINK          = _HURD_ERRNO (31),
-#define	EMLINK          _HURD_ERRNO (31)/* Too many links */
-	EPIPE           = _HURD_ERRNO (32),
-#define	EPIPE           _HURD_ERRNO (32)/* Broken pipe */
-	EDOM            = _HURD_ERRNO (33),
-#define	EDOM            _HURD_ERRNO (33)/* Numerical argument out of domain */
-	ERANGE          = _HURD_ERRNO (34),
-#define	ERANGE          _HURD_ERRNO (34)/* Numerical result out of range */
-	EAGAIN          = _HURD_ERRNO (35),
-#define	EAGAIN          _HURD_ERRNO (35)/* Resource temporarily unavailable */
-#define EWOULDBLOCK EAGAIN /* Operation would block */
-	EINPROGRESS     = _HURD_ERRNO (36),
-#define	EINPROGRESS     _HURD_ERRNO (36)/* Operation now in progress */
-	EALREADY        = _HURD_ERRNO (37),
-#define	EALREADY        _HURD_ERRNO (37)/* Operation already in progress */
-	ENOTSOCK        = _HURD_ERRNO (38),
-#define	ENOTSOCK        _HURD_ERRNO (38)/* Socket operation on non-socket */
-	EMSGSIZE        = _HURD_ERRNO (40),
-#define	EMSGSIZE        _HURD_ERRNO (40)/* Message too long */
-	EPROTOTYPE      = _HURD_ERRNO (41),
-#define	EPROTOTYPE      _HURD_ERRNO (41)/* Protocol wrong type for socket */
-	ENOPROTOOPT     = _HURD_ERRNO (42),
-#define	ENOPROTOOPT     _HURD_ERRNO (42)/* Protocol not available */
-	EPROTONOSUPPORT = _HURD_ERRNO (43),
-#define	EPROTONOSUPPORT _HURD_ERRNO (43)/* Protocol not supported */
-	ESOCKTNOSUPPORT = _HURD_ERRNO (44),
-#define	ESOCKTNOSUPPORT _HURD_ERRNO (44)/* Socket type not supported */
-	EOPNOTSUPP      = _HURD_ERRNO (45),
-#define	EOPNOTSUPP      _HURD_ERRNO (45)/* Operation not supported */
-	EPFNOSUPPORT    = _HURD_ERRNO (46),
-#define	EPFNOSUPPORT    _HURD_ERRNO (46)/* Protocol family not supported */
-	EAFNOSUPPORT    = _HURD_ERRNO (47),
-#define	EAFNOSUPPORT    _HURD_ERRNO (47)/* Address family not supported by protocol */
-	EADDRINUSE      = _HURD_ERRNO (48),
-#define	EADDRINUSE      _HURD_ERRNO (48)/* Address already in use */
-	EADDRNOTAVAIL   = _HURD_ERRNO (49),
-#define	EADDRNOTAVAIL   _HURD_ERRNO (49)/* Cannot assign requested address */
-	ENETDOWN        = _HURD_ERRNO (50),
-#define	ENETDOWN        _HURD_ERRNO (50)/* Network is down */
-	ENETUNREACH     = _HURD_ERRNO (51),
-#define	ENETUNREACH     _HURD_ERRNO (51)/* Network is unreachable */
-	ENETRESET       = _HURD_ERRNO (52),
-#define	ENETRESET       _HURD_ERRNO (52)/* Network dropped connection on reset */
-	ECONNABORTED    = _HURD_ERRNO (53),
-#define	ECONNABORTED    _HURD_ERRNO (53)/* Software caused connection abort */
-	ECONNRESET      = _HURD_ERRNO (54),
-#define	ECONNRESET      _HURD_ERRNO (54)/* Connection reset by peer */
-	ENOBUFS         = _HURD_ERRNO (55),
-#define	ENOBUFS         _HURD_ERRNO (55)/* No buffer space available */
-	EISCONN         = _HURD_ERRNO (56),
-#define	EISCONN         _HURD_ERRNO (56)/* Transport endpoint is already connected */
-	ENOTCONN        = _HURD_ERRNO (57),
-#define	ENOTCONN        _HURD_ERRNO (57)/* Transport endpoint is not connected */
-	EDESTADDRREQ    = _HURD_ERRNO (39),
-#define	EDESTADDRREQ    _HURD_ERRNO (39)/* Destination address required */
-	ESHUTDOWN       = _HURD_ERRNO (58),
-#define	ESHUTDOWN       _HURD_ERRNO (58)/* Cannot send after transport endpoint shutdown */
-	ETOOMANYREFS    = _HURD_ERRNO (59),
-#define	ETOOMANYREFS    _HURD_ERRNO (59)/* Too many references: cannot splice */
-	ETIMEDOUT       = _HURD_ERRNO (60),
-#define	ETIMEDOUT       _HURD_ERRNO (60)/* Connection timed out */
-	ECONNREFUSED    = _HURD_ERRNO (61),
-#define	ECONNREFUSED    _HURD_ERRNO (61)/* Connection refused */
-	ELOOP           = _HURD_ERRNO (62),
-#define	ELOOP           _HURD_ERRNO (62)/* Too many levels of symbolic links */
-	ENAMETOOLONG    = _HURD_ERRNO (63),
-#define	ENAMETOOLONG    _HURD_ERRNO (63)/* File name too long */
-	EHOSTDOWN       = _HURD_ERRNO (64),
-#define	EHOSTDOWN       _HURD_ERRNO (64)/* Host is down */
-	EHOSTUNREACH    = _HURD_ERRNO (65),
-#define	EHOSTUNREACH    _HURD_ERRNO (65)/* No route to host */
-	ENOTEMPTY       = _HURD_ERRNO (66),
-#define	ENOTEMPTY       _HURD_ERRNO (66)/* Directory not empty */
-	EPROCLIM        = _HURD_ERRNO (67),
-#define	EPROCLIM        _HURD_ERRNO (67)/* Too many processes */
-	EUSERS          = _HURD_ERRNO (68),
-#define	EUSERS          _HURD_ERRNO (68)/* Too many users */
-	EDQUOT          = _HURD_ERRNO (69),
-#define	EDQUOT          _HURD_ERRNO (69)/* Disk quota exceeded */
-	ESTALE          = _HURD_ERRNO (70),
-#define	ESTALE          _HURD_ERRNO (70)/* Stale file handle */
-	EREMOTE         = _HURD_ERRNO (71),
-#define	EREMOTE         _HURD_ERRNO (71)/* Object is remote */
-	EBADRPC         = _HURD_ERRNO (72),
-#define	EBADRPC         _HURD_ERRNO (72)/* RPC struct is bad */
-	ERPCMISMATCH    = _HURD_ERRNO (73),
-#define	ERPCMISMATCH    _HURD_ERRNO (73)/* RPC version wrong */
-	EPROGUNAVAIL    = _HURD_ERRNO (74),
-#define	EPROGUNAVAIL    _HURD_ERRNO (74)/* RPC program not available */
-	EPROGMISMATCH   = _HURD_ERRNO (75),
-#define	EPROGMISMATCH   _HURD_ERRNO (75)/* RPC program version wrong */
-	EPROCUNAVAIL    = _HURD_ERRNO (76),
-#define	EPROCUNAVAIL    _HURD_ERRNO (76)/* RPC bad procedure for program */
-	ENOLCK          = _HURD_ERRNO (77),
-#define	ENOLCK          _HURD_ERRNO (77)/* No locks available */
-	EFTYPE          = _HURD_ERRNO (79),
-#define	EFTYPE          _HURD_ERRNO (79)/* Inappropriate file type or format */
-	EAUTH           = _HURD_ERRNO (80),
-#define	EAUTH           _HURD_ERRNO (80)/* Authentication error */
-	ENEEDAUTH       = _HURD_ERRNO (81),
-#define	ENEEDAUTH       _HURD_ERRNO (81)/* Need authenticator */
-	ENOSYS          = _HURD_ERRNO (78),
-#define	ENOSYS          _HURD_ERRNO (78)/* Function not implemented */
-	ENOTSUP         = _HURD_ERRNO (118),
-#define	ENOTSUP         _HURD_ERRNO (118)/* Not supported */
-	EILSEQ          = _HURD_ERRNO (106),
-#define	EILSEQ          _HURD_ERRNO (106)/* Invalid or incomplete multibyte or wide character */
-	EBACKGROUND     = _HURD_ERRNO (100),
-#define	EBACKGROUND     _HURD_ERRNO (100)/* Inappropriate operation for background process */
-	EDIED           = _HURD_ERRNO (101),
-#define	EDIED           _HURD_ERRNO (101)/* Translator died */
-	ED              = _HURD_ERRNO (102),
-#define	ED              _HURD_ERRNO (102)/* ? */
-	EGREGIOUS       = _HURD_ERRNO (103),
-#define	EGREGIOUS       _HURD_ERRNO (103)/* You really blew it this time */
-	EIEIO           = _HURD_ERRNO (104),
-#define	EIEIO           _HURD_ERRNO (104)/* Computer bought the farm */
-	EGRATUITOUS     = _HURD_ERRNO (105),
-#define	EGRATUITOUS     _HURD_ERRNO (105)/* Gratuitous error */
-	EBADMSG         = _HURD_ERRNO (107),
-#define	EBADMSG         _HURD_ERRNO (107)/* Bad message */
-	EIDRM           = _HURD_ERRNO (108),
-#define	EIDRM           _HURD_ERRNO (108)/* Identifier removed */
-	EMULTIHOP       = _HURD_ERRNO (109),
-#define	EMULTIHOP       _HURD_ERRNO (109)/* Multihop attempted */
-	ENODATA         = _HURD_ERRNO (110),
-#define	ENODATA         _HURD_ERRNO (110)/* No data available */
-	ENOLINK         = _HURD_ERRNO (111),
-#define	ENOLINK         _HURD_ERRNO (111)/* Link has been severed */
-	ENOMSG          = _HURD_ERRNO (112),
-#define	ENOMSG          _HURD_ERRNO (112)/* No message of desired type */
-	ENOSR           = _HURD_ERRNO (113),
-#define	ENOSR           _HURD_ERRNO (113)/* Out of streams resources */
-	ENOSTR          = _HURD_ERRNO (114),
-#define	ENOSTR          _HURD_ERRNO (114)/* Device not a stream */
-	EOVERFLOW       = _HURD_ERRNO (115),
-#define	EOVERFLOW       _HURD_ERRNO (115)/* Value too large for defined data type */
-	EPROTO          = _HURD_ERRNO (116),
-#define	EPROTO          _HURD_ERRNO (116)/* Protocol error */
-	ETIME           = _HURD_ERRNO (117),
-#define	ETIME           _HURD_ERRNO (117)/* Timer expired */
-	ECANCELED       = _HURD_ERRNO (119),
-#define	ECANCELED       _HURD_ERRNO (119)/* Operation canceled */
+/* Errors from <mach/kern_return.h>.  */
+#define EKERN_INVALID_ADDRESS          1
+#define EKERN_PROTECTION_FAILURE       2
+#define EKERN_NO_SPACE                 3
+#define EKERN_INVALID_ARGUMENT         4
+#define EKERN_FAILURE                  5
+#define EKERN_RESOURCE_SHORTAGE        6
+#define EKERN_NOT_RECEIVER             7
+#define EKERN_NO_ACCESS                8
+#define EKERN_MEMORY_FAILURE           9
+#define EKERN_MEMORY_ERROR             10
+#define EKERN_NOT_IN_SET               12
+#define EKERN_NAME_EXISTS              13
+#define EKERN_ABORTED                  14
+#define EKERN_INVALID_NAME             15
+#define EKERN_INVALID_TASK             16
+#define EKERN_INVALID_RIGHT            17
+#define EKERN_INVALID_VALUE            18
+#define EKERN_UREFS_OVERFLOW           19
+#define EKERN_INVALID_CAPABILITY       20
+#define EKERN_RIGHT_EXISTS             21
+#define EKERN_INVALID_HOST             22
+#define EKERN_MEMORY_PRESENT           23
+#define EKERN_WRITE_PROTECTION_FAILURE 24
+#define EKERN_TERMINATED               26
+#define EKERN_TIMEDOUT                 27
+#define EKERN_INTERRUPTED              28
 
-	/* Errors from <mach/message.h>.  */
-	EMACH_SEND_IN_PROGRESS          = 0x10000001,
-	EMACH_SEND_INVALID_DATA         = 0x10000002,
-	EMACH_SEND_INVALID_DEST         = 0x10000003,
-	EMACH_SEND_TIMED_OUT            = 0x10000004,
-	EMACH_SEND_WILL_NOTIFY          = 0x10000005,
-	EMACH_SEND_NOTIFY_IN_PROGRESS   = 0x10000006,
-	EMACH_SEND_INTERRUPTED          = 0x10000007,
-	EMACH_SEND_MSG_TOO_SMALL        = 0x10000008,
-	EMACH_SEND_INVALID_REPLY        = 0x10000009,
-	EMACH_SEND_INVALID_RIGHT        = 0x1000000a,
-	EMACH_SEND_INVALID_NOTIFY       = 0x1000000b,
-	EMACH_SEND_INVALID_MEMORY       = 0x1000000c,
-	EMACH_SEND_NO_BUFFER            = 0x1000000d,
-	EMACH_SEND_NO_NOTIFY            = 0x1000000e,
-	EMACH_SEND_INVALID_TYPE         = 0x1000000f,
-	EMACH_SEND_INVALID_HEADER       = 0x10000010,
-	EMACH_RCV_IN_PROGRESS           = 0x10004001,
-	EMACH_RCV_INVALID_NAME          = 0x10004002,
-	EMACH_RCV_TIMED_OUT             = 0x10004003,
-	EMACH_RCV_TOO_LARGE             = 0x10004004,
-	EMACH_RCV_INTERRUPTED           = 0x10004005,
-	EMACH_RCV_PORT_CHANGED          = 0x10004006,
-	EMACH_RCV_INVALID_NOTIFY        = 0x10004007,
-	EMACH_RCV_INVALID_DATA          = 0x10004008,
-	EMACH_RCV_PORT_DIED             = 0x10004009,
-	EMACH_RCV_IN_SET                = 0x1000400a,
-	EMACH_RCV_HEADER_ERROR          = 0x1000400b,
-	EMACH_RCV_BODY_ERROR            = 0x1000400c,
+/* Errors from <mach/mig_errors.h>.  */
+#define EMIG_TYPE_ERROR                (-300) /* client type check failure */
+#define EMIG_REPLY_MISMATCH            (-301) /* wrong reply message ID */
+#define EMIG_REMOTE_ERROR              (-302) /* server detected error */
+#define EMIG_BAD_ID                    (-303) /* bad request message ID */
+#define EMIG_BAD_ARGUMENTS             (-304) /* server type check failure */
+#define EMIG_NO_REPLY                  (-305) /* no reply should be sent */
+#define EMIG_EXCEPTION                 (-306) /* server raised exception */
+#define EMIG_ARRAY_TOO_LARGE           (-307) /* array not large enough */
+#define EMIG_SERVER_DIED               (-308) /* server died */
+#define EMIG_DESTROY_REQUEST           (-309) /* destroy request with no reply */
 
-	/* Errors from <mach/kern_return.h>.  */
-	EKERN_INVALID_ADDRESS           = 1,
-	EKERN_PROTECTION_FAILURE        = 2,
-	EKERN_NO_SPACE                  = 3,
-	EKERN_INVALID_ARGUMENT          = 4,
-	EKERN_FAILURE                   = 5,
-	EKERN_RESOURCE_SHORTAGE         = 6,
-	EKERN_NOT_RECEIVER              = 7,
-	EKERN_NO_ACCESS                 = 8,
-	EKERN_MEMORY_FAILURE            = 9,
-	EKERN_MEMORY_ERROR              = 10,
-	EKERN_NOT_IN_SET                = 12,
-	EKERN_NAME_EXISTS               = 13,
-	EKERN_ABORTED                   = 14,
-	EKERN_INVALID_NAME              = 15,
-	EKERN_INVALID_TASK              = 16,
-	EKERN_INVALID_RIGHT             = 17,
-	EKERN_INVALID_VALUE             = 18,
-	EKERN_UREFS_OVERFLOW            = 19,
-	EKERN_INVALID_CAPABILITY        = 20,
-	EKERN_RIGHT_EXISTS              = 21,
-	EKERN_INVALID_HOST              = 22,
-	EKERN_MEMORY_PRESENT            = 23,
-	EKERN_WRITE_PROTECTION_FAILURE  = 24,
-	EKERN_TERMINATED                = 26,
-
-	/* Errors from <mach/mig_errors.h>.  */
-	EMIG_TYPE_ERROR         = -300  /* client type check failure */,
-	EMIG_REPLY_MISMATCH     = -301  /* wrong reply message ID */,
-	EMIG_REMOTE_ERROR       = -302  /* server detected error */,
-	EMIG_BAD_ID             = -303  /* bad request message ID */,
-	EMIG_BAD_ARGUMENTS      = -304  /* server type check failure */,
-	EMIG_NO_REPLY           = -305  /* no reply should be sent */,
-	EMIG_EXCEPTION          = -306  /* server raised exception */,
-	EMIG_ARRAY_TOO_LARGE    = -307  /* array not large enough */,
-	EMIG_SERVER_DIED        = -308  /* server died */,
-	EMIG_DESTROY_REQUEST    = -309  /* destroy request with no reply */,
-
-	/* Errors from <device/device_types.h>.  */
-	ED_IO_ERROR             = 2500  /* hardware IO error */,
-	ED_WOULD_BLOCK          = 2501  /* would block, but D_NOWAIT set */,
-	ED_NO_SUCH_DEVICE       = 2502  /* no such device */,
-	ED_ALREADY_OPEN         = 2503  /* exclusive-use device already open */,
-	ED_DEVICE_DOWN          = 2504  /* device has been shut down */,
-	ED_INVALID_OPERATION    = 2505  /* bad operation for device */,
-	ED_INVALID_RECNUM       = 2506  /* invalid record (block) number */,
-	ED_INVALID_SIZE         = 2507  /* invalid IO size */,
-	ED_NO_MEMORY            = 2508  /* memory allocation failure */,
-	ED_READ_ONLY            = 2509  /* device cannot be written to */
-
-};
+/* Errors from <device/device_types.h>.  */
+#define ED_IO_ERROR                      2500 /* hardware IO error */
+#define ED_WOULD_BLOCK                   2501 /* would block, but D_NOWAIT set */
+#define ED_NO_SUCH_DEVICE                2502 /* no such device */
+#define ED_ALREADY_OPEN                  2503 /* exclusive-use device already open */
+#define ED_DEVICE_DOWN                   2504 /* device has been shut down */
+#define ED_INVALID_OPERATION             2505 /* bad operation for device */
+#define ED_INVALID_RECNUM                2506 /* invalid record (block) number */
+#define ED_INVALID_SIZE                  2507 /* invalid IO size */
+#define ED_NO_MEMORY                     2508 /* memory allocation failure */
+#define ED_READ_ONLY                     2509 /* device cannot be written to */
 
 #define	_HURD_ERRNOS	120
 
-/* User-visible type of error codes.  It is ok to use `int' or
-   `kern_return_t' for these, but with `error_t' the debugger prints
-   symbolic values.  */
-#ifdef __USE_GNU
-typedef enum __error_t_codes error_t;
-#define __error_t_defined	1
-#endif
-
-/* Return the current thread's location for `errno'.
-   The syntax of this function allows redeclarations like `int errno'.  */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-#define errno			(*__errno_location ())
-
-#endif /* <errno.h> included.  */
-
-#if !defined (_ERRNO_H) && defined (__need_Emath)
-#define	EDOM            _HURD_ERRNO (33)/* Numerical argument out of domain */
-#define	ERANGE          _HURD_ERRNO (34)/* Numerical result out of range */
-#endif /* <errno.h> not included and need math error codes.  */
+#endif /* bits/errno.h.  */
diff --git a/sysdeps/mach/hurd/errnos.awk b/sysdeps/mach/hurd/errnos.awk
index 1cd2a0ac96..1459244a5c 100644
--- a/sysdeps/mach/hurd/errnos.awk
+++ b/sysdeps/mach/hurd/errnos.awk
@@ -21,26 +21,17 @@
 BEGIN {
     print "/* This file generated by errnos.awk.  */";
     print "";
-    print "/* The Hurd uses Mach error system 0x10, currently only subsystem 0. */";
-    print "#ifndef _HURD_ERRNO";
-    print "#define _HURD_ERRNO(n)\t((0x10 << 26) | ((n) & 0x3fff))";
+    print "#ifndef _BITS_ERRNO_H";
+    print "#define _BITS_ERRNO_H 1";
+    print "";
+    print "#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H";
+    print "#error \"Never include <bits/errno.h> directly; use <errno.h> instead.\"";
     print "#endif";
     print "";
-    print "#ifdef _ERRNO_H\n";
-    print "enum __error_t_codes\n{";
-    print "\t/* The value zero always means success and it is perfectly fine for";
-    print "\t   code to use 0 explicitly (or implicitly, e.g. via Boolean coercion).";
-    print "\t   Having an enum entry for zero both makes the debugger print the name";
-    print "\t   for error_t-typed zero values, and prevents the compiler from";
-    print "\t   issuing warnings about 'case 0:' in a switch on an error_t-typed";
-    print "\t   value.  */";
-    print "\tESUCCESS = 0,"
-    print "";
+    print "/* The Hurd uses Mach error system 0x10, currently only subsystem 0. */";
     maxerrno = 0;
     in_mach_errors = "";
     in_math = 0;
-    edom = erange = "";
-    print "#undef EDOM\n#undef ERANGE";
     lno = 0;
   }
 
@@ -49,41 +40,41 @@ BEGIN {
     etext = "";
     for (i = 3; i <= NF; ++i)
       etext = etext " " $i;
-    etext = substr(etext, 1, length(etext)-1)
+    etext = substr(etext, 1, length(etext)-1);
 
-    e = substr($1, 8, length($1)-8)
-    if (e == "EWOULDBLOCK")
+    e = substr($1, 8, length($1)-8);
+    errno = substr($2, 1, length($2)-1);
+    if (errno ~ /^E[A-Z0-9_]*$/)
       {
-	lines[lno++]="#define EWOULDBLOCK EAGAIN /* Operation would block */";
+	printf ("#define %-30s %-10s /*%s */\n", e, errno, etext);
 	next;
       }
 
-    errno = substr($2, 1, length($2)-1) + 0
+    errno = errno + 0;
     if (errno == 0)
       next;
-    if (errno > maxerrno) maxerrno = errno;
-    x = sprintf ("%-40s/*%s */", sprintf ("%-24s%s", "#define\t" e,
-					  "_HURD_ERRNO (" errno ")"),
-		 etext);
-    if (e == "EDOM")
-      edom = x;
-    else if (e == "ERANGE")
-      erange = x;
-    comma[lno] = 1;
-    lines[lno++] = sprintf("\t%-16s= _HURD_ERRNO (%d)", e, errno);
-    lines[lno++] = x;
+    if (errno > 0x3fff)
+      {
+	printf("%s:%d: errno value %d too large for the Hurd\n",
+	       FILENAME, NR, errno) >> "/dev/stderr";
+	exit 1;
+      }
+    if (errno > maxerrno)
+      maxerrno = errno;
+    printf ("#define %-30s 0x%08x /*%s */\n",
+	    e, 0x40000000 + errno, etext);
     next;
   }
 
 NF == 3 && $1 == "#define" && $2 == "MACH_SEND_IN_PROGRESS" \
   {
     in_mach_errors = FILENAME;
-    lines[lno++] = "\n\t/* Errors from <mach/message.h>.  */";
+    print "\n/* Errors from <mach/message.h>.  */";
   }
 NF == 3 && $1 == "#define" && $2 == "KERN_SUCCESS" \
   {
     in_mach_errors = FILENAME;
-    lines[lno++] = "\n\t/* Errors from <mach/kern_return.h>.  */";
+    print "\n/* Errors from <mach/kern_return.h>.  */";
     next;
   }
 
@@ -94,14 +85,13 @@ in_mach_errors != "" && $2 == "MACH_IPC_COMPAT" \
 
 in_mach_errors == FILENAME && NF == 3 && $1 == "#define" \
   {
-    comma[lno] = 1;
-    lines[lno++] = sprintf("\t%-32s= %s", "E" $2, $3);
+    printf("#define %-30s %s\n", "E" $2, $3);
   }
 
 $1 == "#define" && $2 == "_MACH_MIG_ERRORS_H_" \
   {
     in_mig_errors = 1;
-    lines[lno++] = "\n\t/* Errors from <mach/mig_errors.h>.  */";
+    print "\n/* Errors from <mach/mig_errors.h>.  */";
     next;
   }
 in_mig_errors && $1 == "#endif" && $3 == "_MACH_MIG_ERRORS_H_" \
@@ -115,14 +105,17 @@ in_mig_errors && $1 == "#endif" && $3 == "_MACH_MIG_ERRORS_H_" \
     comment = "";
     for (i = 4; i <= NF; ++i)
       comment = comment " " $i;
-    comma[lno] = 1;
-    lines[lno++] = sprintf("%-32s", sprintf ("\t%-24s= %s", "E" $2, $3)) comment;
+    if ($3 < 0)
+	val = "(" $3 ")";
+    else
+	val = $3;
+    printf("#define %-30s %6s%s\n", "E" $2, val, comment);
   }
 
 $1 == "#define" && $2 == "D_SUCCESS" \
   {
     in_device_errors = 1;
-    lines[lno++] = "\n\t/* Errors from <device/device_types.h>.  */";
+    print "\n/* Errors from <device/device_types.h>.  */";
     next;
   }
 in_device_errors && $1 == "#endif" \
@@ -131,35 +124,9 @@ in_device_errors && $1 == "#endif" \
   }
 
 
-END \
-  {
-    for (i = 0; i < lno - 1; ++i)
-      printf "%s%s\n", lines[i], (comma[i] ? "," : "");
-    print lines[i];
-    print "";
-    print "};";
+END {
     print "";
     printf "#define\t_HURD_ERRNOS\t%d\n", maxerrno+1;
     print "";
-    print "\
-/* User-visible type of error codes.  It is ok to use `int' or\n\
-   `kern_return_t' for these, but with `error_t' the debugger prints\n\
-   symbolic values.  */";
-    print "#ifdef __USE_GNU";
-    print "typedef enum __error_t_codes error_t;"
-    print "#define __error_t_defined\t1"
-    print "#endif";
-    print "";
-    print "\
-/* Return the current thread's location for `errno'.\n\
-   The syntax of this function allows redeclarations like `int errno'.  */\n\
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));\n\
-\n\
-#define errno			(*__errno_location ())\n\
-";
-    print "#endif /* <errno.h> included.  */";
-    print "";
-    print "#if !defined (_ERRNO_H) && defined (__need_Emath)";
-    print edom; print erange;
-    print "#endif /* <errno.h> not included and need math error codes.  */";
+    print "#endif /* bits/errno.h.  */";
   }
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/errno.h b/sysdeps/unix/sysv/linux/alpha/bits/errno.h
index 3338621710..bcab228eda 100644
--- a/sysdeps/unix/sysv/linux/alpha/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/alpha/bits/errno.h
@@ -16,23 +16,29 @@
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
 
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
 # include <linux/errno.h>
 
-/* Linux has no ENOTSUP error code.  */
-# define ENOTSUP EOPNOTSUPP
-
-# ifndef ECANCELED
-#  define ECANCELED	131
+/* Older Linux headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
+
+# ifndef ECANCELED
+#  define ECANCELED		131
 # endif
 
-/* Support for error codes to support robust mutexes was added later, too.  */
 # ifndef EOWNERDEAD
 #  define EOWNERDEAD		136
+# endif
+
+# ifndef ENOTRECOVERABLE
 #  define ENOTRECOVERABLE	137
 # endif
 
@@ -44,22 +50,4 @@
 #  define EHWPOISON		139
 # endif
 
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable.  */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-#  if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value.  */
-#   define errno (*__errno_location ())
-#  endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough.  We must
-   define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
-   defined.  */
-# define EDOM	33	/* Math argument out of domain of function.  */
-# define EILSEQ	116	/* Illegal byte sequence.  */
-# define ERANGE	34	/* Math result not representable.  */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h.  */
diff --git a/sysdeps/unix/sysv/linux/bits/errno.h b/sysdeps/unix/sysv/linux/bits/errno.h
index c0f4d20fe7..38019b76be 100644
--- a/sysdeps/unix/sysv/linux/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/bits/errno.h
@@ -16,24 +16,29 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
 
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
 # include <linux/errno.h>
 
-/* Linux has no ENOTSUP error code.  */
-# define ENOTSUP EOPNOTSUPP
-
-/* Older Linux versions also had no ECANCELED error code.  */
-# ifndef ECANCELED
-#  define ECANCELED	125
+/* Older Linux headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
+
+# ifndef ECANCELED
+#  define ECANCELED		125
 # endif
 
-/* Support for error codes to support robust mutexes was added later, too.  */
 # ifndef EOWNERDEAD
 #  define EOWNERDEAD		130
+# endif
+
+#ifndef ENOTRECOVERABLE
 #  define ENOTRECOVERABLE	131
 # endif
 
@@ -45,22 +50,4 @@
 #  define EHWPOISON		133
 # endif
 
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable.  */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-#  if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value.  */
-#   define errno (*__errno_location ())
-#  endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough.  We must
-   define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
-   defined.  */
-# define EDOM	33	/* Math argument out of domain of function.  */
-# define EILSEQ	84	/* Illegal byte sequence.  */
-# define ERANGE	34	/* Math result not representable.  */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h.  */
diff --git a/sysdeps/unix/sysv/linux/hppa/bits/errno.h b/sysdeps/unix/sysv/linux/hppa/bits/errno.h
index ce6bebe8b0..241b6966a8 100644
--- a/sysdeps/unix/sysv/linux/hppa/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/hppa/bits/errno.h
@@ -16,17 +16,22 @@
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
 
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
 # include <linux/errno.h>
 
-/* Linux also has no ECANCELED error code.  Since it is not used here
-   we define it to an invalid value.  */
+/* Older Linux headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
+
 # ifndef ECANCELED
-#  define ECANCELED	ECANCELLED
+#  define ECANCELED		253
 # endif
 
 # ifndef EOWNERDEAD
@@ -45,22 +50,4 @@
 #  define EHWPOISON		257
 # endif
 
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable.  */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-#  if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value.  */
-#   define errno (*__errno_location ())
-#  endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough.  We must
-   define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
-   defined.  */
-# define EDOM	33	/* Math argument out of domain of function.  */
-# define EILSEQ	47	/* Illegal byte sequence.  */
-# define ERANGE	34	/* Math result not representable.  */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h.  */
diff --git a/sysdeps/unix/sysv/linux/mips/bits/errno.h b/sysdeps/unix/sysv/linux/mips/bits/errno.h
index fa62e1fc83..55df83d038 100644
--- a/sysdeps/unix/sysv/linux/mips/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/mips/bits/errno.h
@@ -16,23 +16,28 @@
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
 
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
 # include <linux/errno.h>
 
-/* Linux has no ENOTSUP error code.  */
-# define ENOTSUP EOPNOTSUPP
-
-# ifndef ECANCELED
-#  define ECANCELED	158
+/* Older Linux headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
+
+# ifndef ECANCELED
+#  define ECANCELED		158
 # endif
 
-/* Support for error codes to support robust mutexes was added later, too.  */
 # ifndef EOWNERDEAD
 #  define EOWNERDEAD		165
+# endif
+
+# ifndef ENOTRECOVERABLE
 #  define ENOTRECOVERABLE	166
 # endif
 
@@ -44,22 +49,4 @@
 #  define EHWPOISON		168
 # endif
 
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable.  */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-#  if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value.  */
-#   define errno (*__errno_location ())
-#  endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough.  We must
-   define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
-   defined.  */
-# define EDOM	33	/* Math argument out of domain of function.  */
-# define EILSEQ	88	/* Illegal byte sequence.  */
-# define ERANGE	34	/* Math result not representable.  */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h.  */
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/errno.h b/sysdeps/unix/sysv/linux/sparc/bits/errno.h
index 4a8d8a0879..9e13e663af 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/errno.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/errno.h
@@ -16,23 +16,29 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
+
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
 
-# undef EDOM
-# undef EILSEQ
-# undef ERANGE
 # include <linux/errno.h>
 
-/* Linux has no ENOTSUP error code.  */
-# define ENOTSUP EOPNOTSUPP
-
-# ifndef ECANCELED
-#  define ECANCELED	127
+/* Older Linux headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
+
+# ifndef ECANCELED
+#  define ECANCELED		127
 # endif
 
-/* Support for error codes to support robust mutexes was added later, too.  */
 # ifndef EOWNERDEAD
 #  define EOWNERDEAD		132
+# endif
+
+# ifndef ENOTRECOVERABLE
 #  define ENOTRECOVERABLE	133
 # endif
 
@@ -44,22 +50,4 @@
 #  define EHWPOISON		135
 # endif
 
-# ifndef __ASSEMBLER__
-/* Function to get address of global `errno' variable.  */
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));
-
-#  if !defined _LIBC || defined _LIBC_REENTRANT
-/* When using threads, errno is a per-thread value.  */
-#   define errno (*__errno_location ())
-#  endif
-# endif /* !__ASSEMBLER__ */
-#endif /* _ERRNO_H */
-
-#if !defined _ERRNO_H && defined __need_Emath
-/* This is ugly but the kernel header is not clean enough.  We must
-   define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is
-   defined.  */
-# define EDOM	33	/* Math argument out of domain of function.  */
-# define EILSEQ	122	/* Illegal byte sequence.  */
-# define ERANGE	34	/* Math result not representable.  */
-#endif /* !_ERRNO_H && __need_Emath */
+#endif /* bits/errno.h.  */
diff --git a/sysdeps/x86_64/fpu/s_cosf.S b/sysdeps/x86_64/fpu/s_cosf.S
index e9fdc7e56e..7acafcd1be 100644
--- a/sysdeps/x86_64/fpu/s_cosf.S
+++ b/sysdeps/x86_64/fpu/s_cosf.S
@@ -17,8 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
 
 /* Short algorithm description:
  *
diff --git a/sysdeps/x86_64/fpu/s_sincosf.S b/sysdeps/x86_64/fpu/s_sincosf.S
index e6ed81ed91..fd35a3153b 100644
--- a/sysdeps/x86_64/fpu/s_sincosf.S
+++ b/sysdeps/x86_64/fpu/s_sincosf.S
@@ -17,8 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
 
 /* Short algorithm description:
  *
diff --git a/sysdeps/x86_64/fpu/s_sinf.S b/sysdeps/x86_64/fpu/s_sinf.S
index 0aa5d43d8c..253ba7d6f0 100644
--- a/sysdeps/x86_64/fpu/s_sinf.S
+++ b/sysdeps/x86_64/fpu/s_sinf.S
@@ -17,8 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#define __need_Emath
-#include <bits/errno.h>
+#include <errno.h>
 
 /* Short algorithm description:
  *
-- 
2.11.0

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 2/6] Committed: Remove __need macros from signal.h.
  2017-05-20 23:18 [PATCH 0/6] Elimination of __need macros, round 3(?) Zack Weinberg
                   ` (2 preceding siblings ...)
  2017-05-20 23:18 ` [PATCH 6/6] Remove __need_schedparam and __cpu_set_t_defined Zack Weinberg
@ 2017-05-20 23:18 ` Zack Weinberg
  2017-05-21  7:19   ` Andreas Schwab
  2017-05-22 11:18   ` Joseph Myers
  2017-05-20 23:18 ` [PATCH 4/6] Remove __need macros from stdio.h and wchar.h Zack Weinberg
                   ` (2 subsequent siblings)
  6 siblings, 2 replies; 14+ messages in thread
From: Zack Weinberg @ 2017-05-20 23:18 UTC (permalink / raw)
  To: libc-alpha

The types affected are __sig_atomic_t, sig_atomic_t, __sigset_t,
sigset_t, sigval_t, sigevent_t, and siginfo_t. __sig_atomic_t is a
scalar, so it's now directly available from bits/types.h.  The others
get bits/types/ headers.

Side effects include: There have been small changes to which
non-signal headers expose which subset of the signal-related types.
A couple of architectures' nested siginfo_t fields had to be renamed
to prevent undesired macro expansion.  Internal code that wants to
manipulate signal masks must now include <sigsetops.h> (which is not
installed) and should be aware that __sigaddset, __sigandset,
__sigdelset, __sigemptyset, and __sigorset no longer return a value
(unlike the public API).  Relatedly, the public signal.h no longer
declares any of those functions.  The obsolete sigmask() macro no
longer has a system-specific definition -- in the cases where it
matters, it didn't work anyway.

New Linux architectures should create bits/siginfo-arch.h and/or
bits/siginfo-consts-arch.h to customize their siginfo_t, rather than
duplicating everything in bits/siginfo.h (which no longer exists).
Add new __SI_* macros if necessary.  Ports to other operating systems
are strongly encouraged to generalize this scheme further.

	* bits/sigevent-consts.h
	* bits/siginfo-consts.h
	* bits/types/__sigset_t.h
	* bits/types/sigevent_t.h
	* bits/types/siginfo_t.h
	* sysdeps/unix/sysv/linux/bits/sigevent-consts.h
	* sysdeps/unix/sysv/linux/bits/siginfo-consts.h
	* sysdeps/unix/sysv/linux/bits/types/__sigset_t.h
	* sysdeps/unix/sysv/linux/bits/types/sigevent_t.h
	* sysdeps/unix/sysv/linux/bits/types/siginfo_t.h:
	New system-dependent bits headers.

	* sysdeps/unix/sysv/linux/bits/siginfo-arch.h
	* sysdeps/unix/sysv/linux/bits/siginfo-consts-arch.h
	* sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h
	* sysdeps/unix/sysv/linux/ia64/bits/siginfo-consts-arch.h
	* sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h
	* sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
	* sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h
	* sysdeps/unix/sysv/linux/tile/bits/siginfo-consts-arch.h
	* sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h:
	New Linux-only system-dependent bits headers.

	* signal/bits/types/sig_atomic_t.h
	* signal/bits/types/sigset_t.h
	* signal/bits/types/sigval_t.h:
	New non-system-dependent bits headers.

	* sysdeps/generic/sigsetops.h
	* sysdeps/unix/sysv/linux/sigsetops.h:
	New internal headers.

	* include/bits/types/sig_atomic_t.h
	* include/bits/types/sigset_t.h
	* include/bits/types/sigval_t.h:
	New wrappers.

	* signal/sigsetops.h
	* bits/siginfo.h
	* bits/sigset.h
	* sysdeps/unix/sysv/linux/bits/siginfo.h
	* sysdeps/unix/sysv/linux/bits/sigset.h
	* sysdeps/unix/sysv/linux/ia64/bits/siginfo.h
	* sysdeps/unix/sysv/linux/mips/bits/siginfo.h
	* sysdeps/unix/sysv/linux/s390/bits/siginfo.h
	* sysdeps/unix/sysv/linux/sparc/bits/siginfo.h
	* sysdeps/unix/sysv/linux/tile/bits/siginfo.h
	* sysdeps/unix/sysv/linux/x86/bits/siginfo.h:
	Deleted.

	* signal/Makefile, sysdeps/unix/sysv/linux/Makefile:
	Update lists of installed headers.

	* posix/bits/types.h: Define __sig_atomic_t here.
	* signal/signal.h: Use the new bits headers; no need to handle
	__need_sig_atomic_t nor __need_sigset_t.  Don't use __sigmask
	to define sigmask.
	* include/signal.h: No need to handle __need_sig_atomic_t
	nor __need_sigset_t.  Don't define __sigemptyset.

	* io/sys/poll.h, setjmp/setjmp.h
	* sysdeps/arm/sys/ucontext.h, sysdeps/generic/sys/ucontext.h
	* sysdeps/i386/sys/ucontext.h, sysdeps/m68k/sys/ucontext.h
	* sysdeps/mach/hurd/i386/bits/sigcontext.h
	* sysdeps/mips/sys/ucontext.h, sysdeps/powerpc/novmxsetjmp.h
	* sysdeps/pthread/bits/sigthread.h
	* sysdeps/unix/sysv/linux/hppa/sys/ucontext.h
	* sysdeps/unix/sysv/linux/m68k/sys/ucontext.h
	* sysdeps/unix/sysv/linux/mips/sys/ucontext.h
	* sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
	* sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
	* sysdeps/unix/sysv/linux/s390/sys/ucontext.h
	* sysdeps/unix/sysv/linux/sh/sys/ucontext.h
	* sysdeps/unix/sysv/linux/sparc/sys/ucontext.h
	* sysdeps/unix/sysv/linux/tile/sys/ucontext.h
	* sysdeps/unix/sysv/linux/x86/sys/ucontext.h:
	Use bits/types/__sigset_t.h.

	* misc/sys/select.h, posix/spawn.h
	* sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
	* sysdeps/unix/sysv/linux/sys/epoll.h
	* sysdeps/unix/sysv/linux/sys/signalfd.h:
	Use bits/types/sigset_t.h.

	* resolv/netdb.h, rt/mqueue.h: Use bits/types/sigevent_t.h.
	* rt/aio.h: Use bits/types/sigevent_t.h and bits/sigevent-consts.h.
	* socket/sys/socket.h: Don't include bits/sigset.h.

	* login/utmp_file.c, shadow/lckpwdf.c, signal/sigandset.c
	* signal/sigisempty.c, stdlib/abort.c, sysdeps/posix/profil.c
	* sysdeps/posix/sigignore.c, sysdeps/posix/sigintr.c
	* sysdeps/posix/signal.c, sysdeps/posix/sigset.c
	* sysdeps/posix/sprofil.c, sysdeps/posix/sysv_signal.c
	* sysdeps/unix/sysv/linux/nptl-signals.h:
	Include sigsetops.h.

	* signal/sigaddset.c, signal/sigandset.c, signal/sigdelset.c
	* signal/sigorset.c, stdlib/abort.c, sysdeps/posix/sigignore.c
	* sysdeps/posix/signal.c, sysdeps/posix/sigset.c:
	__sigaddset, __sigandset, __sigdelset, __sigemptyset, __sigorset
	now return no value.

	* signal/sigaddset.c, signal/sigdelset.c, signal/sigismem.c
	Include <errno.h>, <signal.h>, and <sigsetops.h> instead of
	"sigsetops.h".

	* signal/sigsetops.c: Explicitly define __sigismember,
	__sigaddset, and __sigdelset as compatibility symbols.

	* signal/Versions: Correct commentary on __sigpause,
	__sigaddset, __sigdelset, __sigismember.

	* inet/rcmd.c: Include sigsetops.h.  Convert old code using
	__sigblock/__sigsetmask to use __sigprocmask and friends.
---
 signal/sigsetops.h => bits/sigevent-consts.h       |  31 +-
 bits/{siginfo.h => siginfo-consts.h}               |  74 +----
 bits/sigset.h                                      |  84 -----
 bits/types/__sigset_t.h                            |   7 +
 bits/types/sigevent_t.h                            |  17 +
 bits/types/siginfo_t.h                             |  21 ++
 include/bits/types/sig_atomic_t.h                  |   1 +
 include/bits/types/sigset_t.h                      |   1 +
 include/bits/types/sigval_t.h                      |   1 +
 include/signal.h                                   |  15 +-
 inet/rcmd.c                                        |  16 +-
 io/sys/poll.h                                      |   6 +-
 login/utmp_file.c                                  |   1 +
 misc/sys/select.h                                  |   9 +-
 posix/bits/types.h                                 |   4 +
 posix/spawn.h                                      |   3 +-
 posix/sys/wait.h                                   |   3 +-
 resolv/netdb.h                                     |   3 +-
 rt/aio.h                                           |   4 +-
 rt/mqueue.h                                        |   3 +-
 setjmp/setjmp.h                                    |   3 +-
 shadow/lckpwdf.c                                   |   1 +
 signal/Makefile                                    |  12 +-
 signal/Versions                                    |   8 +-
 signal/bits/types/sig_atomic_t.h                   |  10 +
 signal/bits/types/sigset_t.h                       |   9 +
 signal/bits/types/sigval_t.h                       |  13 +
 signal/sigaddset.c                                 |   7 +-
 signal/sigandset.c                                 |   8 +-
 signal/sigdelset.c                                 |   7 +-
 signal/sigisempty.c                                |   7 +-
 signal/sigismem.c                                  |   4 +-
 signal/signal.h                                    |  43 +--
 signal/sigorset.c                                  |   8 +-
 signal/sigsetops.c                                 |  58 +++-
 socket/sys/socket.h                                |   5 -
 stdlib/abort.c                                     |   9 +-
 sysdeps/arm/sys/ucontext.h                         |   1 +
 sysdeps/generic/sigsetops.h                        |  77 +++++
 sysdeps/generic/sys/ucontext.h                     |   1 +
 sysdeps/i386/sys/ucontext.h                        |   1 +
 sysdeps/m68k/sys/ucontext.h                        |   1 +
 sysdeps/mach/hurd/i386/bits/sigcontext.h           |   1 +
 sysdeps/mips/sys/ucontext.h                        |   1 +
 sysdeps/posix/profil.c                             |   1 +
 sysdeps/posix/sigignore.c                          |   5 +-
 sysdeps/posix/sigintr.c                            |   1 +
 sysdeps/posix/signal.c                             |   7 +-
 sysdeps/posix/sigset.c                             |  67 ++--
 sysdeps/posix/sprofil.c                            |   1 +
 sysdeps/posix/sysv_signal.c                        |   5 +-
 sysdeps/powerpc/novmxsetjmp.h                      |   2 +-
 sysdeps/pthread/bits/sigthread.h                   |   1 +
 sysdeps/unix/sysv/linux/Makefile                   |   3 +-
 sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h     |   1 +
 sysdeps/unix/sysv/linux/alpha/sys/ucontext.h       |   1 +
 sysdeps/unix/sysv/linux/arm/sys/ucontext.h         |   1 +
 sysdeps/unix/sysv/linux/bits/sigevent-consts.h     |  41 +++
 sysdeps/unix/sysv/linux/bits/siginfo-arch.h        |   7 +
 sysdeps/unix/sysv/linux/bits/siginfo-consts-arch.h |   7 +
 sysdeps/unix/sysv/linux/bits/siginfo-consts.h      | 185 +++++++++++
 sysdeps/unix/sysv/linux/bits/siginfo.h             | 341 -------------------
 sysdeps/unix/sysv/linux/bits/sigset.h              | 124 -------
 sysdeps/unix/sysv/linux/bits/types/__sigset_t.h    |  10 +
 sysdeps/unix/sysv/linux/bits/types/sigevent_t.h    |  48 +++
 sysdeps/unix/sysv/linux/bits/types/siginfo_t.h     | 139 ++++++++
 sysdeps/unix/sysv/linux/hppa/sys/ucontext.h        |   1 +
 sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h   |  19 ++
 .../sysv/linux/ia64/bits/siginfo-consts-arch.h     |  45 +++
 sysdeps/unix/sysv/linux/ia64/bits/siginfo.h        | 360 ---------------------
 sysdeps/unix/sysv/linux/m68k/sys/ucontext.h        |   1 +
 sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h   |  15 +
 sysdeps/unix/sysv/linux/mips/bits/siginfo.h        | 344 --------------------
 sysdeps/unix/sysv/linux/mips/sys/ucontext.h        |   1 +
 sysdeps/unix/sysv/linux/nios2/sys/ucontext.h       |   1 +
 sysdeps/unix/sysv/linux/nptl-signals.h             |   1 +
 sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h     |   3 +-
 sysdeps/unix/sysv/linux/s390/bits/siginfo.h        | 341 -------------------
 sysdeps/unix/sysv/linux/s390/sys/ucontext.h        |   1 +
 sysdeps/unix/sysv/linux/sh/sys/ucontext.h          |   1 +
 sysdeps/unix/sysv/linux/sigsetops.h                | 108 +++++++
 sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h  |  14 +
 .../sysv/linux/sparc/bits/siginfo-consts-arch.h    |  12 +
 sysdeps/unix/sysv/linux/sparc/bits/siginfo.h       | 352 --------------------
 sysdeps/unix/sysv/linux/sparc/sys/ucontext.h       |   1 +
 sysdeps/unix/sysv/linux/sys/epoll.h                |   8 +-
 sysdeps/unix/sysv/linux/sys/signalfd.h             |   3 +-
 sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h   |  11 +
 .../sysv/linux/tile/bits/siginfo-consts-arch.h     |  14 +
 sysdeps/unix/sysv/linux/tile/bits/siginfo.h        | 347 --------------------
 sysdeps/unix/sysv/linux/tile/sys/ucontext.h        |   1 +
 sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h    |  19 ++
 sysdeps/unix/sysv/linux/x86/bits/siginfo.h         | 360 ---------------------
 sysdeps/unix/sysv/linux/x86/sys/ucontext.h         |   1 +
 94 files changed, 1068 insertions(+), 2914 deletions(-)
 rename signal/sigsetops.h => bits/sigevent-consts.h (55%)
 rename bits/{siginfo.h => siginfo-consts.h} (68%)
 delete mode 100644 bits/sigset.h
 create mode 100644 bits/types/__sigset_t.h
 create mode 100644 bits/types/sigevent_t.h
 create mode 100644 bits/types/siginfo_t.h
 create mode 100644 include/bits/types/sig_atomic_t.h
 create mode 100644 include/bits/types/sigset_t.h
 create mode 100644 include/bits/types/sigval_t.h
 create mode 100644 signal/bits/types/sig_atomic_t.h
 create mode 100644 signal/bits/types/sigset_t.h
 create mode 100644 signal/bits/types/sigval_t.h
 create mode 100644 sysdeps/generic/sigsetops.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/sigevent-consts.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/siginfo-arch.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/siginfo-consts-arch.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/siginfo-consts.h
 delete mode 100644 sysdeps/unix/sysv/linux/bits/siginfo.h
 delete mode 100644 sysdeps/unix/sysv/linux/bits/sigset.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/types/__sigset_t.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/types/sigevent_t.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/types/siginfo_t.h
 create mode 100644 sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h
 create mode 100644 sysdeps/unix/sysv/linux/ia64/bits/siginfo-consts-arch.h
 delete mode 100644 sysdeps/unix/sysv/linux/ia64/bits/siginfo.h
 create mode 100644 sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h
 delete mode 100644 sysdeps/unix/sysv/linux/mips/bits/siginfo.h
 delete mode 100644 sysdeps/unix/sysv/linux/s390/bits/siginfo.h
 create mode 100644 sysdeps/unix/sysv/linux/sigsetops.h
 create mode 100644 sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
 create mode 100644 sysdeps/unix/sysv/linux/sparc/bits/siginfo-consts-arch.h
 delete mode 100644 sysdeps/unix/sysv/linux/sparc/bits/siginfo.h
 create mode 100644 sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h
 create mode 100644 sysdeps/unix/sysv/linux/tile/bits/siginfo-consts-arch.h
 delete mode 100644 sysdeps/unix/sysv/linux/tile/bits/siginfo.h
 create mode 100644 sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h
 delete mode 100644 sysdeps/unix/sysv/linux/x86/bits/siginfo.h

diff --git a/signal/sigsetops.h b/bits/sigevent-consts.h
similarity index 55%
rename from signal/sigsetops.h
rename to bits/sigevent-consts.h
index cd1282000e..f5940e00ea 100644
--- a/signal/sigsetops.h
+++ b/bits/sigevent-consts.h
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
+/* sigevent constants.  Stub version.
+   Copyright (C) 1997-2017 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -15,18 +16,22 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-/* Definitions relevant to functions that operate on `sigset_t's.  */
+#ifndef _BITS_SIGEVENT_CONSTS_H
+#define _BITS_SIGEVENT_CONSTS_H 1
 
-#include <errno.h>
-#include <signal.h>
-#include <string.h>
+#if !defined _SIGNAL_H && !defined _AIO_H
+#error "Don't include <bits/sigevent-consts.h> directly; use <signal.h> instead."
+#endif
 
-#define	BITS		(_NSIG - 1)
-#define	ELT(signo)	(((signo) - 1) / BITS)
-#define	MASK(signo)	(1 << (((signo) - 1) % BITS))
+/* `sigev_notify' values.  */
+enum
+{
+  SIGEV_SIGNAL = 0,		/* Notify via signal.  */
+# define SIGEV_SIGNAL	SIGEV_SIGNAL
+  SIGEV_NONE,			/* Other notification: meaningless.  */
+# define SIGEV_NONE	SIGEV_NONE
+  SIGEV_THREAD			/* Deliver via thread creation.  */
+# define SIGEV_THREAD	SIGEV_THREAD
+};
 
-#undef	sigemptyset
-#undef	sigfillset
-#undef	sigaddset
-#undef	sigdelset
-#undef	sigismember
+#endif
diff --git a/bits/siginfo.h b/bits/siginfo-consts.h
similarity index 68%
rename from bits/siginfo.h
rename to bits/siginfo-consts.h
index 4919df5436..a58ac4bdb7 100644
--- a/bits/siginfo.h
+++ b/bits/siginfo-consts.h
@@ -1,4 +1,4 @@
-/* siginfo_t, sigevent and constants.  Stub version.
+/* siginfo_t constants.  Stub version.
    Copyright (C) 1997-2017 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -16,42 +16,8 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#if !defined _SIGNAL_H && !defined __need_siginfo_t \
-    && !defined __need_sigevent_t
-# error "Never include this file directly.  Use <signal.h> instead"
-#endif
-
-#if (!defined __have_sigval_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t \
-	 || defined __need_sigevent_t))
-# define __have_sigval_t 1
-
-/* Type for data associated with a signal.  */
-typedef union sigval
-  {
-    int sival_int;
-    void *sival_ptr;
-  } sigval_t;
-#endif
-
-#if (!defined __have_siginfo_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t))
-# define __have_siginfo_t	1
-
-typedef struct siginfo
-  {
-    int si_signo;		/* Signal number.  */
-    int si_errno;		/* If non-zero, an errno value associated with
-				   this signal, as defined in <errno.h>.  */
-    int si_code;		/* Signal code.  */
-    __pid_t si_pid;		/* Sending process ID.  */
-    __uid_t si_uid;		/* Real user ID of sending process.  */
-    void *si_addr;		/* Address of faulting instruction.  */
-    int si_status;		/* Exit value or signal.  */
-    long int si_band;		/* Band event for SIGPOLL.  */
-    union sigval si_value;	/* Signal value.  */
-  } siginfo_t;
-
+#ifndef _BITS_SIGINFO_CONSTS_H
+#define _BITS_SIGINFO_CONSTS_H 1
 
 /* Values for `si_code'.  Positive values are reserved for kernel-generated
    signals.  */
@@ -181,36 +147,4 @@ enum
 };
 # endif
 
-# undef __need_siginfo_t
-#endif	/* !have siginfo_t && (have _SIGNAL_H || need siginfo_t).  */
-
-
-#if (defined _SIGNAL_H || defined __need_sigevent_t) \
-    && !defined __have_sigevent_t
-# define __have_sigevent_t	1
-
-/* Structure to transport application-defined values with signals.  */
-# define SIGEV_MAX_SIZE	64
-# define SIGEV_PAD_SIZE	((SIGEV_MAX_SIZE / sizeof (int)) - 3)
-
-typedef struct sigevent
-  {
-    sigval_t sigev_value;
-    int sigev_signo;
-    int sigev_notify;
-    void (*sigev_notify_function) (sigval_t);	    /* Function to start.  */
-    void *sigev_notify_attributes;		    /* Really pthread_attr_t.*/
-  } sigevent_t;
-
-/* `sigev_notify' values.  */
-enum
-{
-  SIGEV_SIGNAL = 0,		/* Notify via signal.  */
-# define SIGEV_SIGNAL	SIGEV_SIGNAL
-  SIGEV_NONE,			/* Other notification: meaningless.  */
-# define SIGEV_NONE	SIGEV_NONE
-  SIGEV_THREAD			/* Deliver via thread creation.  */
-# define SIGEV_THREAD	SIGEV_THREAD
-};
-
-#endif	/* have _SIGNAL_H.  */
+#endif
diff --git a/bits/sigset.h b/bits/sigset.h
deleted file mode 100644
index 4099cc703f..0000000000
--- a/bits/sigset.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* __sig_atomic_t, __sigset_t, and related definitions.  Generic/BSD version.
-   Copyright (C) 1991-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef	_SIGSET_H_types
-#define	_SIGSET_H_types	1
-
-typedef int __sig_atomic_t;
-
-/* A `sigset_t' has a bit for each signal.  */
-typedef unsigned long int __sigset_t;
-
-#endif
-
-
-/* We only want to define these functions if <signal.h> was actually
-   included; otherwise we were included just to define the types.  Since we
-   are namespace-clean, it wouldn't hurt to define extra macros.  But
-   trouble can be caused by functions being defined (e.g., any global
-   register vars declared later will cause compilation errors).  */
-
-#if !defined _SIGSET_H_fns && defined _SIGNAL_H
-#define _SIGSET_H_fns 1
-
-#ifndef _EXTERN_INLINE
-# define _EXTERN_INLINE __extern_inline
-#endif
-
-/* Return a mask that includes SIG only.  The cast to `sigset_t' avoids
-   overflow if `sigset_t' is wider than `int'.  */
-#define	__sigmask(sig)	(((__sigset_t) 1) << ((sig) - 1))
-
-#define	__sigemptyset(set)	\
-  (__extension__ ({ *(set) = (__sigset_t) 0; 0; })
-#define	__sigfillset(set)	\
-  (__extension__ ({ *(set) = ~(__sigset_t) 0; 0; }))
-
-#ifdef _GNU_SOURCE
-# define __sigisemptyset(set)	(*(set) == (__sigset_t) 0)
-# define __sigandset(dest, left, right) \
-  (__extension__ ({ *(dest) = *(left) & *(right); 0; }))
-# define __sigorset(dest, left, right) \
-  (__extension__ ({ *(dest) = *(left) | *(right); 0; }))
-#endif
-
-/* These functions needn't check for a bogus signal number -- error
-   checking is done in the non __ versions.  */
-
-extern int __sigismember (const __sigset_t *, int);
-extern int __sigaddset (__sigset_t *, int);
-extern int __sigdelset (__sigset_t *, int);
-
-#ifdef __USE_EXTERN_INLINES
-# define __SIGSETFN(NAME, BODY, CONST)					      \
-  _EXTERN_INLINE int							      \
-  NAME (CONST __sigset_t *__set, int __sig)				      \
-  {									      \
-    __sigset_t __mask = __sigmask (__sig);				      \
-    return BODY;							      \
-  }
-
-__SIGSETFN (__sigismember, (*__set & __mask) ? 1 : 0, const)
-__SIGSETFN (__sigaddset, ((*__set |= __mask), 0), )
-__SIGSETFN (__sigdelset, ((*__set &= ~__mask), 0), )
-
-# undef __SIGSETFN
-#endif
-
-
-#endif /* ! _SIGSET_H_fns.  */
diff --git a/bits/types/__sigset_t.h b/bits/types/__sigset_t.h
new file mode 100644
index 0000000000..c90d760a6e
--- /dev/null
+++ b/bits/types/__sigset_t.h
@@ -0,0 +1,7 @@
+#ifndef ____sigset_t_defined
+#define ____sigset_t_defined 1
+
+/* A `sigset_t' has a bit for each signal.  */
+typedef unsigned long int __sigset_t;
+
+#endif
diff --git a/bits/types/sigevent_t.h b/bits/types/sigevent_t.h
new file mode 100644
index 0000000000..7b8cb054d7
--- /dev/null
+++ b/bits/types/sigevent_t.h
@@ -0,0 +1,17 @@
+#ifndef __sigevent_t_defined
+#define __sigevent_t_defined 1
+
+#include <bits/types.h>
+#include <bits/types/sigval_t.h>
+
+/* Structure to transport application-defined values with signals.  */
+typedef struct sigevent
+  {
+    sigval_t sigev_value;
+    int sigev_signo;
+    int sigev_notify;
+    void (*sigev_notify_function) (sigval_t);	    /* Function to start.  */
+    void *sigev_notify_attributes;		    /* Really pthread_attr_t.*/
+  } sigevent_t;
+
+#endif
diff --git a/bits/types/siginfo_t.h b/bits/types/siginfo_t.h
new file mode 100644
index 0000000000..ab6bf18bec
--- /dev/null
+++ b/bits/types/siginfo_t.h
@@ -0,0 +1,21 @@
+#ifndef __siginfo_t_defined
+#define __siginfo_t_defined 1
+
+#include <bits/types.h>
+#include <bits/types/sigval_t.h>
+
+typedef struct siginfo
+  {
+    int si_signo;		/* Signal number.  */
+    int si_errno;		/* If non-zero, an errno value associated with
+				   this signal, as defined in <errno.h>.  */
+    int si_code;		/* Signal code.  */
+    __pid_t si_pid;		/* Sending process ID.  */
+    __uid_t si_uid;		/* Real user ID of sending process.  */
+    void *si_addr;		/* Address of faulting instruction.  */
+    int si_status;		/* Exit value or signal.  */
+    long int si_band;		/* Band event for SIGPOLL.  */
+    sigval_t si_value;		/* Signal value.  */
+  } siginfo_t;
+
+#endif
diff --git a/include/bits/types/sig_atomic_t.h b/include/bits/types/sig_atomic_t.h
new file mode 100644
index 0000000000..783693f71c
--- /dev/null
+++ b/include/bits/types/sig_atomic_t.h
@@ -0,0 +1 @@
+#include <signal/bits/types/sig_atomic_t.h>
diff --git a/include/bits/types/sigset_t.h b/include/bits/types/sigset_t.h
new file mode 100644
index 0000000000..20c3dc2095
--- /dev/null
+++ b/include/bits/types/sigset_t.h
@@ -0,0 +1 @@
+#include <signal/bits/types/sigset_t.h>
diff --git a/include/bits/types/sigval_t.h b/include/bits/types/sigval_t.h
new file mode 100644
index 0000000000..296734e827
--- /dev/null
+++ b/include/bits/types/sigval_t.h
@@ -0,0 +1 @@
+#include <signal/bits/types/sigval_t.h>
diff --git a/include/signal.h b/include/signal.h
index 276a99d80a..e39ddc60b9 100644
--- a/include/signal.h
+++ b/include/signal.h
@@ -1,7 +1,4 @@
 #ifndef _SIGNAL_H
-#if defined __need_sig_atomic_t || defined __need_sigset_t
-# include <signal/signal.h>
-#else
 # include <signal/signal.h>
 
 # ifndef _ISOMAC
@@ -53,12 +50,6 @@ libc_hidden_proto (__libc_sigaction)
 extern int __default_sigpause (int mask);
 extern int __xpg_sigpause (int sig);
 
-/* Simplified sigemptyset() implementation without the parameter checking.  */
-#undef __sigemptyset
-#define __sigemptyset(ss) \
-  ({ __builtin_memset (ss, '\0', sizeof (sigset_t)); 0; })
-
-
 /* Allocate real-time signal with highest/lowest available priority.  */
 extern int __libc_allocate_rtsig (int __high);
 
@@ -66,6 +57,6 @@ extern int __libc_allocate_rtsig (int __high);
 extern __typeof (__sigaction) __sigaction attribute_hidden;
 extern __typeof (__libc_sigaction) __libc_sigaction attribute_hidden;
 #  endif
-# endif
-#endif
-#endif
+
+# endif /* _ISOMAC */
+#endif /* signal.h */
diff --git a/inet/rcmd.c b/inet/rcmd.c
index c285b9ecd6..e970123a9a 100644
--- a/inet/rcmd.c
+++ b/inet/rcmd.c
@@ -78,6 +78,7 @@
 #include <stdlib.h>
 #include <wchar.h>
 #include <sys/uio.h>
+#include <sigsetops.h>
 
 
 int __ivaliduser (FILE *, u_int32_t, const char *, const char *);
@@ -112,7 +113,8 @@ rcmd_af (char **ahost, u_short rport, const char *locuser, const char *remuser,
 		struct sockaddr_in6 sin6;
 	} from;
 	struct pollfd pfd[2];
-	int32_t oldmask;
+	sigset_t mask, omask;
+
 	pid_t pid;
 	int s, lport, timo, error;
 	char c;
@@ -160,7 +162,9 @@ rcmd_af (char **ahost, u_short rport, const char *locuser, const char *remuser,
 		*ahost = NULL;
 	ai = res;
 	refused = 0;
-	oldmask = __sigblock(sigmask(SIGURG));
+	__sigemptyset(&mask);
+	__sigaddset(&mask, SIGURG);
+	__sigprocmask (SIG_BLOCK, &mask, &omask);
 	for (timo = 1, lport = IPPORT_RESERVED - 1;;) {
 		char errbuf[200];
 
@@ -172,7 +176,7 @@ rcmd: socket: All ports in use\n"));
 			else
 				__fxprintf(NULL, "rcmd: socket: %m\n");
 
-			__sigsetmask(oldmask);
+			__sigprocmask (SIG_SETMASK, &omask, 0);
 			freeaddrinfo(res);
 			return -1;
 		}
@@ -225,7 +229,7 @@ rcmd: socket: All ports in use\n"));
 		freeaddrinfo(res);
 		(void)__fxprintf(NULL, "%s: %s\n", *ahost,
 				 __strerror_r(errno, errbuf, sizeof (errbuf)));
-		__sigsetmask(oldmask);
+		__sigprocmask (SIG_SETMASK, &omask, 0);
 		return -1;
 	}
 	lport--;
@@ -337,7 +341,7 @@ socket: protocol failure in circuit setup\n")) >= 0)
 		}
 		goto bad2;
 	}
-	__sigsetmask(oldmask);
+	__sigprocmask (SIG_SETMASK, &omask, 0);
 	freeaddrinfo(res);
 	return s;
 bad2:
@@ -345,7 +349,7 @@ bad2:
 		(void)__close(*fd2p);
 bad:
 	(void)__close(s);
-	__sigsetmask(oldmask);
+	__sigprocmask (SIG_SETMASK, &omask, 0);
 	freeaddrinfo(res);
 	return -1;
 }
diff --git a/io/sys/poll.h b/io/sys/poll.h
index 7356fb9ea5..e34c2db5a9 100644
--- a/io/sys/poll.h
+++ b/io/sys/poll.h
@@ -24,10 +24,8 @@
 /* Get the platform dependent bits of `poll'.  */
 #include <bits/poll.h>
 #ifdef __USE_GNU
-/* Get the __sigset_t definition.  */
-# include <bits/sigset.h>
-/* Get the timespec definition.  */
-#include <bits/types/struct_timespec.h>
+# include <bits/types/__sigset_t.h>
+# include <bits/types/struct_timespec.h>
 #endif
 
 
diff --git a/login/utmp_file.c b/login/utmp_file.c
index 6ebe1ef123..240e0e3c10 100644
--- a/login/utmp_file.c
+++ b/login/utmp_file.c
@@ -28,6 +28,7 @@
 #include <utmp.h>
 #include <not-cancel.h>
 #include <kernel-features.h>
+#include <sigsetops.h>
 
 #include "utmp-private.h"
 #include "utmp-equal.h"
diff --git a/misc/sys/select.h b/misc/sys/select.h
index e27fb44af8..06dd31b476 100644
--- a/misc/sys/select.h
+++ b/misc/sys/select.h
@@ -29,13 +29,8 @@
 /* Get __FD_* definitions.  */
 #include <bits/select.h>
 
-/* Get __sigset_t.  */
-#include <bits/sigset.h>
-
-#ifndef __sigset_t_defined
-# define __sigset_t_defined
-typedef __sigset_t sigset_t;
-#endif
+/* Get sigset_t.  */
+#include <bits/types/sigset_t.h>
 
 /* Get definition of timer specification structures.  */
 #include <bits/types/time_t.h>
diff --git a/posix/bits/types.h b/posix/bits/types.h
index 7638bd044d..e2f73a89e4 100644
--- a/posix/bits/types.h
+++ b/posix/bits/types.h
@@ -197,6 +197,10 @@ __STD_TYPE __SWORD_TYPE __intptr_t;
 /* Duplicate info from sys/socket.h.  */
 __STD_TYPE __U32_TYPE __socklen_t;
 
+/* 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;
 
 #undef __STD_TYPE
 
diff --git a/posix/spawn.h b/posix/spawn.h
index a1154a3cdf..2fa5f547c7 100644
--- a/posix/spawn.h
+++ b/posix/spawn.h
@@ -21,9 +21,8 @@
 
 #include <features.h>
 #include <sched.h>
-#define __need_sigset_t
-#include <signal.h>
 #include <sys/types.h>
+#include <bits/types/sigset_t.h>
 
 
 /* Data structure to contain attributes for thread creation.  */
diff --git a/posix/sys/wait.h b/posix/sys/wait.h
index 897bfaed6f..d5b7e4d8d4 100644
--- a/posix/sys/wait.h
+++ b/posix/sys/wait.h
@@ -103,8 +103,7 @@ typedef __id_t id_t;
 #  define __id_t_defined
 # endif
 
-# define __need_siginfo_t
-# include <bits/siginfo.h>
+# include <bits/types/siginfo_t.h>
 
 /* Wait for a childing matching IDTYPE and ID to change the status and
    place appropriate information in *INFOP.
diff --git a/resolv/netdb.h b/resolv/netdb.h
index 936fab95ed..f76ccf123e 100644
--- a/resolv/netdb.h
+++ b/resolv/netdb.h
@@ -33,8 +33,7 @@
 #endif
 
 #ifdef __USE_GNU
-# define __need_sigevent_t
-# include <bits/siginfo.h>
+# include <bits/types/sigevent_t.h>
 # include <bits/types/struct_timespec.h>
 #endif
 
diff --git a/rt/aio.h b/rt/aio.h
index 5647e521f5..d72ad5d97d 100644
--- a/rt/aio.h
+++ b/rt/aio.h
@@ -24,8 +24,8 @@
 
 #include <features.h>
 #include <sys/types.h>
-#define __need_sigevent_t
-#include <bits/siginfo.h>
+#include <bits/types/sigevent_t.h>
+#include <bits/sigevent-consts.h>
 #include <bits/types/struct_timespec.h>
 
 __BEGIN_DECLS
diff --git a/rt/mqueue.h b/rt/mqueue.h
index d65871e3c2..c79aa53b94 100644
--- a/rt/mqueue.h
+++ b/rt/mqueue.h
@@ -21,8 +21,7 @@
 #include <features.h>
 #include <sys/types.h>
 #include <fcntl.h>
-#define __need_sigevent_t
-#include <bits/siginfo.h>
+#include <bits/types/sigevent_t.h>
 #include <bits/types/struct_timespec.h>
 /* Get the definition of mqd_t and struct mq_attr.  */
 #include <bits/mqueue.h>
diff --git a/setjmp/setjmp.h b/setjmp/setjmp.h
index e10adaf1fc..86fb2edf6c 100644
--- a/setjmp/setjmp.h
+++ b/setjmp/setjmp.h
@@ -27,8 +27,7 @@
 __BEGIN_DECLS
 
 #include <bits/setjmp.h>		/* Get `__jmp_buf'.  */
-#include <bits/sigset.h>		/* Get `__sigset_t'.  */
-
+#include <bits/types/__sigset_t.h>
 
 /* Calling environment, plus possibly a saved signal mask.  */
 struct __jmp_buf_tag
diff --git a/shadow/lckpwdf.c b/shadow/lckpwdf.c
index 09427eb233..15602efb68 100644
--- a/shadow/lckpwdf.c
+++ b/shadow/lckpwdf.c
@@ -24,6 +24,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <sys/file.h>
+#include <sigsetops.h>
 
 #include <kernel-features.h>
 
diff --git a/signal/Makefile b/signal/Makefile
index 077aaea6ad..de92558f2c 100644
--- a/signal/Makefile
+++ b/signal/Makefile
@@ -22,10 +22,14 @@ subdir	:= signal
 
 include ../Makeconfig
 
-headers	:= signal.h sys/signal.h bits/signum.h bits/sigcontext.h \
-	   bits/sigaction.h bits/sigset.h bits/siginfo.h bits/sigstack.h \
-	   bits/sigthread.h bits/types/struct_sigstack.h bits/types/stack_t.h \
-	   bits/ss_flags.h
+headers := signal.h sys/signal.h \
+	   bits/signum.h bits/sigcontext.h bits/sigaction.h \
+	   bits/sigevent-consts.h bits/siginfo-consts.h \
+	   bits/sigstack.h bits/sigthread.h bits/ss_flags.h \
+	   bits/types/__sigset_t.h bits/types/sig_atomic_t.h \
+	   bits/types/sigevent_t.h bits/types/siginfo_t.h \
+	   bits/types/sigset_t.h bits/types/stack_t.h \
+	   bits/types/struct_sigstack.h
 
 routines	:= signal raise killpg \
 		   sigaction sigprocmask kill \
diff --git a/signal/Versions b/signal/Versions
index 4d86930ec6..a915ef400f 100644
--- a/signal/Versions
+++ b/signal/Versions
@@ -1,13 +1,13 @@
 libc {
   GLIBC_2.0 {
     # functions with special/multiple interfaces
-    __sigaddset; __sigdelset; __sigismember; __sysv_signal;
+    __sigpause;  __sysv_signal;
 
-    # functions used in inline functions or macros
-    __sigpause;
+    # functions formerly used in inline functions or macros
+    __sigaddset; __sigdelset; __sigismember;
 
     # functions used in other libraries
-     __sigaction;
+    __sigaction;
 
     # b*
     bsd_signal;
diff --git a/signal/bits/types/sig_atomic_t.h b/signal/bits/types/sig_atomic_t.h
new file mode 100644
index 0000000000..47eaa28311
--- /dev/null
+++ b/signal/bits/types/sig_atomic_t.h
@@ -0,0 +1,10 @@
+#ifndef __sig_atomic_t_defined
+#define __sig_atomic_t_defined 1
+
+#include <bits/types.h>
+
+/* An integral type that can be modified atomically, without the
+   possibility of a signal arriving in the middle of the operation.  */
+typedef __sig_atomic_t sig_atomic_t;
+
+#endif
diff --git a/signal/bits/types/sigset_t.h b/signal/bits/types/sigset_t.h
new file mode 100644
index 0000000000..8b27e9112d
--- /dev/null
+++ b/signal/bits/types/sigset_t.h
@@ -0,0 +1,9 @@
+#ifndef __sigset_t_defined
+#define __sigset_t_defined 1
+
+#include <bits/types/__sigset_t.h>
+
+/* A set of signals to be blocked, unblocked, or waited for.  */
+typedef __sigset_t sigset_t;
+
+#endif
diff --git a/signal/bits/types/sigval_t.h b/signal/bits/types/sigval_t.h
new file mode 100644
index 0000000000..666598f0ca
--- /dev/null
+++ b/signal/bits/types/sigval_t.h
@@ -0,0 +1,13 @@
+#ifndef __sigval_t_defined
+#define __sigval_t_defined
+
+/* Type for data associated with a signal.  */
+union sigval
+{
+  int sival_int;
+  void *sival_ptr;
+};
+
+typedef union sigval sigval_t;
+
+#endif
diff --git a/signal/sigaddset.c b/signal/sigaddset.c
index ca280d8e76..161be7b352 100644
--- a/signal/sigaddset.c
+++ b/signal/sigaddset.c
@@ -15,7 +15,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include "sigsetops.h"
+#include <errno.h>
+#include <signal.h>
+#include <sigsetops.h>
 
 /* Add SIGNO to SET.  */
 int
@@ -27,6 +29,7 @@ sigaddset (sigset_t *set, int signo)
       return -1;
     }
 
-  return __sigaddset (set, signo);
+  __sigaddset (set, signo);
+  return 0;
 }
 libc_hidden_def (sigaddset)
diff --git a/signal/sigandset.c b/signal/sigandset.c
index f81a5939ee..ffea141c63 100644
--- a/signal/sigandset.c
+++ b/signal/sigandset.c
@@ -17,18 +17,18 @@
 
 #include <errno.h>
 #include <signal.h>
-#define __need_NULL
-#include <stddef.h>
+#include <sigsetops.h>
 
 /* Combine sets LEFT and RIGHT by logical AND and place result in DEST.  */
 int
 sigandset (sigset_t *dest, const sigset_t *left, const sigset_t *right)
 {
-  if (dest == NULL || left == NULL || right == NULL)
+  if (!dest || !left || !right)
     {
       __set_errno (EINVAL);
       return -1;
     }
 
-  return __sigandset (dest, left, right);
+  __sigandset (dest, left, right);
+  return 0;
 }
diff --git a/signal/sigdelset.c b/signal/sigdelset.c
index 4632103b22..2aaa536937 100644
--- a/signal/sigdelset.c
+++ b/signal/sigdelset.c
@@ -15,7 +15,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include "sigsetops.h"
+#include <errno.h>
+#include <signal.h>
+#include <sigsetops.h>
 
 /* Add SIGNO to SET.  */
 int
@@ -27,6 +29,7 @@ sigdelset (sigset_t *set, int signo)
       return -1;
     }
 
-  return __sigdelset (set, signo);
+  __sigdelset (set, signo);
+  return 0;
 }
 libc_hidden_def (sigdelset)
diff --git a/signal/sigisempty.c b/signal/sigisempty.c
index eabe71ce6b..bea03f1216 100644
--- a/signal/sigisempty.c
+++ b/signal/sigisempty.c
@@ -17,18 +17,17 @@
 
 #include <errno.h>
 #include <signal.h>
-#define __need_NULL
-#include <stddef.h>
+#include <sigsetops.h>
 
 /* Test whether SET is empty.  */
 int
 sigisemptyset (const sigset_t *set)
 {
-  if (set == NULL)
+  if (!set)
     {
       __set_errno (EINVAL);
       return -1;
     }
 
-    return __sigisemptyset (set);
+  return __sigisemptyset (set);
 }
diff --git a/signal/sigismem.c b/signal/sigismem.c
index 8da14ac26d..6ef4a4d19d 100644
--- a/signal/sigismem.c
+++ b/signal/sigismem.c
@@ -15,7 +15,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include "sigsetops.h"
+#include <errno.h>
+#include <signal.h>
+#include <sigsetops.h>
 
 /* Return 1 if SIGNO is in SET, 0 if not.  */
 int
diff --git a/signal/signal.h b/signal/signal.h
index d01df3290a..a51e912d08 100644
--- a/signal/signal.h
+++ b/signal/signal.h
@@ -20,40 +20,21 @@
  */
 
 #ifndef	_SIGNAL_H
-
-#if !defined __need_sig_atomic_t && !defined __need_sigset_t
-# define _SIGNAL_H
-#endif
+#define _SIGNAL_H
 
 #include <features.h>
 
 __BEGIN_DECLS
 
-#include <bits/sigset.h>		/* __sigset_t, __sig_atomic_t.  */
-
-/* An integral type that can be modified atomically, without the
-   possibility of a signal arriving in the middle of the operation.  */
-#if defined __need_sig_atomic_t || defined _SIGNAL_H
-# ifndef __sig_atomic_t_defined
-#  define __sig_atomic_t_defined
-typedef __sig_atomic_t sig_atomic_t;
-# endif
-# undef __need_sig_atomic_t
-#endif
-
-#if defined __need_sigset_t || (defined _SIGNAL_H && defined __USE_POSIX)
-# ifndef __sigset_t_defined
-#  define __sigset_t_defined
-typedef __sigset_t sigset_t;
-# endif
-# undef __need_sigset_t
-#endif
-
-#ifdef _SIGNAL_H
-
 #include <bits/types.h>
 #include <bits/signum.h>
 
+#include <bits/types/sig_atomic_t.h>
+
+#if defined __USE_POSIX
+#include <bits/types/sigset_t.h>
+#endif
+
 #if defined __USE_XOPEN || defined __USE_XOPEN2K
 # ifndef __pid_t_defined
 typedef __pid_t pid_t;
@@ -73,8 +54,10 @@ typedef __uid_t uid_t;
 #endif
 
 #if defined __USE_POSIX199309 || defined __USE_XOPEN_EXTENDED
-/* Get the `siginfo_t' type plus the needed symbols.  */
-# include <bits/siginfo.h>
+# include <bits/types/siginfo_t.h>
+# include <bits/types/sigevent_t.h>
+# include <bits/siginfo-consts.h>
+# include <bits/sigevent-consts.h>
 #endif
 
 
@@ -174,7 +157,7 @@ extern int __sigpause (int __sig_or_mask, int __is_sig);
    simply do not work in many situations.  Use `sigprocmask' instead.  */
 
 /* Compute mask for signal SIG.  */
-# define sigmask(sig)	__sigmask(sig)
+# define sigmask(sig) ((int)(1u << ((sig) - 1)))
 
 /* Block signals in MASK, returning the old mask.  */
 extern int sigblock (int __mask) __THROW __attribute_deprecated__;
@@ -366,8 +349,6 @@ extern int __libc_current_sigrtmin (void) __THROW;
 /* Return number of available real-time signal with lowest priority.  */
 extern int __libc_current_sigrtmax (void) __THROW;
 
-#endif /* signal.h  */
-
 __END_DECLS
 
 #endif /* not signal.h */
diff --git a/signal/sigorset.c b/signal/sigorset.c
index 9ea867d79d..8a586db6b5 100644
--- a/signal/sigorset.c
+++ b/signal/sigorset.c
@@ -17,18 +17,18 @@
 
 #include <errno.h>
 #include <signal.h>
-#define __need_NULL
-#include <stddef.h>
+#include <sigsetops.h>
 
 /* Combine sets LEFT and RIGHT by logical OR and place result in DEST.  */
 int
 sigorset (sigset_t *dest, const sigset_t *left, const sigset_t *right)
 {
-  if (dest == NULL || left == NULL || right == NULL)
+  if (!dest || !left || !right)
     {
       __set_errno (EINVAL);
       return -1;
     }
 
-  return __sigorset (dest, left, right);
+  __sigorset (dest, left, right);
+  return 0;
 }
diff --git a/signal/sigsetops.c b/signal/sigsetops.c
index 0317662a14..d56412f94b 100644
--- a/signal/sigsetops.c
+++ b/signal/sigsetops.c
@@ -1,11 +1,53 @@
-/* Define the real-function versions of all inline functions
-   defined in signal.h (or bits/sigset.h).  */
+/* Compatibility symbols for old versions of signal.h.
+   Copyright (C) 2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-#include <features.h>
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <signal.h>
+#include <sigsetops.h>
+#include <shlib-compat.h>
+
+/* These were formerly defined by <signal.h> as inline functions,
+   so they require out-of-line compatibility definitions.  */
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_26)
+
+int
+attribute_compat_text_section
+(__sigismember) (const __sigset_t *set, int sig)
+{
+  return __sigismember (set, sig);
+}
+compat_symbol (libc, __sigismember, __sigismember, GLIBC_2_0);
+
+int
+attribute_compat_text_section
+(__sigaddset) (__sigset_t *set, int sig)
+{
+  __sigaddset (set, sig);
+  return 0;
+}
+compat_symbol (libc, __sigaddset, __sigaddset, GLIBC_2_0);
+
+int
+attribute_compat_text_section
+(__sigdelset) (__sigset_t *set, int sig)
+{
+  __sigdelset (set, sig);
+  return 0;
+}
+compat_symbol (libc, __sigdelset, __sigdelset, GLIBC_2_0);
 
-#define _EXTERN_INLINE
-#ifndef __USE_EXTERN_INLINES
-# define __USE_EXTERN_INLINES	1
 #endif
-
-#include "signal.h"
diff --git a/socket/sys/socket.h b/socket/sys/socket.h
index 7af41097bb..bbfde8f602 100644
--- a/socket/sys/socket.h
+++ b/socket/sys/socket.h
@@ -26,11 +26,6 @@ __BEGIN_DECLS
 #include <bits/types/struct_iovec.h>
 #define	__need_size_t
 #include <stddef.h>
-#ifdef __USE_GNU
-/* Get the __sigset_t definition.  */
-# include <bits/sigset.h>
-#endif
-
 
 /* This operating system-specific header file defines the SOCK_*, PF_*,
    AF_*, MSG_*, SOL_*, and SO_* constants, and the `struct sockaddr',
diff --git a/stdlib/abort.c b/stdlib/abort.c
index d30de0b02c..19882f3e3d 100644
--- a/stdlib/abort.c
+++ b/stdlib/abort.c
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <sigsetops.h>
 
 /* Try to get a machine dependent instruction which will make the
    program crash.  This is used in case everything else fails.  */
@@ -57,13 +58,13 @@ abort (void)
 
   /* Now it's for sure we are alone.  But recursive calls are possible.  */
 
-  /* Unlock SIGABRT.  */
+  /* Unblock SIGABRT.  */
   if (stage == 0)
     {
       ++stage;
-      if (__sigemptyset (&sigs) == 0 &&
-	  __sigaddset (&sigs, SIGABRT) == 0)
-	__sigprocmask (SIG_UNBLOCK, &sigs, (sigset_t *) NULL);
+      __sigemptyset (&sigs);
+      __sigaddset (&sigs, SIGABRT);
+      __sigprocmask (SIG_UNBLOCK, &sigs, 0);
     }
 
   /* Flush all streams.  We cannot close them now because the user
diff --git a/sysdeps/arm/sys/ucontext.h b/sysdeps/arm/sys/ucontext.h
index 49d60395dd..bbfeb20bb5 100644
--- a/sysdeps/arm/sys/ucontext.h
+++ b/sysdeps/arm/sys/ucontext.h
@@ -25,6 +25,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/generic/sigsetops.h b/sysdeps/generic/sigsetops.h
new file mode 100644
index 0000000000..e8e5553981
--- /dev/null
+++ b/sysdeps/generic/sigsetops.h
@@ -0,0 +1,77 @@
+/* __sigset_t manipulators.  Generic/BSD version.
+   Copyright (C) 1991-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SIGSETOPS_H
+#define _SIGSETOPS_H 1
+
+#include <signal.h>
+
+/* Return a mask that includes SIG only.  The cast to `sigset_t' avoids
+   overflow if `sigset_t' is wider than `int'.  */
+# define __sigmask(sig) (((__sigset_t) 1) << ((sig) - 1))
+
+#define __sigemptyset(set)			\
+  (__extension__ ({				\
+    *(set) = (__sigset_t) 0;			\
+    (void)0;					\
+  }))
+#define __sigfillset(set)			\
+  (__extension__ ({				\
+    *(set) = ~(__sigset_t) 0;			\
+    (void)0;					\
+  }))
+
+# define __sigisemptyset(set)			\
+  (*(set) == (__sigset_t) 0)
+
+# define __sigandset(dest, left, right)		\
+  (__extension__ ({				\
+    *(dest) = *(left) & *(right);		\
+    (void)0;					\
+  }))
+
+# define __sigorset(dest, left, right)		\
+  (__extension__ ({				\
+    *(dest) = *(left) | *(right);		\
+    (void)0;					\
+  }))
+#endif
+
+/* These macros needn't check for a bogus signal number;
+   checking is done in the non-__ versions.  */
+# define __sigismember(set, sig)		\
+  (__extension__ ({				\
+    __sigset_t __mask = __sigmask (sig);	\
+    (set) & __mask ? 1 : 0;			\
+  }))
+
+# define __sigaddset(set, sig)			\
+  (__extension__ ({				\
+    __sigset_t __mask = __sigmask (sig);	\
+    (set) |= __mask;				\
+    (void)0;					\
+  }))
+
+# define __sigdelset(set, sig)			\
+  (__extension__ ({				\
+    __sigset_t __mask = __sigmask (sig);	\
+    (set) &= ~__mask;				\
+    (void)0;					\
+  }))
+
+#endif
diff --git a/sysdeps/generic/sys/ucontext.h b/sysdeps/generic/sys/ucontext.h
index 052c5401cb..a0602a7ad3 100644
--- a/sysdeps/generic/sys/ucontext.h
+++ b/sysdeps/generic/sys/ucontext.h
@@ -27,6 +27,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/i386/sys/ucontext.h b/sysdeps/i386/sys/ucontext.h
index 241f270a99..92deea92ea 100644
--- a/sysdeps/i386/sys/ucontext.h
+++ b/sysdeps/i386/sys/ucontext.h
@@ -25,6 +25,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/m68k/sys/ucontext.h b/sysdeps/m68k/sys/ucontext.h
index 4e5ec3b090..4f185ce63f 100644
--- a/sysdeps/m68k/sys/ucontext.h
+++ b/sysdeps/m68k/sys/ucontext.h
@@ -25,6 +25,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/mach/hurd/i386/bits/sigcontext.h b/sysdeps/mach/hurd/i386/bits/sigcontext.h
index 286b80efbd..3d5a6736aa 100644
--- a/sysdeps/mach/hurd/i386/bits/sigcontext.h
+++ b/sysdeps/mach/hurd/i386/bits/sigcontext.h
@@ -26,6 +26,7 @@
 /* Signal handlers are actually called:
    void handler (int sig, int code, struct sigcontext *scp);  */
 
+#include <bits/types/__sigset_t.h>
 #include <mach/machine/fp_reg.h>
 
 /* State of this thread when the signal was taken.  */
diff --git a/sysdeps/mips/sys/ucontext.h b/sysdeps/mips/sys/ucontext.h
index cb8fbcd3d2..9c6f8f8221 100644
--- a/sysdeps/mips/sys/ucontext.h
+++ b/sysdeps/mips/sys/ucontext.h
@@ -25,6 +25,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/posix/profil.c b/sysdeps/posix/profil.c
index f5b8ee19fc..4d3fbe0b8a 100644
--- a/sysdeps/posix/profil.c
+++ b/sysdeps/posix/profil.c
@@ -22,6 +22,7 @@
 #include <signal.h>
 #include <sys/time.h>
 #include <libc-internal.h>
+#include <sigsetops.h>
 
 #ifndef SIGPROF
 
diff --git a/sysdeps/posix/sigignore.c b/sysdeps/posix/sigignore.c
index e7975739e8..601ae9685a 100644
--- a/sysdeps/posix/sigignore.c
+++ b/sysdeps/posix/sigignore.c
@@ -22,7 +22,7 @@
 #include <stddef.h>
 #include <signal.h>
 #include <string.h>	/* For the real memset prototype.  */
-
+#include <sigsetops.h>
 
 int
 sigignore (int sig)
@@ -30,8 +30,7 @@ sigignore (int sig)
   struct sigaction act;
 
   act.sa_handler = SIG_IGN;
-  if (__sigemptyset (&act.sa_mask) < 0)
-    return -1;
+  __sigemptyset (&act.sa_mask);
   act.sa_flags = 0;
 
   return __sigaction (sig, &act, NULL);
diff --git a/sysdeps/posix/sigintr.c b/sysdeps/posix/sigintr.c
index d02469a8dd..a6202de6a9 100644
--- a/sysdeps/posix/sigintr.c
+++ b/sysdeps/posix/sigintr.c
@@ -18,6 +18,7 @@
 #include <stddef.h>
 #include <signal.h>
 #include <errno.h>
+#include <sigsetops.h>
 
 /* If INTERRUPT is nonzero, make signal SIG interrupt system calls
    (causing them to fail with EINTR); if INTERRUPT is zero, make system
diff --git a/sysdeps/posix/signal.c b/sysdeps/posix/signal.c
index 32db07b519..81ba17745d 100644
--- a/sysdeps/posix/signal.c
+++ b/sysdeps/posix/signal.c
@@ -19,7 +19,7 @@
 #include <errno.h>
 #include <signal.h>
 #include <string.h>	/* For the real memset prototype.  */
-
+#include <sigsetops.h>
 
 sigset_t _sigintr attribute_hidden;		/* Set by siginterrupt.  */
 
@@ -38,9 +38,8 @@ __bsd_signal (int sig, __sighandler_t handler)
     }
 
   act.sa_handler = handler;
-  if (__sigemptyset (&act.sa_mask) < 0
-      || __sigaddset (&act.sa_mask, sig) < 0)
-    return SIG_ERR;
+  __sigemptyset (&act.sa_mask);
+  __sigaddset (&act.sa_mask, sig);
   act.sa_flags = __sigismember (&_sigintr, sig) ? 0 : SA_RESTART;
   if (__sigaction (sig, &act, &oact) < 0)
     return SIG_ERR;
diff --git a/sysdeps/posix/sigset.c b/sysdeps/posix/sigset.c
index 0c2aa76ad4..a4dfe0ae93 100644
--- a/sysdeps/posix/sigset.c
+++ b/sysdeps/posix/sigset.c
@@ -8,7 +8,7 @@
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
@@ -20,7 +20,7 @@
 #include <stddef.h>
 #include <signal.h>
 #include <string.h>	/* For the real memset prototype.  */
-
+#include <sigsetops.h>
 
 /* Set the disposition for SIG.  */
 __sighandler_t
@@ -31,19 +31,19 @@ sigset (int sig, __sighandler_t disp)
   sigset_t set;
   sigset_t oset;
 
-#ifdef SIG_HOLD
-  /* Handle SIG_HOLD first.  */
+  /* Check signal extents to protect __sigismember.  */
+  if (disp == SIG_ERR || sig < 1 || sig >= NSIG)
+    {
+      __set_errno (EINVAL);
+      return SIG_ERR;
+    }
+
+  __sigemptyset (&set);
+  __sigaddset (&set, sig);
+
   if (disp == SIG_HOLD)
     {
-      /* Create an empty signal set.  */
-      if (__sigemptyset (&set) < 0)
-	return SIG_ERR;
-
-      /* Add the specified signal.  */
-      if (__sigaddset (&set, sig) < 0)
-	return SIG_ERR;
-
-      /* Add the signal set to the current signal mask.  */
+      /* Add the signal to the current signal mask.  */
       if (__sigprocmask (SIG_BLOCK, &set, &oset) < 0)
 	return SIG_ERR;
 
@@ -57,34 +57,19 @@ sigset (int sig, __sighandler_t disp)
 
       return oact.sa_handler;
     }
-#endif	/* SIG_HOLD */
-
-  /* Check signal extents to protect __sigismember.  */
-  if (disp == SIG_ERR || sig < 1 || sig >= NSIG)
+  else
     {
-      __set_errno (EINVAL);
-      return SIG_ERR;
+      act.sa_handler = disp;
+      __sigemptyset (&act.sa_mask);
+      act.sa_flags = 0;
+      if (__sigaction (sig, &act, &oact) < 0)
+	return SIG_ERR;
+
+      /* Remove the signal from the current signal mask.  */
+      if (__sigprocmask (SIG_UNBLOCK, &set, &oset) < 0)
+	return SIG_ERR;
+
+      /* If the signal was already blocked return SIG_HOLD.  */
+      return __sigismember (&oset, sig) ? SIG_HOLD : oact.sa_handler;
     }
-
-  act.sa_handler = disp;
-  if (__sigemptyset (&act.sa_mask) < 0)
-    return SIG_ERR;
-  act.sa_flags = 0;
-  if (__sigaction (sig, &act, &oact) < 0)
-    return SIG_ERR;
-
-  /* Create an empty signal set.  */
-  if (__sigemptyset (&set) < 0)
-    return SIG_ERR;
-
-  /* Add the specified signal.  */
-  if (__sigaddset (&set, sig) < 0)
-    return SIG_ERR;
-
-  /* Remove the signal set from the current signal mask.  */
-  if (__sigprocmask (SIG_UNBLOCK, &set, &oset) < 0)
-    return SIG_ERR;
-
-  /* If the signal was already blocked return SIG_HOLD.  */
-  return __sigismember (&oset, sig) ? SIG_HOLD : oact.sa_handler;
 }
diff --git a/sysdeps/posix/sprofil.c b/sysdeps/posix/sprofil.c
index f72245cb52..f704b9e8f4 100644
--- a/sysdeps/posix/sprofil.c
+++ b/sysdeps/posix/sprofil.c
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <sigsetops.h>
 
 #include <sys/time.h>
 #include <sys/profil.h>
diff --git a/sysdeps/posix/sysv_signal.c b/sysdeps/posix/sysv_signal.c
index 6d80803fd5..6893ec23e4 100644
--- a/sysdeps/posix/sysv_signal.c
+++ b/sysdeps/posix/sysv_signal.c
@@ -18,7 +18,7 @@
 #include <errno.h>
 #include <signal.h>
 #include <string.h>	/* For the real memset prototype.  */
-
+#include <sigsetops.h>
 
 /* Tolerate non-threads versions of Posix */
 #ifndef SA_ONESHOT
@@ -46,8 +46,7 @@ __sysv_signal (int sig, __sighandler_t handler)
     }
 
   act.sa_handler = handler;
-  if (__sigemptyset (&act.sa_mask) < 0)
-    return SIG_ERR;
+  __sigemptyset (&act.sa_mask);
   act.sa_flags = SA_ONESHOT | SA_NOMASK | SA_INTERRUPT;
   act.sa_flags &= ~SA_RESTART;
   if (__sigaction (sig, &act, &oact) < 0)
diff --git a/sysdeps/powerpc/novmxsetjmp.h b/sysdeps/powerpc/novmxsetjmp.h
index ed87efff3f..aa76bf9d1e 100644
--- a/sysdeps/powerpc/novmxsetjmp.h
+++ b/sysdeps/powerpc/novmxsetjmp.h
@@ -54,7 +54,7 @@ typedef long int __jmp_buf[40];
 typedef long int __jmp_buf[58];
 # endif
 
-# include <bits/sigset.h>		/* Get `__sigset_t'.  */
+# include <bits/types/__sigset_t.h>
 
 /* Calling environment, plus possibly a saved signal mask.  */
 typedef struct __novmx__jmp_buf_tag
diff --git a/sysdeps/pthread/bits/sigthread.h b/sysdeps/pthread/bits/sigthread.h
index 4302ee41e8..a7a861c9b7 100644
--- a/sysdeps/pthread/bits/sigthread.h
+++ b/sysdeps/pthread/bits/sigthread.h
@@ -24,6 +24,7 @@
 #endif
 
 /* Functions for handling signals. */
+#include <bits/types/__sigset_t.h>
 
 /* Modify the signal mask for the calling thread.  The arguments have
    the same meaning as for sigprocmask(2). */
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index fc6b3a9612..99b3f9d346 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -45,7 +45,8 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
 		  sys/timerfd.h sys/fanotify.h bits/eventfd.h bits/inotify.h \
 		  bits/signalfd.h bits/timerfd.h bits/epoll.h \
 		  bits/socket_type.h bits/syscall.h bits/sysctl.h \
-		  bits/mman-linux.h
+		  bits/mman-linux.h \
+		  bits/siginfo-arch.h bits/siginfo-consts-arch.h
 
 tests += tst-clone tst-clone2 tst-fanotify tst-personality tst-quota \
 	 tst-sync_file_range test-errno-linux
diff --git a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h
index 1a5fa29ce8..597f9eac2f 100644
--- a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h
@@ -26,6 +26,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h b/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h
index 912c61c841..4491ff7c81 100644
--- a/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h
@@ -23,6 +23,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/unix/sysv/linux/arm/sys/ucontext.h b/sysdeps/unix/sysv/linux/arm/sys/ucontext.h
index 8a5ea71a20..d7c7d9ec47 100644
--- a/sysdeps/unix/sysv/linux/arm/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/arm/sys/ucontext.h
@@ -25,6 +25,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/unix/sysv/linux/bits/sigevent-consts.h b/sysdeps/unix/sysv/linux/bits/sigevent-consts.h
new file mode 100644
index 0000000000..df3513bde2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/sigevent-consts.h
@@ -0,0 +1,41 @@
+/* sigevent constants.  Linux version.
+   Copyright (C) 1997-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _BITS_SIGEVENT_CONSTS_H
+#define _BITS_SIGEVENT_CONSTS_H 1
+
+#if !defined _SIGNAL_H && !defined _AIO_H
+#error "Don't include <bits/sigevent-consts.h> directly; use <signal.h> instead."
+#endif
+
+/* `sigev_notify' values.  */
+enum
+{
+  SIGEV_SIGNAL = 0,		/* Notify via signal.  */
+# define SIGEV_SIGNAL	SIGEV_SIGNAL
+  SIGEV_NONE,			/* Other notification: meaningless.  */
+# define SIGEV_NONE	SIGEV_NONE
+  SIGEV_THREAD,			/* Deliver via thread creation.  */
+# define SIGEV_THREAD	SIGEV_THREAD
+
+  SIGEV_THREAD_ID = 4		/* Send signal to specific thread.
+				   This is a Linux extension.  */
+#define SIGEV_THREAD_ID	SIGEV_THREAD_ID
+};
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/bits/siginfo-arch.h b/sysdeps/unix/sysv/linux/bits/siginfo-arch.h
new file mode 100644
index 0000000000..00018fa620
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/siginfo-arch.h
@@ -0,0 +1,7 @@
+/* Architecture-specific adjustments to siginfo_t.  */
+#ifndef _BITS_SIGINFO_ARCH_H
+#define _BITS_SIGINFO_ARCH_H 1
+
+/* This architecture has no adjustments to make to siginfo_t.  */
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/bits/siginfo-consts-arch.h b/sysdeps/unix/sysv/linux/bits/siginfo-consts-arch.h
new file mode 100644
index 0000000000..96b4edbccd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/siginfo-consts-arch.h
@@ -0,0 +1,7 @@
+/* Architecture-specific additional siginfo constants.  */
+#ifndef _BITS_SIGINFO_CONSTS_ARCH_H
+#define _BITS_SIGINFO_CONSTS_ARCH_H 1
+
+/* This architecture has no additional siginfo constants.  */
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/bits/siginfo-consts.h b/sysdeps/unix/sysv/linux/bits/siginfo-consts.h
new file mode 100644
index 0000000000..a7a31bfe5f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/siginfo-consts.h
@@ -0,0 +1,185 @@
+/* siginfo constants.  Linux version.
+   Copyright (C) 1997-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _BITS_SIGINFO_CONSTS_H
+#define _BITS_SIGINFO_CONSTS_H 1
+
+#ifndef _SIGNAL_H
+#error "Don't include <bits/siginfo-consts.h> directly; use <signal.h> instead."
+#endif
+
+/* Most of these constants are uniform across all architectures, but there
+   is one exception.  */
+#define __SI_ASYNCIO_AFTER_SIGIO 1
+#include <bits/siginfo-arch.h>
+
+/* Values for `si_code'.  Positive values are reserved for kernel-generated
+   signals.  */
+enum
+{
+  SI_ASYNCNL = -60,		/* Sent by asynch name lookup completion.  */
+  SI_TKILL = -6,		/* Sent by tkill.  */
+  SI_SIGIO,			/* Sent by queued SIGIO. */
+#if __SI_ASYNCIO_AFTER_SIGIO
+  SI_ASYNCIO,			/* Sent by AIO completion.  */
+  SI_MESGQ,			/* Sent by real time mesq state change.  */
+  SI_TIMER,			/* Sent by timer expiration.  */
+#else
+  SI_MESGQ,
+  SI_TIMER,
+  SI_ASYNCIO,
+#endif
+  SI_QUEUE,			/* Sent by sigqueue.  */
+  SI_USER,			/* Sent by kill, sigsend.  */
+  SI_KERNEL = 0x80		/* Send by kernel.  */
+
+#define SI_ASYNCNL	SI_ASYNCNL
+#define SI_TKILL	SI_TKILL
+#define SI_SIGIO	SI_SIGIO
+#define SI_ASYNCIO	SI_ASYNCIO
+#define SI_MESGQ	SI_MESGQ
+#define SI_TIMER	SI_TIMER
+#define SI_ASYNCIO	SI_ASYNCIO
+#define SI_QUEUE	SI_QUEUE
+#define SI_USER		SI_USER
+#define SI_KERNEL	SI_KERNEL
+};
+
+
+# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
+/* `si_code' values for SIGILL signal.  */
+enum
+{
+  ILL_ILLOPC = 1,		/* Illegal opcode.  */
+#  define ILL_ILLOPC	ILL_ILLOPC
+  ILL_ILLOPN,			/* Illegal operand.  */
+#  define ILL_ILLOPN	ILL_ILLOPN
+  ILL_ILLADR,			/* Illegal addressing mode.  */
+#  define ILL_ILLADR	ILL_ILLADR
+  ILL_ILLTRP,			/* Illegal trap. */
+#  define ILL_ILLTRP	ILL_ILLTRP
+  ILL_PRVOPC,			/* Privileged opcode.  */
+#  define ILL_PRVOPC	ILL_PRVOPC
+  ILL_PRVREG,			/* Privileged register.  */
+#  define ILL_PRVREG	ILL_PRVREG
+  ILL_COPROC,			/* Coprocessor error.  */
+#  define ILL_COPROC	ILL_COPROC
+  ILL_BADSTK			/* Internal stack error.  */
+#  define ILL_BADSTK	ILL_BADSTK
+};
+
+/* `si_code' values for SIGFPE signal.  */
+enum
+{
+  FPE_INTDIV = 1,		/* Integer divide by zero.  */
+#  define FPE_INTDIV	FPE_INTDIV
+  FPE_INTOVF,			/* Integer overflow.  */
+#  define FPE_INTOVF	FPE_INTOVF
+  FPE_FLTDIV,			/* Floating point divide by zero.  */
+#  define FPE_FLTDIV	FPE_FLTDIV
+  FPE_FLTOVF,			/* Floating point overflow.  */
+#  define FPE_FLTOVF	FPE_FLTOVF
+  FPE_FLTUND,			/* Floating point underflow.  */
+#  define FPE_FLTUND	FPE_FLTUND
+  FPE_FLTRES,			/* Floating point inexact result.  */
+#  define FPE_FLTRES	FPE_FLTRES
+  FPE_FLTINV,			/* Floating point invalid operation.  */
+#  define FPE_FLTINV	FPE_FLTINV
+  FPE_FLTSUB			/* Subscript out of range.  */
+#  define FPE_FLTSUB	FPE_FLTSUB
+};
+
+/* `si_code' values for SIGSEGV signal.  */
+enum
+{
+  SEGV_MAPERR = 1,		/* Address not mapped to object.  */
+#  define SEGV_MAPERR	SEGV_MAPERR
+  SEGV_ACCERR			/* Invalid permissions for mapped object.  */
+#  define SEGV_ACCERR	SEGV_ACCERR
+};
+
+/* `si_code' values for SIGBUS signal.  */
+enum
+{
+  BUS_ADRALN = 1,		/* Invalid address alignment.  */
+#  define BUS_ADRALN	BUS_ADRALN
+  BUS_ADRERR,			/* Non-existant physical address.  */
+#  define BUS_ADRERR	BUS_ADRERR
+  BUS_OBJERR,			/* Object specific hardware error.  */
+#  define BUS_OBJERR	BUS_OBJERR
+  BUS_MCEERR_AR,		/* Hardware memory error: action required.  */
+#  define BUS_MCEERR_AR	BUS_MCEERR_AR
+  BUS_MCEERR_AO			/* Hardware memory error: action optional.  */
+#  define BUS_MCEERR_AO	BUS_MCEERR_AO
+};
+# endif
+
+# ifdef __USE_XOPEN_EXTENDED
+/* `si_code' values for SIGTRAP signal.  */
+enum
+{
+  TRAP_BRKPT = 1,		/* Process breakpoint.  */
+#  define TRAP_BRKPT	TRAP_BRKPT
+  TRAP_TRACE			/* Process trace trap.  */
+#  define TRAP_TRACE	TRAP_TRACE
+};
+# endif
+
+# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
+/* `si_code' values for SIGCHLD signal.  */
+enum
+{
+  CLD_EXITED = 1,		/* Child has exited.  */
+#  define CLD_EXITED	CLD_EXITED
+  CLD_KILLED,			/* Child was killed.  */
+#  define CLD_KILLED	CLD_KILLED
+  CLD_DUMPED,			/* Child terminated abnormally.  */
+#  define CLD_DUMPED	CLD_DUMPED
+  CLD_TRAPPED,			/* Traced child has trapped.  */
+#  define CLD_TRAPPED	CLD_TRAPPED
+  CLD_STOPPED,			/* Child has stopped.  */
+#  define CLD_STOPPED	CLD_STOPPED
+  CLD_CONTINUED			/* Stopped child has continued.  */
+#  define CLD_CONTINUED	CLD_CONTINUED
+};
+
+/* `si_code' values for SIGPOLL signal.  */
+enum
+{
+  POLL_IN = 1,			/* Data input available.  */
+#  define POLL_IN	POLL_IN
+  POLL_OUT,			/* Output buffers available.  */
+#  define POLL_OUT	POLL_OUT
+  POLL_MSG,			/* Input message available.   */
+#  define POLL_MSG	POLL_MSG
+  POLL_ERR,			/* I/O error.  */
+#  define POLL_ERR	POLL_ERR
+  POLL_PRI,			/* High priority input available.  */
+#  define POLL_PRI	POLL_PRI
+  POLL_HUP			/* Device disconnected.  */
+#  define POLL_HUP	POLL_HUP
+};
+# endif
+
+/* Architectures might also add architecture-specific constants.
+   These are all considered GNU extensions.  */
+#ifdef __USE_GNU
+# include <bits/siginfo-consts-arch.h>
+#endif
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/bits/siginfo.h b/sysdeps/unix/sysv/linux/bits/siginfo.h
deleted file mode 100644
index 7b0d4f62a3..0000000000
--- a/sysdeps/unix/sysv/linux/bits/siginfo.h
+++ /dev/null
@@ -1,341 +0,0 @@
-/* siginfo_t, sigevent and constants.  Linux version.
-   Copyright (C) 1997-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#if !defined _SIGNAL_H && !defined __need_siginfo_t \
-    && !defined __need_sigevent_t
-# error "Never include this file directly.  Use <signal.h> instead"
-#endif
-
-#include <bits/wordsize.h>
-
-#if (!defined __have_sigval_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t \
-	 || defined __need_sigevent_t))
-# define __have_sigval_t	1
-
-/* Type for data associated with a signal.  */
-typedef union sigval
-  {
-    int sival_int;
-    void *sival_ptr;
-  } sigval_t;
-#endif
-
-#if (!defined __have_siginfo_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t))
-# define __have_siginfo_t	1
-
-# define __SI_MAX_SIZE     128
-# if __WORDSIZE == 64
-#  define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 4)
-# else
-#  define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 3)
-# endif
-
-typedef struct
-  {
-    int si_signo;		/* Signal number.  */
-    int si_errno;		/* If non-zero, an errno value associated with
-				   this signal, as defined in <errno.h>.  */
-    int si_code;		/* Signal code.  */
-
-    union
-      {
-	int _pad[__SI_PAD_SIZE];
-
-	 /* kill().  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	  } _kill;
-
-	/* POSIX.1b timers.  */
-	struct
-	  {
-	    int si_tid;		/* Timer ID.  */
-	    int si_overrun;	/* Overrun count.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _timer;
-
-	/* POSIX.1b signals.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _rt;
-
-	/* SIGCHLD.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Which child.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    int si_status;	/* Exit value or signal.  */
-	    __clock_t si_utime;
-	    __clock_t si_stime;
-	  } _sigchld;
-
-	/* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
-	struct
-	  {
-	    void *si_addr;	/* Faulting insn/memory ref.  */
-	    short int si_addr_lsb;	/* Valid LSB of the reported address.  */
-	  } _sigfault;
-
-	/* SIGPOLL.  */
-	struct
-	  {
-	    long int si_band;	/* Band event for SIGPOLL.  */
-	    int si_fd;
-	  } _sigpoll;
-
-	/* SIGSYS.  */
-	struct
-	  {
-	    void *_call_addr;	/* Calling user insn.  */
-	    int _syscall;	/* Triggering system call number.  */
-	    unsigned int _arch; /* AUDIT_ARCH_* of syscall.  */
-	  } _sigsys;
-      } _sifields;
-  } siginfo_t;
-
-
-/* X/Open requires some more fields with fixed names.  */
-# define si_pid		_sifields._kill.si_pid
-# define si_uid		_sifields._kill.si_uid
-# define si_timerid	_sifields._timer.si_tid
-# define si_overrun	_sifields._timer.si_overrun
-# define si_status	_sifields._sigchld.si_status
-# define si_utime	_sifields._sigchld.si_utime
-# define si_stime	_sifields._sigchld.si_stime
-# define si_value	_sifields._rt.si_sigval
-# define si_int		_sifields._rt.si_sigval.sival_int
-# define si_ptr		_sifields._rt.si_sigval.sival_ptr
-# define si_addr	_sifields._sigfault.si_addr
-# define si_addr_lsb	_sifields._sigfault.si_addr_lsb
-# define si_band	_sifields._sigpoll.si_band
-# define si_fd		_sifields._sigpoll.si_fd
-# define si_call_addr 	_sifields._sigsys._call_addr
-# define si_syscall	_sifields._sigsys._syscall
-# define si_arch	_sifields._sigsys._arch
-
-
-/* Values for `si_code'.  Positive values are reserved for kernel-generated
-   signals.  */
-enum
-{
-  SI_ASYNCNL = -60,		/* Sent by asynch name lookup completion.  */
-# define SI_ASYNCNL	SI_ASYNCNL
-  SI_TKILL = -6,		/* Sent by tkill.  */
-# define SI_TKILL	SI_TKILL
-  SI_SIGIO,			/* Sent by queued SIGIO. */
-# define SI_SIGIO	SI_SIGIO
-  SI_ASYNCIO,			/* Sent by AIO completion.  */
-# define SI_ASYNCIO	SI_ASYNCIO
-  SI_MESGQ,			/* Sent by real time mesq state change.  */
-# define SI_MESGQ	SI_MESGQ
-  SI_TIMER,			/* Sent by timer expiration.  */
-# define SI_TIMER	SI_TIMER
-  SI_QUEUE,			/* Sent by sigqueue.  */
-# define SI_QUEUE	SI_QUEUE
-  SI_USER,			/* Sent by kill, sigsend.  */
-# define SI_USER	SI_USER
-  SI_KERNEL = 0x80		/* Send by kernel.  */
-#define SI_KERNEL	SI_KERNEL
-};
-
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGILL signal.  */
-enum
-{
-  ILL_ILLOPC = 1,		/* Illegal opcode.  */
-#  define ILL_ILLOPC	ILL_ILLOPC
-  ILL_ILLOPN,			/* Illegal operand.  */
-#  define ILL_ILLOPN	ILL_ILLOPN
-  ILL_ILLADR,			/* Illegal addressing mode.  */
-#  define ILL_ILLADR	ILL_ILLADR
-  ILL_ILLTRP,			/* Illegal trap. */
-#  define ILL_ILLTRP	ILL_ILLTRP
-  ILL_PRVOPC,			/* Privileged opcode.  */
-#  define ILL_PRVOPC	ILL_PRVOPC
-  ILL_PRVREG,			/* Privileged register.  */
-#  define ILL_PRVREG	ILL_PRVREG
-  ILL_COPROC,			/* Coprocessor error.  */
-#  define ILL_COPROC	ILL_COPROC
-  ILL_BADSTK			/* Internal stack error.  */
-#  define ILL_BADSTK	ILL_BADSTK
-};
-
-/* `si_code' values for SIGFPE signal.  */
-enum
-{
-  FPE_INTDIV = 1,		/* Integer divide by zero.  */
-#  define FPE_INTDIV	FPE_INTDIV
-  FPE_INTOVF,			/* Integer overflow.  */
-#  define FPE_INTOVF	FPE_INTOVF
-  FPE_FLTDIV,			/* Floating point divide by zero.  */
-#  define FPE_FLTDIV	FPE_FLTDIV
-  FPE_FLTOVF,			/* Floating point overflow.  */
-#  define FPE_FLTOVF	FPE_FLTOVF
-  FPE_FLTUND,			/* Floating point underflow.  */
-#  define FPE_FLTUND	FPE_FLTUND
-  FPE_FLTRES,			/* Floating point inexact result.  */
-#  define FPE_FLTRES	FPE_FLTRES
-  FPE_FLTINV,			/* Floating point invalid operation.  */
-#  define FPE_FLTINV	FPE_FLTINV
-  FPE_FLTSUB			/* Subscript out of range.  */
-#  define FPE_FLTSUB	FPE_FLTSUB
-};
-
-/* `si_code' values for SIGSEGV signal.  */
-enum
-{
-  SEGV_MAPERR = 1,		/* Address not mapped to object.  */
-#  define SEGV_MAPERR	SEGV_MAPERR
-  SEGV_ACCERR			/* Invalid permissions for mapped object.  */
-#  define SEGV_ACCERR	SEGV_ACCERR
-};
-
-/* `si_code' values for SIGBUS signal.  */
-enum
-{
-  BUS_ADRALN = 1,		/* Invalid address alignment.  */
-#  define BUS_ADRALN	BUS_ADRALN
-  BUS_ADRERR,			/* Non-existant physical address.  */
-#  define BUS_ADRERR	BUS_ADRERR
-  BUS_OBJERR,			/* Object specific hardware error.  */
-#  define BUS_OBJERR	BUS_OBJERR
-  BUS_MCEERR_AR,		/* Hardware memory error: action required.  */
-#  define BUS_MCEERR_AR	BUS_MCEERR_AR
-  BUS_MCEERR_AO			/* Hardware memory error: action optional.  */
-#  define BUS_MCEERR_AO	BUS_MCEERR_AO
-};
-# endif
-
-# ifdef __USE_XOPEN_EXTENDED
-/* `si_code' values for SIGTRAP signal.  */
-enum
-{
-  TRAP_BRKPT = 1,		/* Process breakpoint.  */
-#  define TRAP_BRKPT	TRAP_BRKPT
-  TRAP_TRACE			/* Process trace trap.  */
-#  define TRAP_TRACE	TRAP_TRACE
-};
-# endif
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGCHLD signal.  */
-enum
-{
-  CLD_EXITED = 1,		/* Child has exited.  */
-#  define CLD_EXITED	CLD_EXITED
-  CLD_KILLED,			/* Child was killed.  */
-#  define CLD_KILLED	CLD_KILLED
-  CLD_DUMPED,			/* Child terminated abnormally.  */
-#  define CLD_DUMPED	CLD_DUMPED
-  CLD_TRAPPED,			/* Traced child has trapped.  */
-#  define CLD_TRAPPED	CLD_TRAPPED
-  CLD_STOPPED,			/* Child has stopped.  */
-#  define CLD_STOPPED	CLD_STOPPED
-  CLD_CONTINUED			/* Stopped child has continued.  */
-#  define CLD_CONTINUED	CLD_CONTINUED
-};
-
-/* `si_code' values for SIGPOLL signal.  */
-enum
-{
-  POLL_IN = 1,			/* Data input available.  */
-#  define POLL_IN	POLL_IN
-  POLL_OUT,			/* Output buffers available.  */
-#  define POLL_OUT	POLL_OUT
-  POLL_MSG,			/* Input message available.   */
-#  define POLL_MSG	POLL_MSG
-  POLL_ERR,			/* I/O error.  */
-#  define POLL_ERR	POLL_ERR
-  POLL_PRI,			/* High priority input available.  */
-#  define POLL_PRI	POLL_PRI
-  POLL_HUP			/* Device disconnected.  */
-#  define POLL_HUP	POLL_HUP
-};
-# endif
-
-# undef __need_siginfo_t
-#endif	/* !have siginfo_t && (have _SIGNAL_H || need siginfo_t).  */
-
-
-#if (defined _SIGNAL_H || defined __need_sigevent_t) \
-    && !defined __have_sigevent_t
-# define __have_sigevent_t	1
-
-/* Structure to transport application-defined values with signals.  */
-# define __SIGEV_MAX_SIZE	64
-# if __WORDSIZE == 64
-#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 4)
-# else
-#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 3)
-# endif
-
-/* Forward declaration.  */
-# ifndef __have_pthread_attr_t
-typedef union pthread_attr_t pthread_attr_t;
-#  define __have_pthread_attr_t	1
-# endif
-
-typedef struct sigevent
-  {
-    sigval_t sigev_value;
-    int sigev_signo;
-    int sigev_notify;
-
-    union
-      {
-	int _pad[__SIGEV_PAD_SIZE];
-
-	/* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
-	   thread to receive the signal.  */
-	__pid_t _tid;
-
-	struct
-	  {
-	    void (*_function) (sigval_t);	/* Function to start.  */
-	    pthread_attr_t *_attribute;		/* Thread attributes.  */
-	  } _sigev_thread;
-      } _sigev_un;
-  } sigevent_t;
-
-/* POSIX names to access some of the members.  */
-# define sigev_notify_function   _sigev_un._sigev_thread._function
-# define sigev_notify_attributes _sigev_un._sigev_thread._attribute
-
-/* `sigev_notify' values.  */
-enum
-{
-  SIGEV_SIGNAL = 0,		/* Notify via signal.  */
-# define SIGEV_SIGNAL	SIGEV_SIGNAL
-  SIGEV_NONE,			/* Other notification: meaningless.  */
-# define SIGEV_NONE	SIGEV_NONE
-  SIGEV_THREAD,			/* Deliver via thread creation.  */
-# define SIGEV_THREAD	SIGEV_THREAD
-
-  SIGEV_THREAD_ID = 4		/* Send signal to specific thread.  */
-#define SIGEV_THREAD_ID	SIGEV_THREAD_ID
-};
-
-#endif	/* have _SIGNAL_H.  */
diff --git a/sysdeps/unix/sysv/linux/bits/sigset.h b/sysdeps/unix/sysv/linux/bits/sigset.h
deleted file mode 100644
index 4b2916f3d9..0000000000
--- a/sysdeps/unix/sysv/linux/bits/sigset.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/* __sig_atomic_t, __sigset_t, and related definitions.  Linux version.
-   Copyright (C) 1991-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef	_SIGSET_H_types
-# define _SIGSET_H_types	1
-
-typedef int __sig_atomic_t;
-
-/* A `sigset_t' has a bit for each signal.  */
-
-# define _SIGSET_NWORDS	(1024 / (8 * sizeof (unsigned long int)))
-typedef struct
-  {
-    unsigned long int __val[_SIGSET_NWORDS];
-  } __sigset_t;
-
-#endif
-
-
-/* We only want to define these functions if <signal.h> was actually
-   included; otherwise we were included just to define the types.  Since we
-   are namespace-clean, it wouldn't hurt to define extra macros.  But
-   trouble can be caused by functions being defined (e.g., any global
-   register vars declared later will cause compilation errors).  */
-
-#if !defined _SIGSET_H_fns && defined _SIGNAL_H
-# define _SIGSET_H_fns 1
-
-# ifndef _EXTERN_INLINE
-#  define _EXTERN_INLINE __extern_inline
-# endif
-
-/* Return a mask that includes the bit for SIG only.  */
-# define __sigmask(sig) \
-  (((unsigned long int) 1) << (((sig) - 1) % (8 * sizeof (unsigned long int))))
-
-/* Return the word index for SIG.  */
-# define __sigword(sig)	(((sig) - 1) / (8 * sizeof (unsigned long int)))
-
-# if defined __GNUC__ && __GNUC__ >= 2
-#  define __sigemptyset(set) \
-  (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
-		    sigset_t *__set = (set);				      \
-		    while (--__cnt >= 0) __set->__val[__cnt] = 0;	      \
-		    0; }))
-#  define __sigfillset(set) \
-  (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
-		    sigset_t *__set = (set);				      \
-		    while (--__cnt >= 0) __set->__val[__cnt] = ~0UL;	      \
-		    0; }))
-
-#  ifdef __USE_GNU
-/* The POSIX does not specify for handling the whole signal set in one
-   command.  This is often wanted and so we define three more functions
-   here.  */
-#   define __sigisemptyset(set) \
-  (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
-		    const sigset_t *__set = (set);			      \
-		    int __ret = __set->__val[--__cnt];			      \
-		    while (!__ret && --__cnt >= 0)			      \
-			__ret = __set->__val[__cnt];			      \
-		    __ret == 0; }))
-#   define __sigandset(dest, left, right) \
-  (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
-		    sigset_t *__dest = (dest);				      \
-		    const sigset_t *__left = (left);			      \
-		    const sigset_t *__right = (right);			      \
-		    while (--__cnt >= 0)				      \
-		      __dest->__val[__cnt] = (__left->__val[__cnt]	      \
-					      & __right->__val[__cnt]);	      \
-		    0; }))
-#   define __sigorset(dest, left, right) \
-  (__extension__ ({ int __cnt = _SIGSET_NWORDS;				      \
-		    sigset_t *__dest = (dest);				      \
-		    const sigset_t *__left = (left);			      \
-		    const sigset_t *__right = (right);			      \
-		    while (--__cnt >= 0)				      \
-		      __dest->__val[__cnt] = (__left->__val[__cnt]	      \
-					      | __right->__val[__cnt]);	      \
-		    0; }))
-#  endif
-# endif
-
-/* These functions needn't check for a bogus signal number -- error
-   checking is done in the non __ versions.  */
-
-extern int __sigismember (const __sigset_t *, int);
-extern int __sigaddset (__sigset_t *, int);
-extern int __sigdelset (__sigset_t *, int);
-
-# ifdef __USE_EXTERN_INLINES
-#  define __SIGSETFN(NAME, BODY, CONST)					      \
-  _EXTERN_INLINE int							      \
-  NAME (CONST __sigset_t *__set, int __sig)				      \
-  {									      \
-    unsigned long int __mask = __sigmask (__sig);			      \
-    unsigned long int __word = __sigword (__sig);			      \
-    return BODY;							      \
-  }
-
-__SIGSETFN (__sigismember, (__set->__val[__word] & __mask) ? 1 : 0, const)
-__SIGSETFN (__sigaddset, ((__set->__val[__word] |= __mask), 0), )
-__SIGSETFN (__sigdelset, ((__set->__val[__word] &= ~__mask), 0), )
-
-#  undef __SIGSETFN
-# endif
-
-
-#endif /* ! _SIGSET_H_fns.  */
diff --git a/sysdeps/unix/sysv/linux/bits/types/__sigset_t.h b/sysdeps/unix/sysv/linux/bits/types/__sigset_t.h
new file mode 100644
index 0000000000..e2f18acf30
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/types/__sigset_t.h
@@ -0,0 +1,10 @@
+#ifndef ____sigset_t_defined
+#define ____sigset_t_defined
+
+#define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
+typedef struct
+{
+  unsigned long int __val[_SIGSET_NWORDS];
+} __sigset_t;
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/bits/types/sigevent_t.h b/sysdeps/unix/sysv/linux/bits/types/sigevent_t.h
new file mode 100644
index 0000000000..0d4857b16e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/types/sigevent_t.h
@@ -0,0 +1,48 @@
+#ifndef __sigevent_t_defined
+#define __sigevent_t_defined 1
+
+#include <bits/wordsize.h>
+#include <bits/types.h>
+#include <bits/types/sigval_t.h>
+
+#define __SIGEV_MAX_SIZE	64
+#if __WORDSIZE == 64
+# define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 4)
+#else
+# define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 3)
+#endif
+
+/* Forward declaration.  */
+#ifndef __have_pthread_attr_t
+typedef union pthread_attr_t pthread_attr_t;
+# define __have_pthread_attr_t	1
+#endif
+
+/* Structure to transport application-defined values with signals.  */
+typedef struct sigevent
+  {
+    sigval_t sigev_value;
+    int sigev_signo;
+    int sigev_notify;
+
+    union
+      {
+	int _pad[__SIGEV_PAD_SIZE];
+
+	/* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
+	   thread to receive the signal.  */
+	__pid_t _tid;
+
+	struct
+	  {
+	    void (*_function) (sigval_t);	/* Function to start.  */
+	    pthread_attr_t *_attribute;		/* Thread attributes.  */
+	  } _sigev_thread;
+      } _sigev_un;
+  } sigevent_t;
+
+/* POSIX names to access some of the members.  */
+#define sigev_notify_function   _sigev_un._sigev_thread._function
+#define sigev_notify_attributes _sigev_un._sigev_thread._attribute
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/bits/types/siginfo_t.h b/sysdeps/unix/sysv/linux/bits/types/siginfo_t.h
new file mode 100644
index 0000000000..1bb6da5264
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/types/siginfo_t.h
@@ -0,0 +1,139 @@
+#ifndef __siginfo_t_defined
+#define __siginfo_t_defined 1
+
+#include <bits/wordsize.h>
+#include <bits/types.h>
+#include <bits/types/sigval_t.h>
+
+#define __SI_MAX_SIZE	128
+#if __WORDSIZE == 64
+# define __SI_PAD_SIZE	((__SI_MAX_SIZE / sizeof (int)) - 4)
+#else
+# define __SI_PAD_SIZE	((__SI_MAX_SIZE / sizeof (int)) - 3)
+#endif
+
+/* Some fields of siginfo_t have architecture-specific variations.  */
+#define __SI_ALIGNMENT		/* nothing */
+#define __SI_BAND_TYPE		long int
+#define __SI_CLOCK_T		__clock_t
+#define __SI_ERRNO_THEN_CODE	1
+#define __SI_HAVE_SIGSYS	1
+#define __SI_SIGFAULT_ADDL	/* nothing */
+#include <bits/siginfo-arch.h>
+
+typedef struct
+  {
+    int si_signo;		/* Signal number.  */
+#if __SI_ERRNO_THEN_CODE
+    int si_errno;		/* If non-zero, an errno value associated with
+				   this signal, as defined in <errno.h>.  */
+    int si_code;		/* Signal code.  */
+#else
+    int si_code;
+    int si_errno;
+#endif
+#if __WORDSIZE == 64
+    int __pad0;			/* Explicit padding.  */
+#endif
+
+    union
+      {
+	int _pad[__SI_PAD_SIZE];
+
+	 /* kill().  */
+	struct
+	  {
+	    __pid_t si_pid;	/* Sending process ID.  */
+	    __uid_t si_uid;	/* Real user ID of sending process.  */
+	  } _kill;
+
+	/* POSIX.1b timers.  */
+	struct
+	  {
+	    int si_tid;		/* Timer ID.  */
+	    int si_overrun;	/* Overrun count.  */
+	    sigval_t si_sigval;	/* Signal value.  */
+	  } _timer;
+
+	/* POSIX.1b signals.  */
+	struct
+	  {
+	    __pid_t si_pid;	/* Sending process ID.  */
+	    __uid_t si_uid;	/* Real user ID of sending process.  */
+	    sigval_t si_sigval;	/* Signal value.  */
+	  } _rt;
+
+	/* SIGCHLD.  */
+	struct
+	  {
+	    __pid_t si_pid;	/* Which child.	 */
+	    __uid_t si_uid;	/* Real user ID of sending process.  */
+	    int si_status;	/* Exit value or signal.  */
+	    __SI_CLOCK_T si_utime;
+	    __SI_CLOCK_T si_stime;
+	  } _sigchld;
+
+	/* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
+	struct
+	  {
+	    void *si_addr;	    /* Faulting insn/memory ref.  */
+	    __SI_SIGFAULT_ADDL
+	    short int si_addr_lsb;  /* Valid LSB of the reported address.  */
+	    union
+	      {
+		/* used when si_code=SEGV_BNDERR */
+		struct
+		  {
+		    void *_lower;
+		    void *_upper;
+		  } _addr_bnd;
+		/* used when si_code=SEGV_PKUERR */
+		__uint32_t _pkey;
+	      } _bounds;
+	  } _sigfault;
+
+	/* SIGPOLL.  */
+	struct
+	  {
+	    long int si_band;	/* Band event for SIGPOLL.  */
+	    int si_fd;
+	  } _sigpoll;
+
+	/* SIGSYS.  */
+#if __SI_HAVE_SIGSYS
+	struct
+	  {
+	    void *_call_addr;	/* Calling user insn.  */
+	    int _syscall;	/* Triggering system call number.  */
+	    unsigned int _arch; /* AUDIT_ARCH_* of syscall.  */
+	  } _sigsys;
+#endif
+      } _sifields;
+  } siginfo_t __SI_ALIGNMENT;
+
+
+/* X/Open requires some more fields with fixed names.  */
+#define si_pid		_sifields._kill.si_pid
+#define si_uid		_sifields._kill.si_uid
+#define si_timerid	_sifields._timer.si_tid
+#define si_overrun	_sifields._timer.si_overrun
+#define si_status	_sifields._sigchld.si_status
+#define si_utime	_sifields._sigchld.si_utime
+#define si_stime	_sifields._sigchld.si_stime
+#define si_value	_sifields._rt.si_sigval
+#define si_int		_sifields._rt.si_sigval.sival_int
+#define si_ptr		_sifields._rt.si_sigval.sival_ptr
+#define si_addr		_sifields._sigfault.si_addr
+#define si_addr_lsb	_sifields._sigfault.si_addr_lsb
+#define si_lower	_sifields._sigfault._bounds._addr_bnd._lower
+#define si_upper	_sifields._sigfault._bounds._addr_bnd._upper
+#define si_pkey		_sifields._sigfault._bounds._pkey
+#define si_band		_sifields._sigpoll.si_band
+#define si_fd		_sifields._sigpoll.si_fd
+#if __SI_HAVE_SIGSYS
+# define si_call_addr	_sifields._sigsys._call_addr
+# define si_syscall	_sifields._sigsys._syscall
+# define si_arch	_sifields._sigsys._arch
+#endif
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h b/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h
index 50e585d163..79b99ff6a2 100644
--- a/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h
@@ -25,6 +25,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h b/sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h
new file mode 100644
index 0000000000..f824adb77a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h
@@ -0,0 +1,19 @@
+/* Architecture-specific adjustments to siginfo_t.  ia64 version.  */
+#ifndef _BITS_SIGINFO_ARCH_H
+
+#undef __SI_HAVE_SIGSYS
+#define __SI_HAVE_SIGSYS 0
+
+#undef __SI_SIGFAULT_ADDL
+#define __SI_SIGFAULT_ADDL			\
+  int _si_imm;					\
+  unsigned int _si_flags;			\
+  unsigned long int _si_isr;
+
+#ifdef __USE_GNU
+# define si_imm		_sifields._sigfault._si_imm
+# define si_segvflags	_sifields._sigfault._si_flags
+# define si_isr		_sifields._sigfault._si_isr
+#endif
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/ia64/bits/siginfo-consts-arch.h b/sysdeps/unix/sysv/linux/ia64/bits/siginfo-consts-arch.h
new file mode 100644
index 0000000000..4c5c4da516
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/ia64/bits/siginfo-consts-arch.h
@@ -0,0 +1,45 @@
+/* Architecture-specific additional siginfo constants.  ia64 version.  */
+#ifndef _BITS_SIGINFO_CONSTS_ARCH_H
+#define _BITS_SIGINFO_CONSTS_ARCH_H 1
+
+/* `si_code' values for SIGILL signal.  */
+enum
+{
+  ILL_BADIADDR = ILL_BADSTK + 1, /* Unimplemented instruction address. */
+#define ILL_BADIADDR ILL_BADIADDR
+  ILL_BREAK
+#define ILL_BREAK ILL_BREAK
+};
+
+/* `si_code' values for SIGFPE signal.  */
+enum
+{
+   FPE_DECOVF   = FPE_FLTSUB + 1,
+#define FPE_DECOVF  FPE_DECOVF
+   FPE_DECDIV,
+#define FPE_DECDIV  FPE_DECDIV
+   FPE_DECERR,
+#define FPE_DECERR  FPE_DECERR
+   FPE_INVASC,
+#define FPE_INVASC  FPE_INVASC
+   FPE_INVDEC
+#define FPE_INVDEC  FPE_INVDEC
+};
+
+/* `si_code' values for SIGSEGV signal.  */
+enum
+{
+  SEGV_PSTKOVF = SEGV_ACCERR + 1
+#define SEGV_PSTKOVF SEGV_PSTKOVF
+};
+
+/* `si_code' values for SIGTRAP signal.  */
+enum
+{
+  TRAP_BRANCH = TRAP_TRACE + 1,
+#define TRAP_BRANCH TRAP_BRANCH
+  TRAP_HWBKPT
+#define TRAP_HWBKPT TRAP_HWBKPT
+};
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/ia64/bits/siginfo.h b/sysdeps/unix/sysv/linux/ia64/bits/siginfo.h
deleted file mode 100644
index b2a7338824..0000000000
--- a/sysdeps/unix/sysv/linux/ia64/bits/siginfo.h
+++ /dev/null
@@ -1,360 +0,0 @@
-/* siginfo_t, sigevent and constants.  Linux/ia64 version.
-   Copyright (C) 2000-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#if !defined _SIGNAL_H && !defined __need_siginfo_t \
-    && !defined __need_sigevent_t
-# error "Never include this file directly.  Use <signal.h> instead"
-#endif
-
-#if (!defined __have_sigval_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t \
-	 || defined __need_sigevent_t))
-# define __have_sigval_t	1
-
-/* Type for data associated with a signal.  */
-typedef union sigval
-  {
-    int sival_int;
-    void *sival_ptr;
-  } sigval_t;
-#endif
-
-#if (!defined __have_siginfo_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t))
-# define __have_siginfo_t	1
-
-# define __SI_MAX_SIZE     128
-# define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 4)
-
-typedef struct
-  {
-    int si_signo;		/* Signal number.  */
-    int si_errno;		/* If non-zero, an errno value associated with
-				   this signal, as defined in <errno.h>.  */
-    int si_code;		/* Signal code.  */
-    int __pad0;			/* Explicit padding.  */
-
-    union
-      {
-	int _pad[__SI_PAD_SIZE];
-
-	 /* kill().  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	  } _kill;
-
-	/* POSIX.1b timers.  */
-	struct
-	  {
-	    int si_tid;		/* Timer ID.  */
-	    int si_overrun;	/* Overrun count.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _timer;
-
-	/* POSIX.1b signals.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _rt;
-
-	/* SIGCHLD.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Which child.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    int si_status;	/* Exit value or signal.  */
-	    __clock_t si_utime;
-	    __clock_t si_stime;
-	  } _sigchld;
-
-	/* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
-	struct
-	  {
-	    void *si_addr;	/* Faulting insn/memory ref.  */
-	    int _si_imm;
-	    unsigned int _si_flags;
-	    unsigned long int _si_isr;
-	    short int si_addr_lsb;	/* Valid LSB of the reported address.  */
-	  } _sigfault;
-
-	/* SIGPOLL.  */
-	struct
-	  {
-	    long int si_band;	/* Band event for SIGPOLL.  */
-	    int si_fd;
-	  } _sigpoll;
-      } _sifields;
-  } siginfo_t;
-
-
-/* X/Open requires some more fields with fixed names.  */
-# define si_pid		_sifields._kill.si_pid
-# define si_uid		_sifields._kill.si_uid
-# define si_timerid	_sifields._timer.si_tid
-# define si_overrun	_sifields._timer.si_overrun
-# define si_status	_sifields._sigchld.si_status
-# define si_utime	_sifields._sigchld.si_utime
-# define si_stime	_sifields._sigchld.si_stime
-# define si_value	_sifields._rt.si_sigval
-# define si_int		_sifields._rt.si_sigval.sival_int
-# define si_ptr		_sifields._rt.si_sigval.sival_ptr
-# define si_addr	_sifields._sigfault.si_addr
-# define si_addr_lsb	_sifields._sigfault.si_addr_lsb
-# define si_band	_sifields._sigpoll.si_band
-# define si_fd		_sifields._sigpoll.si_fd
-
-# ifdef __USE_GNU
-#  define si_imm	_sifields._sigfault._si_imm
-#  define si_segvflags	_sifields._sigfault._si_flags
-#  define si_isr	_sifields._sigfault._si_isr
-# endif
-
-/* Values for `si_code'.  Positive values are reserved for kernel-generated
-   signals.  */
-enum
-{
-  SI_ASYNCNL = -60,		/* Sent by asynch name lookup completion.  */
-# define SI_ASYNCNL	SI_ASYNCNL
-  SI_TKILL = -6,		/* Sent by tkill.  */
-# define SI_TKILL	SI_TKILL
-  SI_SIGIO,			/* Sent by queued SIGIO. */
-# define SI_SIGIO	SI_SIGIO
-  SI_ASYNCIO,			/* Sent by AIO completion.  */
-# define SI_ASYNCIO	SI_ASYNCIO
-  SI_MESGQ,			/* Sent by real time mesq state change.  */
-# define SI_MESGQ	SI_MESGQ
-  SI_TIMER,			/* Sent by timer expiration.  */
-# define SI_TIMER	SI_TIMER
-  SI_QUEUE,			/* Sent by sigqueue.  */
-# define SI_QUEUE	SI_QUEUE
-  SI_USER,			/* Sent by kill, sigsend.  */
-# define SI_USER	SI_USER
-  SI_KERNEL = 0x80		/* Send by kernel.  */
-#define SI_KERNEL	SI_KERNEL
-};
-
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGILL signal.  */
-enum
-{
-  ILL_ILLOPC = 1,		/* Illegal opcode.  */
-#  define ILL_ILLOPC	ILL_ILLOPC
-  ILL_ILLOPN,			/* Illegal operand.  */
-#  define ILL_ILLOPN	ILL_ILLOPN
-  ILL_ILLADR,			/* Illegal addressing mode.  */
-#  define ILL_ILLADR	ILL_ILLADR
-  ILL_ILLTRP,			/* Illegal trap. */
-#  define ILL_ILLTRP	ILL_ILLTRP
-  ILL_PRVOPC,			/* Privileged opcode.  */
-#  define ILL_PRVOPC	ILL_PRVOPC
-  ILL_PRVREG,			/* Privileged register.  */
-#  define ILL_PRVREG	ILL_PRVREG
-  ILL_COPROC,			/* Coprocessor error.  */
-#  define ILL_COPROC	ILL_COPROC
-  ILL_BADSTK,			/* Internal stack error.  */
-#  define ILL_BADSTK	ILL_BADSTK
-  ILL_BADIADDR			/* Unimplemented instruction address. */
-#  define ILL_BADIADDR	ILL_BADIADDR
-
-#  ifdef __USE_GNU
-   , ILL_BREAK
-#   define ILL_BREAK	ILL_BREAK
-#  endif
-};
-
-/* `si_code' values for SIGFPE signal.  */
-enum
-{
-  FPE_INTDIV = 1,		/* Integer divide by zero.  */
-#  define FPE_INTDIV	FPE_INTDIV
-  FPE_INTOVF,			/* Integer overflow.  */
-#  define FPE_INTOVF	FPE_INTOVF
-  FPE_FLTDIV,			/* Floating point divide by zero.  */
-#  define FPE_FLTDIV	FPE_FLTDIV
-  FPE_FLTOVF,			/* Floating point overflow.  */
-#  define FPE_FLTOVF	FPE_FLTOVF
-  FPE_FLTUND,			/* Floating point underflow.  */
-#  define FPE_FLTUND	FPE_FLTUND
-  FPE_FLTRES,			/* Floating point inexact result.  */
-#  define FPE_FLTRES	FPE_FLTRES
-  FPE_FLTINV,			/* Floating point invalid operation.  */
-#  define FPE_FLTINV	FPE_FLTINV
-  FPE_FLTSUB			/* Subscript out of range.  */
-#  define FPE_FLTSUB	FPE_FLTSUB
-#  ifdef __USE_GNU
-   , FPE_DECOVF
-#   define FPE_DECOVF	FPE_DECOVF
-   , FPE_DECDIV
-#   define FPE_DECDIV	FPE_DECDIV
-   , FPE_DECERR
-#   define FPE_DECERR	FPE_DECERR
-   , FPE_INVASC
-#   define FPE_INVASC	FPE_INVASC
-   , FPE_INVDEC
-#   define FPE_INVDEC	FPE_INVDEC
-#  endif
-};
-
-/* `si_code' values for SIGSEGV signal.  */
-enum
-{
-  SEGV_MAPERR = 1,		/* Address not mapped to object.  */
-#  define SEGV_MAPERR	SEGV_MAPERR
-  SEGV_ACCERR			/* Invalid permissions for mapped object.  */
-#  define SEGV_ACCERR	SEGV_ACCERR
-#  ifdef __USE_GNU
-  , SEGV_PSTKOVF		/* Paragraph stack overflow. */
-#   define SEGV_PSTKOVF	SEGV_PSTKOVF
-#  endif
-};
-
-/* `si_code' values for SIGBUS signal.  */
-enum
-{
-  BUS_ADRALN = 1,		/* Invalid address alignment.  */
-#  define BUS_ADRALN	BUS_ADRALN
-  BUS_ADRERR,			/* Non-existant physical address.  */
-#  define BUS_ADRERR	BUS_ADRERR
-  BUS_OBJERR,			/* Object specific hardware error.  */
-#  define BUS_OBJERR	BUS_OBJERR
-  BUS_MCEERR_AR,		/* Hardware memory error: action required.  */
-#  define BUS_MCEERR_AR	BUS_MCEERR_AR
-  BUS_MCEERR_AO			/* Hardware memory error: action optional.  */
-#  define BUS_MCEERR_AO	BUS_MCEERR_AO
-};
-# endif
-
-# ifdef __USE_XOPEN_EXTENDED
-/* `si_code' values for SIGTRAP signal.  */
-enum
-{
-  TRAP_BRKPT = 1,		/* Process breakpoint.  */
-#  define TRAP_BRKPT	TRAP_BRKPT
-  TRAP_TRACE			/* Process trace trap.  */
-#  define TRAP_TRACE	TRAP_TRACE
-
-#  ifdef __USE_GNU
-  , TRAP_BRANCH
-#   define TRAP_BRANCH	TRAP_BRANCH
-  , TRAP_HWBKPT
-#   define TRAP_HWBKPT	TRAP_HWBKPT
-#  endif
-};
-# endif
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGCHLD signal.  */
-enum
-{
-  CLD_EXITED = 1,		/* Child has exited.  */
-#  define CLD_EXITED	CLD_EXITED
-  CLD_KILLED,			/* Child was killed.  */
-#  define CLD_KILLED	CLD_KILLED
-  CLD_DUMPED,			/* Child terminated abnormally.  */
-#  define CLD_DUMPED	CLD_DUMPED
-  CLD_TRAPPED,			/* Traced child has trapped.  */
-#  define CLD_TRAPPED	CLD_TRAPPED
-  CLD_STOPPED,			/* Child has stopped.  */
-#  define CLD_STOPPED	CLD_STOPPED
-  CLD_CONTINUED			/* Stopped child has continued.  */
-#  define CLD_CONTINUED	CLD_CONTINUED
-};
-
-/* `si_code' values for SIGPOLL signal.  */
-enum
-{
-  POLL_IN = 1,			/* Data input available.  */
-#  define POLL_IN	POLL_IN
-  POLL_OUT,			/* Output buffers available.  */
-#  define POLL_OUT	POLL_OUT
-  POLL_MSG,			/* Input message available.   */
-#  define POLL_MSG	POLL_MSG
-  POLL_ERR,			/* I/O error.  */
-#  define POLL_ERR	POLL_ERR
-  POLL_PRI,			/* High priority input available.  */
-#  define POLL_PRI	POLL_PRI
-  POLL_HUP			/* Device disconnected.  */
-#  define POLL_HUP	POLL_HUP
-};
-# endif
-
-# undef __need_siginfo_t
-#endif	/* !have siginfo_t && (have _SIGNAL_H || need siginfo_t).  */
-
-
-#if (defined _SIGNAL_H || defined __need_sigevent_t) \
-    && !defined __have_sigevent_t
-# define __have_sigevent_t	1
-
-/* Structure to transport application-defined values with signals.  */
-# define __SIGEV_MAX_SIZE	64
-# define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 4)
-
-/* Forward declaration.  */
-# ifndef __have_pthread_attr_t
-typedef union pthread_attr_t pthread_attr_t;
-#  define __have_pthread_attr_t	1
-# endif
-
-typedef struct sigevent
-  {
-    sigval_t sigev_value;
-    int sigev_signo;
-    int sigev_notify;
-
-    union
-      {
-	int _pad[__SIGEV_PAD_SIZE];
-
-	/* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
-	   thread to receive the signal.  */
-	__pid_t _tid;
-
-	struct
-	  {
-	    void (*_function) (sigval_t);	/* Function to start.  */
-	    pthread_attr_t *_attribute;		/* Thread attributes.  */
-	  } _sigev_thread;
-      } _sigev_un;
-  } sigevent_t;
-
-/* POSIX names to access some of the members.  */
-# define sigev_notify_function   _sigev_un._sigev_thread._function
-# define sigev_notify_attributes _sigev_un._sigev_thread._attribute
-
-/* `sigev_notify' values.  */
-enum
-{
-  SIGEV_SIGNAL = 0,		/* Notify via signal.  */
-# define SIGEV_SIGNAL	SIGEV_SIGNAL
-  SIGEV_NONE,			/* Other notification: meaningless.  */
-# define SIGEV_NONE	SIGEV_NONE
-  SIGEV_THREAD,			/* Deliver via thread creation.  */
-# define SIGEV_THREAD	SIGEV_THREAD
-
-  SIGEV_THREAD_ID = 4		/* Send signal to specific thread.  */
-#define SIGEV_THREAD_ID	SIGEV_THREAD_ID
-};
-
-#endif	/* have _SIGNAL_H.  */
diff --git a/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h b/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h
index 18ff02233f..62dd96e9f2 100644
--- a/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h
@@ -25,6 +25,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h b/sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h
new file mode 100644
index 0000000000..4292d7c9cd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h
@@ -0,0 +1,15 @@
+/* Architecture-specific adjustments to siginfo_t.  MIPS version.  */
+#ifndef _BITS_SIGINFO_ARCH_H
+#define _BITS_SIGINFO_ARCH_H 1
+
+/* MIPS has the si_code and si_errno fields in the opposite order from
+   all other architectures.  */
+#undef __SI_ERRNO_THEN_CODE
+#define __SI_ERRNO_THEN_CODE 0
+
+/* MIPS also has different values for SI_ASYNCIO, SI_MESGQ, and SI_TIMER
+   than all other architectures.  */
+#undef __SI_ASYNCIO_AFTER_SIGIO
+#define __SI_ASYNCIO_AFTER_SIGIO 0
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/mips/bits/siginfo.h b/sysdeps/unix/sysv/linux/mips/bits/siginfo.h
deleted file mode 100644
index 8d3f1dfdb6..0000000000
--- a/sysdeps/unix/sysv/linux/mips/bits/siginfo.h
+++ /dev/null
@@ -1,344 +0,0 @@
-/* siginfo_t, sigevent and constants.  Linux/MIPS version.
-   Copyright (C) 1997-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#if !defined _SIGNAL_H && !defined __need_siginfo_t \
-    && !defined __need_sigevent_t
-# error "Never include this file directly.  Use <signal.h> instead"
-#endif
-
-#include <bits/wordsize.h>
-
-#if (!defined __have_sigval_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t \
-	 || defined __need_sigevent_t))
-# define __have_sigval_t	1
-
-/* Type for data associated with a signal.  */
-typedef union sigval
-  {
-    int sival_int;
-    void *sival_ptr;
-  } sigval_t;
-#endif
-
-#if (!defined __have_siginfo_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t))
-# define __have_siginfo_t	1
-
-# define __SI_MAX_SIZE		128
-# if __WORDSIZE == 64
-#  define __SI_PAD_SIZE		((__SI_MAX_SIZE / sizeof (int)) - 4)
-# else
-#  define __SI_PAD_SIZE		((__SI_MAX_SIZE / sizeof (int)) - 3)
-# endif
-
-
-typedef struct
-  {
-    int si_signo;		/* Signal number.  */
-    int si_code;		/* Signal code.  */
-    int si_errno;		/* If non-zero, an errno value associated with
-				   this signal, as defined in <errno.h>.  */
-    int __pad0[__SI_MAX_SIZE / sizeof (int) - __SI_PAD_SIZE - 3];
-				/* Explicit padding.  */
-
-    union
-      {
-	int _pad[__SI_PAD_SIZE];
-
-	 /* kill().  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	  } _kill;
-
-	/* POSIX.1b timers.  */
-	struct
-	  {
-	    int si_tid;		/* Timer ID.  */
-	    int si_overrun;	/* Overrun count.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _timer;
-
-	/* POSIX.1b signals.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _rt;
-
-	/* SIGCHLD.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Which child.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    int si_status;	/* Exit value or signal.  */
-	    __clock_t si_utime;
-	    __clock_t si_stime;
-	  } _sigchld;
-
-	/* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
-	struct
-	  {
-	    void *si_addr;	/* Faulting insn/memory ref.  */
-	    short int si_addr_lsb;	/* Valid LSB of the reported address.  */
-	  } _sigfault;
-
-	/* SIGPOLL.  */
-	struct
-	  {
-	    long int si_band;	/* Band event for SIGPOLL.  */
-	    int si_fd;
-	  } _sigpoll;
-
-	/* SIGSYS.  */
-	struct
-	  {
-	    void *_call_addr;	/* Calling user insn.  */
-	    int _syscall;	/* Triggering system call number.  */
-	    unsigned int _arch; /* AUDIT_ARCH_* of syscall.  */
-	  } _sigsys;
-      } _sifields;
-  } siginfo_t;
-
-
-/* X/Open requires some more fields with fixed names.  */
-# define si_pid		_sifields._kill.si_pid
-# define si_uid		_sifields._kill.si_uid
-# define si_timerid	_sifields._timer.si_tid
-# define si_overrun	_sifields._timer.si_overrun
-# define si_status	_sifields._sigchld.si_status
-# define si_utime	_sifields._sigchld.si_utime
-# define si_stime	_sifields._sigchld.si_stime
-# define si_value	_sifields._rt.si_sigval
-# define si_int		_sifields._rt.si_sigval.sival_int
-# define si_ptr		_sifields._rt.si_sigval.sival_ptr
-# define si_addr	_sifields._sigfault.si_addr
-# define si_addr_lsb	_sifields._sigfault.si_addr_lsb
-# define si_band	_sifields._sigpoll.si_band
-# define si_fd		_sifields._sigpoll.si_fd
-# define si_call_addr 	_sifields._sigsys._call_addr
-# define si_syscall	_sifields._sigsys._syscall
-# define si_arch	_sifields._sigsys._arch
-
-
-/* Values for `si_code'.  Positive values are reserved for kernel-generated
-   signals.  */
-enum
-{
-  SI_ASYNCNL = -60,		/* Sent by asynch name lookup completion.  */
-# define SI_ASYNCNL	SI_ASYNCNL
-  SI_TKILL = -6,		/* Sent by tkill.  */
-# define SI_TKILL	SI_TKILL
-  SI_SIGIO,			/* Sent by queued SIGIO.  */
-# define SI_SIGIO	SI_SIGIO
-  SI_MESGQ,			/* Sent by real time mesq state change.  */
-# define SI_MESGQ	SI_MESGQ
-  SI_TIMER,			/* Sent by real time mesq state change.  */
-# define SI_TIMER	SI_TIMER
-  SI_ASYNCIO,			/* Sent by AIO completion.  */
-# define SI_ASYNCIO	SI_ASYNCIO
-  SI_QUEUE,			/* Sent by sigqueue.  */
-# define SI_QUEUE	SI_QUEUE
-  SI_USER,			/* Sent by kill, sigsend.  */
-# define SI_USER	SI_USER
-  SI_KERNEL = 0x80		/* Send by kernel.  */
-#define SI_KERNEL	SI_KERNEL
-};
-
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGILL signal.  */
-enum
-{
-  ILL_ILLOPC = 1,		/* Illegal opcode.  */
-#  define ILL_ILLOPC	ILL_ILLOPC
-  ILL_ILLOPN,			/* Illegal operand.  */
-#  define ILL_ILLOPN	ILL_ILLOPN
-  ILL_ILLADR,			/* Illegal addressing mode.  */
-#  define ILL_ILLADR	ILL_ILLADR
-  ILL_ILLTRP,			/* Illegal trap.  */
-#  define ILL_ILLTRP	ILL_ILLTRP
-  ILL_PRVOPC,			/* Privileged opcode.  */
-#  define ILL_PRVOPC	ILL_PRVOPC
-  ILL_PRVREG,			/* Privileged register.  */
-#  define ILL_PRVREG	ILL_PRVREG
-  ILL_COPROC,			/* Coprocessor error.  */
-#  define ILL_COPROC	ILL_COPROC
-  ILL_BADSTK			/* Internal stack error.  */
-#  define ILL_BADSTK	ILL_BADSTK
-};
-
-/* `si_code' values for SIGFPE signal.  */
-enum
-{
-  FPE_INTDIV = 1,		/* Integer divide by zero.  */
-#  define FPE_INTDIV	FPE_INTDIV
-  FPE_INTOVF,			/* Integer overflow.  */
-#  define FPE_INTOVF	FPE_INTOVF
-  FPE_FLTDIV,			/* Floating point divide by zero.  */
-#  define FPE_FLTDIV	FPE_FLTDIV
-  FPE_FLTOVF,			/* Floating point overflow.  */
-#  define FPE_FLTOVF	FPE_FLTOVF
-  FPE_FLTUND,			/* Floating point underflow.  */
-#  define FPE_FLTUND	FPE_FLTUND
-  FPE_FLTRES,			/* Floating point inexact result.  */
-#  define FPE_FLTRES	FPE_FLTRES
-  FPE_FLTINV,			/* Floating point invalid operation.  */
-#  define FPE_FLTINV	FPE_FLTINV
-  FPE_FLTSUB			/* Subscript out of range.  */
-#  define FPE_FLTSUB	FPE_FLTSUB
-};
-
-/* `si_code' values for SIGSEGV signal.  */
-enum
-{
-  SEGV_MAPERR = 1,		/* Address not mapped to object.  */
-#  define SEGV_MAPERR	SEGV_MAPERR
-  SEGV_ACCERR			/* Invalid permissions for mapped object.  */
-#  define SEGV_ACCERR	SEGV_ACCERR
-};
-
-/* `si_code' values for SIGBUS signal.  */
-enum
-{
-  BUS_ADRALN = 1,		/* Invalid address alignment.  */
-#  define BUS_ADRALN	BUS_ADRALN
-  BUS_ADRERR,			/* Non-existant physical address.  */
-#  define BUS_ADRERR	BUS_ADRERR
-  BUS_OBJERR,			/* Object specific hardware error.  */
-#  define BUS_OBJERR	BUS_OBJERR
-  BUS_MCEERR_AR,		/* Hardware memory error: action required.  */
-#  define BUS_MCEERR_AR	BUS_MCEERR_AR
-  BUS_MCEERR_AO			/* Hardware memory error: action optional.  */
-#  define BUS_MCEERR_AO	BUS_MCEERR_AO
-};
-# endif
-
-# ifdef __USE_XOPEN_EXTENDED
-/* `si_code' values for SIGTRAP signal.  */
-enum
-{
-  TRAP_BRKPT = 1,		/* Process breakpoint.  */
-#  define TRAP_BRKPT	TRAP_BRKPT
-  TRAP_TRACE			/* Process trace trap.  */
-#  define TRAP_TRACE	TRAP_TRACE
-};
-# endif
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGCHLD signal.  */
-enum
-{
-  CLD_EXITED = 1,		/* Child has exited.  */
-#  define CLD_EXITED	CLD_EXITED
-  CLD_KILLED,			/* Child was killed.  */
-#  define CLD_KILLED	CLD_KILLED
-  CLD_DUMPED,			/* Child terminated abnormally.  */
-#  define CLD_DUMPED	CLD_DUMPED
-  CLD_TRAPPED,			/* Traced child has trapped.  */
-#  define CLD_TRAPPED	CLD_TRAPPED
-  CLD_STOPPED,			/* Child has stopped.  */
-#  define CLD_STOPPED	CLD_STOPPED
-  CLD_CONTINUED			/* Stopped child has continued.  */
-#  define CLD_CONTINUED	CLD_CONTINUED
-};
-
-/* `si_code' values for SIGPOLL signal.  */
-enum
-{
-  POLL_IN = 1,			/* Data input available.  */
-#  define POLL_IN	POLL_IN
-  POLL_OUT,			/* Output buffers available.  */
-#  define POLL_OUT	POLL_OUT
-  POLL_MSG,			/* Input message available.   */
-#  define POLL_MSG	POLL_MSG
-  POLL_ERR,			/* I/O error.  */
-#  define POLL_ERR	POLL_ERR
-  POLL_PRI,			/* High priority input available.  */
-#  define POLL_PRI	POLL_PRI
-  POLL_HUP			/* Device disconnected.  */
-#  define POLL_HUP	POLL_HUP
-};
-# endif
-
-# undef __need_siginfo_t
-#endif	/* !have siginfo_t && (have _SIGNAL_H || need siginfo_t).  */
-
-
-#if (defined _SIGNAL_H || defined __need_sigevent_t) \
-    && !defined __have_sigevent_t
-# define __have_sigevent_t	1
-
-/* Structure to transport application-defined values with signals.  */
-# define __SIGEV_MAX_SIZE	64
-# if __WORDSIZE == 64
-#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 4)
-# else
-#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 3)
-# endif
-
-/* Forward declaration.  */
-# ifndef __have_pthread_attr_t
-typedef union pthread_attr_t pthread_attr_t;
-#  define __have_pthread_attr_t	1
-# endif
-
-typedef struct sigevent
-  {
-    sigval_t sigev_value;
-    int sigev_signo;
-    int sigev_notify;
-
-    union
-      {
-	int _pad[__SIGEV_PAD_SIZE];
-
-	/* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
-	   thread to receive the signal.  */
-	__pid_t _tid;
-
-	struct
-	  {
-	    void (*_function) (sigval_t);	/* Function to start.  */
-	    pthread_attr_t *_attribute;		/* Thread attributes.  */
-	  } _sigev_thread;
-      } _sigev_un;
-  } sigevent_t;
-
-/* POSIX names to access some of the members.  */
-# define sigev_notify_function   _sigev_un._sigev_thread._function
-# define sigev_notify_attributes _sigev_un._sigev_thread._attribute
-
-/* `sigev_notify' values.  */
-enum
-{
-  SIGEV_SIGNAL = 0,		/* Notify via signal.  */
-# define SIGEV_SIGNAL	SIGEV_SIGNAL
-  SIGEV_NONE,			/* Other notification: meaningless.  */
-# define SIGEV_NONE	SIGEV_NONE
-  SIGEV_THREAD,			/* Deliver via thread creation.  */
-# define SIGEV_THREAD	SIGEV_THREAD
-
-  SIGEV_THREAD_ID = 4		/* Send signal to specific thread.  */
-#define SIGEV_THREAD_ID	SIGEV_THREAD_ID
-};
-
-#endif	/* have _SIGNAL_H.  */
diff --git a/sysdeps/unix/sysv/linux/mips/sys/ucontext.h b/sysdeps/unix/sysv/linux/mips/sys/ucontext.h
index f933780dbe..06b45a8726 100644
--- a/sysdeps/unix/sysv/linux/mips/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/mips/sys/ucontext.h
@@ -24,6 +24,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h b/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
index c961e5be40..7099b458d4 100644
--- a/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
@@ -26,6 +26,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/unix/sysv/linux/nptl-signals.h b/sysdeps/unix/sysv/linux/nptl-signals.h
index 43aa1a9390..f30c597c0e 100644
--- a/sysdeps/unix/sysv/linux/nptl-signals.h
+++ b/sysdeps/unix/sysv/linux/nptl-signals.h
@@ -17,6 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <signal.h>
+#include <sigsetops.h>
 
 /* The signal used for asynchronous cancelation.  */
 #define SIGCANCEL       __SIGRTMIN
diff --git a/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h b/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
index d9fad4cf8b..d91a5ac59f 100644
--- a/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
@@ -19,13 +19,12 @@
 #define _SYS_UCONTEXT_H	1
 
 #include <features.h>
-#define __need_sigset_t
-#include <signal.h>
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
+#include <bits/types/sigset_t.h>
 #include <bits/types/struct_sigstack.h>
 #include <bits/types/stack_t.h>
 #include <bits/ss_flags.h>
diff --git a/sysdeps/unix/sysv/linux/s390/bits/siginfo.h b/sysdeps/unix/sysv/linux/s390/bits/siginfo.h
deleted file mode 100644
index b32b9ebd6e..0000000000
--- a/sysdeps/unix/sysv/linux/s390/bits/siginfo.h
+++ /dev/null
@@ -1,341 +0,0 @@
-/* siginfo_t, sigevent and constants.  S/390 version.
-   Copyright (C) 2001-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#if !defined _SIGNAL_H && !defined __need_siginfo_t \
-    && !defined __need_sigevent_t
-# error "Never include this file directly.  Use <signal.h> instead"
-#endif
-
-#include <bits/wordsize.h>
-
-#if (!defined __have_sigval_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t \
-	 || defined __need_sigevent_t))
-# define __have_sigval_t	1
-
-/* Type for data associated with a signal.  */
-typedef union sigval
-  {
-    int sival_int;
-    void *sival_ptr;
-  } sigval_t;
-#endif
-
-#if (!defined __have_siginfo_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t))
-# define __have_siginfo_t	1
-
-# define __SI_MAX_SIZE	   128
-# if __WORDSIZE == 64
-#  define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 4)
-# else
-#  define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 3)
-# endif
-
-typedef struct
-  {
-    int si_signo;		/* Signal number.  */
-    int si_errno;		/* If non-zero, an errno value associated with
-				   this signal, as defined in <errno.h>.  */
-    int si_code;		/* Signal code.	 */
-
-    union
-      {
-	int _pad[__SI_PAD_SIZE];
-
-	 /* kill().  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.	*/
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	  } _kill;
-
-	/* POSIX.1b timers.  */
-	struct
-	  {
-	    int si_tid;		/* Timer ID.  */
-	    int si_overrun;	/* Overrun count.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _timer;
-
-	/* POSIX.1b signals.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.	*/
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _rt;
-
-	/* SIGCHLD.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Which child.	 */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    int si_status;	/* Exit value or signal.  */
-	    __clock_t si_utime;
-	    __clock_t si_stime;
-	  } _sigchld;
-
-	/* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
-	struct
-	  {
-	    void *si_addr;	/* Faulting insn/memory ref.  */
-	    short si_addr_lsb;	/* Valid LSB of the reported address.  */
-	  } _sigfault;
-
-	/* SIGPOLL.  */
-	struct
-	  {
-	    long int si_band;	/* Band event for SIGPOLL.  */
-	    int si_fd;
-	  } _sigpoll;
-
-	/* SIGSYS.  */
-	struct
-	  {
-	    void *_call_addr;	/* Calling user insn.  */
-	    int _syscall;	/* Triggering system call number.  */
-	    unsigned int _arch; /* AUDIT_ARCH_* of syscall.  */
-	  } _sigsys;
-      } _sifields;
-  } siginfo_t;
-
-
-/* X/Open requires some more fields with fixed names.  */
-# define si_pid		_sifields._kill.si_pid
-# define si_uid		_sifields._kill.si_uid
-# define si_timerid	_sifields._timer.si_tid
-# define si_overrun	_sifields._timer.si_overrun
-# define si_status	_sifields._sigchld.si_status
-# define si_utime	_sifields._sigchld.si_utime
-# define si_stime	_sifields._sigchld.si_stime
-# define si_value	_sifields._rt.si_sigval
-# define si_int		_sifields._rt.si_sigval.sival_int
-# define si_ptr		_sifields._rt.si_sigval.sival_ptr
-# define si_addr	_sifields._sigfault.si_addr
-# define si_addr_lsb	_sifields._sigfault.si_addr_lsb
-# define si_band	_sifields._sigpoll.si_band
-# define si_fd		_sifields._sigpoll.si_fd
-# define si_call_addr 	_sifields._sigsys._call_addr
-# define si_syscall	_sifields._sigsys._syscall
-# define si_arch	_sifields._sigsys._arch
-
-
-/* Values for `si_code'.  Positive values are reserved for kernel-generated
-   signals.  */
-enum
-{
-  SI_ASYNCNL = -60,		/* Sent by asynch name lookup completion.  */
-# define SI_ASYNCNL	SI_ASYNCNL
-  SI_TKILL = -6,		/* Sent by tkill.  */
-# define SI_TKILL	SI_TKILL
-  SI_SIGIO,			/* Sent by queued SIGIO. */
-# define SI_SIGIO	SI_SIGIO
-  SI_ASYNCIO,			/* Sent by AIO completion.  */
-# define SI_ASYNCIO	SI_ASYNCIO
-  SI_MESGQ,			/* Sent by real time mesq state change.	 */
-# define SI_MESGQ	SI_MESGQ
-  SI_TIMER,			/* Sent by timer expiration.  */
-# define SI_TIMER	SI_TIMER
-  SI_QUEUE,			/* Sent by sigqueue.  */
-# define SI_QUEUE	SI_QUEUE
-  SI_USER,			/* Sent by kill, sigsend.  */
-# define SI_USER	SI_USER
-  SI_KERNEL = 0x80		/* Send by kernel.  */
-#define SI_KERNEL	SI_KERNEL
-};
-
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGILL signal.	*/
-enum
-{
-  ILL_ILLOPC = 1,		/* Illegal opcode.  */
-#  define ILL_ILLOPC	ILL_ILLOPC
-  ILL_ILLOPN,			/* Illegal operand.  */
-#  define ILL_ILLOPN	ILL_ILLOPN
-  ILL_ILLADR,			/* Illegal addressing mode.  */
-#  define ILL_ILLADR	ILL_ILLADR
-  ILL_ILLTRP,			/* Illegal trap. */
-#  define ILL_ILLTRP	ILL_ILLTRP
-  ILL_PRVOPC,			/* Privileged opcode.  */
-#  define ILL_PRVOPC	ILL_PRVOPC
-  ILL_PRVREG,			/* Privileged register.	 */
-#  define ILL_PRVREG	ILL_PRVREG
-  ILL_COPROC,			/* Coprocessor error.  */
-#  define ILL_COPROC	ILL_COPROC
-  ILL_BADSTK			/* Internal stack error.  */
-#  define ILL_BADSTK	ILL_BADSTK
-};
-
-/* `si_code' values for SIGFPE signal.	*/
-enum
-{
-  FPE_INTDIV = 1,		/* Integer divide by zero.  */
-#  define FPE_INTDIV	FPE_INTDIV
-  FPE_INTOVF,			/* Integer overflow.  */
-#  define FPE_INTOVF	FPE_INTOVF
-  FPE_FLTDIV,			/* Floating point divide by zero.  */
-#  define FPE_FLTDIV	FPE_FLTDIV
-  FPE_FLTOVF,			/* Floating point overflow.  */
-#  define FPE_FLTOVF	FPE_FLTOVF
-  FPE_FLTUND,			/* Floating point underflow.  */
-#  define FPE_FLTUND	FPE_FLTUND
-  FPE_FLTRES,			/* Floating point inexact result.  */
-#  define FPE_FLTRES	FPE_FLTRES
-  FPE_FLTINV,			/* Floating point invalid operation.  */
-#  define FPE_FLTINV	FPE_FLTINV
-  FPE_FLTSUB			/* Subscript out of range.  */
-#  define FPE_FLTSUB	FPE_FLTSUB
-};
-
-/* `si_code' values for SIGSEGV signal.	 */
-enum
-{
-  SEGV_MAPERR = 1,		/* Address not mapped to object.  */
-#  define SEGV_MAPERR	SEGV_MAPERR
-  SEGV_ACCERR			/* Invalid permissions for mapped object.  */
-#  define SEGV_ACCERR	SEGV_ACCERR
-};
-
-/* `si_code' values for SIGBUS signal.	*/
-enum
-{
-  BUS_ADRALN = 1,		/* Invalid address alignment.  */
-#  define BUS_ADRALN	BUS_ADRALN
-  BUS_ADRERR,			/* Non-existant physical address.  */
-#  define BUS_ADRERR	BUS_ADRERR
-  BUS_OBJERR,			/* Object specific hardware error.  */
-#  define BUS_OBJERR	BUS_OBJERR
-  BUS_MCEERR_AR,		/* Hardware memory error: action required.  */
-#  define BUS_MCEERR_AR	BUS_MCEERR_AR
-  BUS_MCEERR_AO			/* Hardware memory error: action optional.  */
-#  define BUS_MCEERR_AO	BUS_MCEERR_AO
-};
-# endif
-
-# ifdef __USE_XOPEN_EXTENDED
-/* `si_code' values for SIGTRAP signal.	 */
-enum
-{
-  TRAP_BRKPT = 1,		/* Process breakpoint.	*/
-#  define TRAP_BRKPT	TRAP_BRKPT
-  TRAP_TRACE			/* Process trace trap.	*/
-#  define TRAP_TRACE	TRAP_TRACE
-};
-# endif
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGCHLD signal.	 */
-enum
-{
-  CLD_EXITED = 1,		/* Child has exited.  */
-#  define CLD_EXITED	CLD_EXITED
-  CLD_KILLED,			/* Child was killed.  */
-#  define CLD_KILLED	CLD_KILLED
-  CLD_DUMPED,			/* Child terminated abnormally.	 */
-#  define CLD_DUMPED	CLD_DUMPED
-  CLD_TRAPPED,			/* Traced child has trapped.  */
-#  define CLD_TRAPPED	CLD_TRAPPED
-  CLD_STOPPED,			/* Child has stopped.  */
-#  define CLD_STOPPED	CLD_STOPPED
-  CLD_CONTINUED			/* Stopped child has continued.	 */
-#  define CLD_CONTINUED	CLD_CONTINUED
-};
-
-/* `si_code' values for SIGPOLL signal.	 */
-enum
-{
-  POLL_IN = 1,			/* Data input available.  */
-#  define POLL_IN	POLL_IN
-  POLL_OUT,			/* Output buffers available.  */
-#  define POLL_OUT	POLL_OUT
-  POLL_MSG,			/* Input message available.   */
-#  define POLL_MSG	POLL_MSG
-  POLL_ERR,			/* I/O error.  */
-#  define POLL_ERR	POLL_ERR
-  POLL_PRI,			/* High priority input available.  */
-#  define POLL_PRI	POLL_PRI
-  POLL_HUP			/* Device disconnected.	 */
-#  define POLL_HUP	POLL_HUP
-};
-# endif
-
-# undef __need_siginfo_t
-#endif	/* !have siginfo_t && (have _SIGNAL_H || need siginfo_t).  */
-
-
-#if (defined _SIGNAL_H || defined __need_sigevent_t) \
-    && !defined __have_sigevent_t
-# define __have_sigevent_t	1
-
-/* Structure to transport application-defined values with signals.  */
-# define __SIGEV_MAX_SIZE	64
-# if __WORDSIZE == 64
-#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 4)
-# else
-#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 3)
-# endif
-
-/* Forward declaration.  */
-# ifndef __have_pthread_attr_t
-typedef union pthread_attr_t pthread_attr_t;
-#  define __have_pthread_attr_t	1
-# endif
-
-typedef struct sigevent
-  {
-    sigval_t sigev_value;
-    int sigev_signo;
-    int sigev_notify;
-
-    union
-      {
-	int _pad[__SIGEV_PAD_SIZE];
-
-	/* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
-	   thread to receive the signal.  */
-	__pid_t _tid;
-
-	struct
-	  {
-	    void (*_function) (sigval_t);	/* Function to start.	 */
-	    pthread_attr_t *_attribute;		/* Thread attributes.  */
-	  } _sigev_thread;
-      } _sigev_un;
-  } sigevent_t;
-
-/* POSIX names to access some of the members.  */
-# define sigev_notify_function	 _sigev_un._sigev_thread._function
-# define sigev_notify_attributes _sigev_un._sigev_thread._attribute
-
-/* `sigev_notify' values.  */
-enum
-{
-  SIGEV_SIGNAL = 0,		/* Notify via signal.  */
-# define SIGEV_SIGNAL	SIGEV_SIGNAL
-  SIGEV_NONE,			/* Other notification: meaningless.  */
-# define SIGEV_NONE	SIGEV_NONE
-  SIGEV_THREAD,			/* Deliver via thread creation.	 */
-# define SIGEV_THREAD	SIGEV_THREAD
-
-  SIGEV_THREAD_ID = 4		/* Send signal to specific thread.  */
-#define SIGEV_THREAD_ID	SIGEV_THREAD_ID
-};
-
-#endif	/* have _SIGNAL_H.  */
diff --git a/sysdeps/unix/sysv/linux/s390/sys/ucontext.h b/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
index 955a8fef9c..fcbd48ddad 100644
--- a/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
@@ -24,6 +24,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by in <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h b/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
index 3ce381d2c6..cefb918831 100644
--- a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
@@ -25,6 +25,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/unix/sysv/linux/sigsetops.h b/sysdeps/unix/sysv/linux/sigsetops.h
new file mode 100644
index 0000000000..05a605ff3f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sigsetops.h
@@ -0,0 +1,108 @@
+/* __sigset_t manipulators.  Linux version.
+   Copyright (C) 1991-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SIGSETOPS_H
+#define _SIGSETOPS_H 1
+
+#include <signal.h>
+
+/* Return a mask that includes the bit for SIG only.  */
+# define __sigmask(sig) \
+  (((unsigned long int) 1) << (((sig) - 1) % (8 * sizeof (unsigned long int))))
+
+/* Return the word index for SIG.  */
+# define __sigword(sig) (((sig) - 1) / (8 * sizeof (unsigned long int)))
+
+# define __sigemptyset(set)					\
+  (__extension__ ({						\
+    int __cnt = _SIGSET_NWORDS;					\
+    sigset_t *__set = (set);					\
+    while (--__cnt >= 0)					\
+      __set->__val[__cnt] = 0;					\
+    (void)0;							\
+  }))
+
+# define __sigfillset(set)					\
+  (__extension__ ({						\
+    int __cnt = _SIGSET_NWORDS;					\
+    sigset_t *__set = (set);					\
+    while (--__cnt >= 0)					\
+      __set->__val[__cnt] = ~0UL;				\
+    (void)0;							\
+  }))
+
+# define __sigisemptyset(set)					\
+  (__extension__ ({						\
+    int __cnt = _SIGSET_NWORDS;					\
+    const sigset_t *__set = (set);				\
+    int __ret = __set->__val[--__cnt];				\
+    while (!__ret && --__cnt >= 0)				\
+      __ret = __set->__val[__cnt];				\
+    __ret == 0;							\
+  }))
+
+# define __sigandset(dest, left, right)				\
+  (__extension__ ({						\
+    int __cnt = _SIGSET_NWORDS;					\
+    sigset_t *__dest = (dest);					\
+    const sigset_t *__left = (left);				\
+    const sigset_t *__right = (right);				\
+    while (--__cnt >= 0)					\
+      __dest->__val[__cnt] = (__left->__val[__cnt]		\
+			      & __right->__val[__cnt]);		\
+    (void)0;							\
+  }))
+
+# define __sigorset(dest, left, right)				\
+  (__extension__ ({						\
+    int __cnt = _SIGSET_NWORDS;					\
+    sigset_t *__dest = (dest);					\
+    const sigset_t *__left = (left);				\
+    const sigset_t *__right = (right);				\
+    while (--__cnt >= 0)					\
+      __dest->__val[__cnt] = (__left->__val[__cnt]		\
+			      | __right->__val[__cnt]);		\
+    (void)0;							\
+  }))
+
+/* These macros needn't check for a bogus signal number;
+   error checking is done in the non-__ versions.  */
+# define __sigismember(set, sig)				\
+  (__extension__ ({						\
+    unsigned long int __mask = __sigmask (sig);			\
+    unsigned long int __word = __sigword (sig);			\
+    (set)->__val[__word] & __mask ? 1 : 0;			\
+  }))
+
+# define __sigaddset(set, sig)					\
+  (__extension__ ({						\
+    unsigned long int __mask = __sigmask (sig);			\
+    unsigned long int __word = __sigword (sig);			\
+    (set)->__val[__word] |= __mask;				\
+    (void)0;							\
+  }))
+
+# define __sigdelset(set, sig)					\
+  (__extension__ ({						\
+    unsigned long int __mask = __sigmask (sig);			\
+    unsigned long int __word = __sigword (sig);			\
+    (set)->__val[__word] &= ~__mask;				\
+    (void)0;							\
+ }))
+
+#endif /* bits/sigsetops.h */
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h b/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
new file mode 100644
index 0000000000..92fe30f11e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
@@ -0,0 +1,14 @@
+/* Architecture-specific adjustments to siginfo_t.  SPARC version.  */
+#ifndef _BITS_SIGINFO_ARCH_H
+#define _BITS_SIGINFO_ARCH_H 1
+
+#undef __SI_BAND_TYPE
+#define __SI_BAND_TYPE int
+
+#undef __SI_SIGFAULT_ADDL
+#define __SI_SIGFAULT_ADDL \
+  int _si_trapno;
+
+#define si_trapno	_sifields._sigfault._si_trapno
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/siginfo-consts-arch.h b/sysdeps/unix/sysv/linux/sparc/bits/siginfo-consts-arch.h
new file mode 100644
index 0000000000..721dc9cd43
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/bits/siginfo-consts-arch.h
@@ -0,0 +1,12 @@
+/* Architecture-specific additional siginfo constants.  SPARC version.  */
+#ifndef _BITS_SIGINFO_CONSTS_ARCH_H
+#define _BITS_SIGINFO_CONSTS_ARCH_H 1
+
+/* `si_code' values for SIGEMT signal.  */
+enum
+{
+  EMT_TAGOVF = 1	/* Tag overflow.  */
+#define EMT_TAGOVF	EMT_TAGOVF
+};
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/siginfo.h b/sysdeps/unix/sysv/linux/sparc/bits/siginfo.h
deleted file mode 100644
index 58814164ce..0000000000
--- a/sysdeps/unix/sysv/linux/sparc/bits/siginfo.h
+++ /dev/null
@@ -1,352 +0,0 @@
-/* siginfo_t, sigevent and constants.  Linux/SPARC version.
-   Copyright (C) 1997-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#if !defined _SIGNAL_H && !defined __need_siginfo_t \
-    && !defined __need_sigevent_t
-# error "Never include this file directly.  Use <signal.h> instead"
-#endif
-
-#include <bits/wordsize.h>
-
-#if (!defined __have_sigval_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t \
-	 || defined __need_sigevent_t))
-# define __have_sigval_t	1
-
-/* Type for data associated with a signal.  */
-typedef union sigval
-  {
-    int sival_int;
-    void *sival_ptr;
-  } sigval_t;
-#endif
-
-#if (!defined __have_siginfo_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t))
-# define __have_siginfo_t	1
-
-# define __SI_MAX_SIZE     128
-# if __WORDSIZE == 64
-#  define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 4)
-# else
-#  define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 3)
-# endif
-
-typedef struct
-  {
-    int si_signo;		/* Signal number.  */
-    int si_errno;		/* If non-zero, an errno value associated with
-				   this signal, as defined in <errno.h>.  */
-    int si_code;		/* Signal code.  */
-
-    union
-      {
-	int _pad[__SI_PAD_SIZE];
-
-	 /* kill().  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	  } _kill;
-
-	/* POSIX.1b timers.  */
-	struct
-	  {
-	    int si_tid;		/* Timer ID.  */
-	    int si_overrun;	/* Overrun count.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _timer;
-
-	/* POSIX.1b signals.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _rt;
-
-	/* SIGCHLD.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Which child.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    int si_status;	/* Exit value or signal.  */
-	    __clock_t si_utime;
-	    __clock_t si_stime;
-	  } _sigchld;
-
-	/* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
-	struct
-	  {
-	    void *si_addr;	/* Faulting insn/memory ref.  */
-	    int si_trapno;
-	    short int si_addr_lsb;	/* Valid LSB of the reported address.  */
-	  } _sigfault;
-
-	/* SIGPOLL.  */
-	struct
-	  {
-	    int si_band;	/* Band event for SIGPOLL.  */
-	    int si_fd;
-	  } _sigpoll;
-
-	/* SIGSYS.  */
-	struct
-	  {
-	    void *_call_addr;	/* Calling user insn.  */
-	    int _syscall;	/* Triggering system call number.  */
-	    unsigned int _arch; /* AUDIT_ARCH_* of syscall.  */
-	  } _sigsys;
-      } _sifields;
-  } siginfo_t;
-
-
-/* X/Open requires some more fields with fixed names.  */
-# define si_pid		_sifields._kill.si_pid
-# define si_uid		_sifields._kill.si_uid
-# define si_timerid	_sifields._timer.si_tid
-# define si_overrun	_sifields._timer.si_overrun
-# define si_status	_sifields._sigchld.si_status
-# define si_utime	_sifields._sigchld.si_utime
-# define si_stime	_sifields._sigchld.si_stime
-# define si_value	_sifields._rt.si_sigval
-# define si_int		_sifields._rt.si_sigval.sival_int
-# define si_ptr		_sifields._rt.si_sigval.sival_ptr
-# define si_addr	_sifields._sigfault.si_addr
-# define si_trapno	_sifields._sigfault.si_trapno
-# define si_addr_lsb	_sifields._sigfault.si_addr_lsb
-# define si_band	_sifields._sigpoll.si_band
-# define si_fd		_sifields._sigpoll.si_fd
-# define si_call_addr 	_sifields._sigsys._call_addr
-# define si_syscall	_sifields._sigsys._syscall
-# define si_arch	_sifields._sigsys._arch
-
-
-/* Values for `si_code'.  Positive values are reserved for kernel-generated
-   signals.  */
-enum
-{
-  SI_ASYNCNL = -60,		/* Sent by asynch name lookup completion.  */
-# define SI_ASYNCNL	SI_ASYNCNL
-  SI_TKILL = -6,		/* Sent by tkill.  */
-# define SI_TKILL	SI_TKILL
-  SI_SIGIO,			/* Sent by queued SIGIO. */
-# define SI_SIGIO	SI_SIGIO
-  SI_ASYNCIO,			/* Sent by AIO completion.  */
-# define SI_ASYNCIO	SI_ASYNCIO
-  SI_MESGQ,			/* Sent by real time mesq state change.  */
-# define SI_MESGQ	SI_MESGQ
-  SI_TIMER,			/* Sent by timer expiration.  */
-# define SI_TIMER	SI_TIMER
-  SI_QUEUE,			/* Sent by sigqueue.  */
-# define SI_QUEUE	SI_QUEUE
-  SI_USER,			/* Sent by kill, sigsend.  */
-# define SI_USER	SI_USER
-  SI_KERNEL = 0x80		/* Send by kernel.  */
-#define SI_KERNEL	SI_KERNEL
-};
-
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGILL signal.  */
-enum
-{
-  ILL_ILLOPC = 1,		/* Illegal opcode.  */
-#  define ILL_ILLOPC	ILL_ILLOPC
-  ILL_ILLOPN,			/* Illegal operand.  */
-#  define ILL_ILLOPN	ILL_ILLOPN
-  ILL_ILLADR,			/* Illegal addressing mode.  */
-#  define ILL_ILLADR	ILL_ILLADR
-  ILL_ILLTRP,			/* Illegal trap. */
-#  define ILL_ILLTRP	ILL_ILLTRP
-  ILL_PRVOPC,			/* Privileged opcode.  */
-#  define ILL_PRVOPC	ILL_PRVOPC
-  ILL_PRVREG,			/* Privileged register.  */
-#  define ILL_PRVREG	ILL_PRVREG
-  ILL_COPROC,			/* Coprocessor error.  */
-#  define ILL_COPROC	ILL_COPROC
-  ILL_BADSTK			/* Internal stack error.  */
-#  define ILL_BADSTK	ILL_BADSTK
-};
-
-/* `si_code' values for SIGFPE signal.  */
-enum
-{
-  FPE_INTDIV = 1,		/* Integer divide by zero.  */
-#  define FPE_INTDIV	FPE_INTDIV
-  FPE_INTOVF,			/* Integer overflow.  */
-#  define FPE_INTOVF	FPE_INTOVF
-  FPE_FLTDIV,			/* Floating point divide by zero.  */
-#  define FPE_FLTDIV	FPE_FLTDIV
-  FPE_FLTOVF,			/* Floating point overflow.  */
-#  define FPE_FLTOVF	FPE_FLTOVF
-  FPE_FLTUND,			/* Floating point underflow.  */
-#  define FPE_FLTUND	FPE_FLTUND
-  FPE_FLTRES,			/* Floating point inexact result.  */
-#  define FPE_FLTRES	FPE_FLTRES
-  FPE_FLTINV,			/* Floating point invalid operation.  */
-#  define FPE_FLTINV	FPE_FLTINV
-  FPE_FLTSUB			/* Subscript out of range.  */
-#  define FPE_FLTSUB	FPE_FLTSUB
-};
-
-/* `si_code' values for SIGSEGV signal.  */
-enum
-{
-  SEGV_MAPERR = 1,		/* Address not mapped to object.  */
-#  define SEGV_MAPERR	SEGV_MAPERR
-  SEGV_ACCERR			/* Invalid permissions for mapped object.  */
-#  define SEGV_ACCERR	SEGV_ACCERR
-};
-
-/* `si_code' values for SIGBUS signal.  */
-enum
-{
-  BUS_ADRALN = 1,		/* Invalid address alignment.  */
-#  define BUS_ADRALN	BUS_ADRALN
-  BUS_ADRERR,			/* Non-existant physical address.  */
-#  define BUS_ADRERR	BUS_ADRERR
-  BUS_OBJERR,			/* Object specific hardware error.  */
-#  define BUS_OBJERR	BUS_OBJERR
-  BUS_MCEERR_AR,		/* Hardware memory error: action required.  */
-#  define BUS_MCEERR_AR	BUS_MCEERR_AR
-  BUS_MCEERR_AO			/* Hardware memory error: action optional.  */
-#  define BUS_MCEERR_AO	BUS_MCEERR_AO
-};
-# endif
-
-# ifdef __USE_XOPEN_EXTENDED
-/* `si_code' values for SIGTRAP signal.  */
-enum
-{
-  TRAP_BRKPT = 1,		/* Process breakpoint.  */
-#  define TRAP_BRKPT	TRAP_BRKPT
-  TRAP_TRACE			/* Process trace trap.  */
-#  define TRAP_TRACE	TRAP_TRACE
-};
-# endif
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGCHLD signal.  */
-enum
-{
-  CLD_EXITED = 1,		/* Child has exited.  */
-#  define CLD_EXITED	CLD_EXITED
-  CLD_KILLED,			/* Child was killed.  */
-#  define CLD_KILLED	CLD_KILLED
-  CLD_DUMPED,			/* Child terminated abnormally.  */
-#  define CLD_DUMPED	CLD_DUMPED
-  CLD_TRAPPED,			/* Traced child has trapped.  */
-#  define CLD_TRAPPED	CLD_TRAPPED
-  CLD_STOPPED,			/* Child has stopped.  */
-#  define CLD_STOPPED	CLD_STOPPED
-  CLD_CONTINUED			/* Stopped child has continued.  */
-#  define CLD_CONTINUED	CLD_CONTINUED
-};
-
-/* `si_code' values for SIGPOLL signal.  */
-enum
-{
-  POLL_IN = 1,			/* Data input available.  */
-#  define POLL_IN	POLL_IN
-  POLL_OUT,			/* Output buffers available.  */
-#  define POLL_OUT	POLL_OUT
-  POLL_MSG,			/* Input message available.   */
-#  define POLL_MSG	POLL_MSG
-  POLL_ERR,			/* I/O error.  */
-#  define POLL_ERR	POLL_ERR
-  POLL_PRI,			/* High priority input available.  */
-#  define POLL_PRI	POLL_PRI
-  POLL_HUP			/* Device disconnected.  */
-#  define POLL_HUP	POLL_HUP
-};
-# endif
-
-# if defined __USE_GNU
-/* `si_code' values for SIGEMT signal.  */
-enum
-{
-  EMT_TAGOVF = 1		/* Tag overflow.  */
-# define EMT_TAGOVF	EMT_TAGOVF
-};
-# endif
-
-# undef __need_siginfo_t
-#endif	/* !have siginfo_t && (have _SIGNAL_H || need siginfo_t).  */
-
-
-#if (defined _SIGNAL_H || defined __need_sigevent_t) \
-    && !defined __have_sigevent_t
-# define __have_sigevent_t	1
-
-/* Structure to transport application-defined values with signals.  */
-# define __SIGEV_MAX_SIZE	64
-# if __WORDSIZE == 64
-#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 4)
-# else
-#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 3)
-# endif
-
-/* Forward declaration.  */
-# ifndef __have_pthread_attr_t
-typedef union pthread_attr_t pthread_attr_t;
-#  define __have_pthread_attr_t	1
-# endif
-
-typedef struct sigevent
-  {
-    sigval_t sigev_value;
-    int sigev_signo;
-    int sigev_notify;
-
-    union
-      {
-	int _pad[__SIGEV_PAD_SIZE];
-
-	/* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
-	   thread to receive the signal.  */
-	__pid_t _tid;
-
-	struct
-	  {
-	    void (*_function) (sigval_t);	/* Function to start.  */
-	    pthread_attr_t *_attribute;		/* Thread attributes.  */
-	  } _sigev_thread;
-      } _sigev_un;
-  } sigevent_t;
-
-/* POSIX names to access some of the members.  */
-# define sigev_notify_function   _sigev_un._sigev_thread._function
-# define sigev_notify_attributes _sigev_un._sigev_thread._attribute
-
-/* `sigev_notify' values.  */
-enum
-{
-  SIGEV_SIGNAL = 0,		/* Notify via signal.  */
-# define SIGEV_SIGNAL	SIGEV_SIGNAL
-  SIGEV_NONE,			/* Other notification: meaningless.  */
-# define SIGEV_NONE	SIGEV_NONE
-  SIGEV_THREAD,			/* Deliver via thread creation.  */
-# define SIGEV_THREAD	SIGEV_THREAD
-
-  SIGEV_THREAD_ID = 4		/* Send signal to specific thread.  */
-#define SIGEV_THREAD_ID	SIGEV_THREAD_ID
-};
-
-#endif	/* have _SIGNAL_H.  */
diff --git a/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h b/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h
index 0d6cbe6e6b..e859b79c9d 100644
--- a/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h
@@ -23,6 +23,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/unix/sysv/linux/sys/epoll.h b/sysdeps/unix/sysv/linux/sys/epoll.h
index 7542e8ac0b..1498058396 100644
--- a/sysdeps/unix/sysv/linux/sys/epoll.h
+++ b/sysdeps/unix/sysv/linux/sys/epoll.h
@@ -21,13 +21,7 @@
 #include <stdint.h>
 #include <sys/types.h>
 
-/* Get __sigset_t.  */
-#include <bits/sigset.h>
-
-#ifndef __sigset_t_defined
-# define __sigset_t_defined
-typedef __sigset_t sigset_t;
-#endif
+#include <bits/types/sigset_t.h>
 
 /* Get the platform-dependent flags.  */
 #include <bits/epoll.h>
diff --git a/sysdeps/unix/sysv/linux/sys/signalfd.h b/sysdeps/unix/sysv/linux/sys/signalfd.h
index a18db513b9..a01c7d1cc1 100644
--- a/sysdeps/unix/sysv/linux/sys/signalfd.h
+++ b/sysdeps/unix/sysv/linux/sys/signalfd.h
@@ -18,9 +18,8 @@
 #ifndef	_SYS_SIGNALFD_H
 #define	_SYS_SIGNALFD_H	1
 
-#define __need_sigset_t
-#include <signal.h>
 #include <stdint.h>
+#include <bits/types/sigset_t.h>
 
 /* Get the platform-dependent flags.  */
 #include <bits/signalfd.h>
diff --git a/sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h b/sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h
new file mode 100644
index 0000000000..013ad7187d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h
@@ -0,0 +1,11 @@
+/* Architecture-specific adjustments to siginfo_t.  Tile version.  */
+#ifndef _BITS_SIGINFO_ARCH_H
+#define _BITS_SIGINFO_ARCH_H 1
+
+#undef __SI_SIGFAULT_ADDL
+#define __SI_SIGFAULT_ADDL \
+  int _si_trapno;
+
+#define si_trapno	_sifields._sigfault._si_trapno
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/tile/bits/siginfo-consts-arch.h b/sysdeps/unix/sysv/linux/tile/bits/siginfo-consts-arch.h
new file mode 100644
index 0000000000..2e76d2082a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tile/bits/siginfo-consts-arch.h
@@ -0,0 +1,14 @@
+/* Architecture-specific additional siginfo constants.  Tile version.  */
+#ifndef _BITS_SIGINFO_CONSTS_ARCH_H
+#define _BITS_SIGINFO_CONSTS_ARCH_H 1
+
+/* `si_code' values for SIGILL signal.  */
+enum
+{
+  ILL_DBLFLT = ILL_BADSTK + 1,	/* Double fault.  */
+#define ILL_DBLFLT ILL_DBLFLT
+  ILL_HARDWALL			/* User networks hardwall violation.  */
+#define ILL_HARDWALL ILL_HARDWALL
+};
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/tile/bits/siginfo.h b/sysdeps/unix/sysv/linux/tile/bits/siginfo.h
deleted file mode 100644
index 44d66a0597..0000000000
--- a/sysdeps/unix/sysv/linux/tile/bits/siginfo.h
+++ /dev/null
@@ -1,347 +0,0 @@
-/* Copyright (C) 2011-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#if !defined _SIGNAL_H && !defined __need_siginfo_t \
-    && !defined __need_sigevent_t
-# error "Never include this file directly.  Use <signal.h> instead"
-#endif
-
-#include <bits/wordsize.h>
-
-#if (!defined __have_sigval_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t \
-	 || defined __need_sigevent_t))
-# define __have_sigval_t	1
-
-/* Type for data associated with a signal.  */
-typedef union sigval
-  {
-    int sival_int;
-    void *sival_ptr;
-  } sigval_t;
-#endif
-
-#if (!defined __have_siginfo_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t))
-# define __have_siginfo_t	1
-
-# define __SI_MAX_SIZE     128
-# if __WORDSIZE == 64
-#  define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 4)
-# else
-#  define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 3)
-# endif
-
-typedef struct
-  {
-    int si_signo;		/* Signal number.  */
-    int si_errno;		/* If non-zero, an errno value associated with
-				   this signal, as defined in <errno.h>.  */
-    int si_code;		/* Signal code.  */
-
-    union
-      {
-	int _pad[__SI_PAD_SIZE];
-
-	 /* kill().  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	  } _kill;
-
-	/* POSIX.1b timers.  */
-	struct
-	  {
-	    int si_tid;		/* Timer ID.  */
-	    int si_overrun;	/* Overrun count.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _timer;
-
-	/* POSIX.1b signals.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _rt;
-
-	/* SIGCHLD.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Which child.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    int si_status;	/* Exit value or signal.  */
-	    __clock_t si_utime;
-	    __clock_t si_stime;
-	  } _sigchld;
-
-	/* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
-	struct
-	  {
-	    void *si_addr;	/* Faulting insn/memory ref.  */
-	    int si_trapno;	/* TRAP # which caused the signal.  */
-	    short int si_addr_lsb;	/* Valid LSB of the reported address.  */
-	  } _sigfault;
-
-	/* SIGPOLL.  */
-	struct
-	  {
-	    long int si_band;	/* Band event for SIGPOLL.  */
-	    int si_fd;
-	  } _sigpoll;
-
-	/* SIGSYS.  */
-	struct
-	  {
-	    void *_call_addr;	/* Calling user insn.  */
-	    int _syscall;	/* Triggering system call number.  */
-	    unsigned int _arch; /* AUDIT_ARCH_* of syscall.  */
-	  } _sigsys;
-      } _sifields;
-  } siginfo_t;
-
-
-/* X/Open requires some more fields with fixed names.  */
-# define si_pid		_sifields._kill.si_pid
-# define si_uid		_sifields._kill.si_uid
-# define si_timerid	_sifields._timer.si_tid
-# define si_overrun	_sifields._timer.si_overrun
-# define si_status	_sifields._sigchld.si_status
-# define si_utime	_sifields._sigchld.si_utime
-# define si_stime	_sifields._sigchld.si_stime
-# define si_value	_sifields._rt.si_sigval
-# define si_int		_sifields._rt.si_sigval.sival_int
-# define si_ptr		_sifields._rt.si_sigval.sival_ptr
-# define si_addr	_sifields._sigfault.si_addr
-# define si_trapno	_sifields._sigfault.si_trapno
-# define si_addr_lsb	_sifields._sigfault.si_addr_lsb
-# define si_band	_sifields._sigpoll.si_band
-# define si_fd		_sifields._sigpoll.si_fd
-# define si_call_addr 	_sifields._sigsys._call_addr
-# define si_syscall	_sifields._sigsys._syscall
-# define si_arch	_sifields._sigsys._arch
-
-
-/* Values for `si_code'.  Positive values are reserved for kernel-generated
-   signals.  */
-enum
-{
-  SI_ASYNCNL = -60,		/* Sent by asynch name lookup completion.  */
-# define SI_ASYNCNL	SI_ASYNCNL
-  SI_TKILL = -6,		/* Sent by tkill.  */
-# define SI_TKILL	SI_TKILL
-  SI_SIGIO,			/* Sent by queued SIGIO. */
-# define SI_SIGIO	SI_SIGIO
-  SI_ASYNCIO,			/* Sent by AIO completion.  */
-# define SI_ASYNCIO	SI_ASYNCIO
-  SI_MESGQ,			/* Sent by real time mesq state change.  */
-# define SI_MESGQ	SI_MESGQ
-  SI_TIMER,			/* Sent by timer expiration.  */
-# define SI_TIMER	SI_TIMER
-  SI_QUEUE,			/* Sent by sigqueue.  */
-# define SI_QUEUE	SI_QUEUE
-  SI_USER,			/* Sent by kill, sigsend, raise.  */
-# define SI_USER	SI_USER
-  SI_KERNEL = 0x80		/* Send by kernel.  */
-#define SI_KERNEL	SI_KERNEL
-};
-
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGILL signal.  */
-enum
-{
-  ILL_ILLOPC = 1,		/* Illegal opcode.  */
-#  define ILL_ILLOPC	ILL_ILLOPC
-  ILL_ILLOPN,			/* Illegal operand.  */
-#  define ILL_ILLOPN	ILL_ILLOPN
-  ILL_ILLADR,			/* Illegal addressing mode.  */
-#  define ILL_ILLADR	ILL_ILLADR
-  ILL_ILLTRP,			/* Illegal trap. */
-#  define ILL_ILLTRP	ILL_ILLTRP
-  ILL_PRVOPC,			/* Privileged opcode.  */
-#  define ILL_PRVOPC	ILL_PRVOPC
-  ILL_PRVREG,			/* Privileged register.  */
-#  define ILL_PRVREG	ILL_PRVREG
-  ILL_COPROC,			/* Coprocessor error.  */
-#  define ILL_COPROC	ILL_COPROC
-  ILL_BADSTK,			/* Internal stack error.  */
-#  define ILL_BADSTK	ILL_BADSTK
-  ILL_DBLFLT,			/* Double fault.  */
-#  define ILL_DBLFLT	ILL_DBLFLT
-  ILL_HARDWALL			/* User networks hardwall violation.  */
-#  define ILL_HARDWALL	ILL_HARDWALL
-};
-
-/* `si_code' values for SIGFPE signal.  */
-enum
-{
-  FPE_INTDIV = 1,		/* Integer divide by zero.  */
-#  define FPE_INTDIV	FPE_INTDIV
-  FPE_INTOVF,			/* Integer overflow.  */
-#  define FPE_INTOVF	FPE_INTOVF
-  FPE_FLTDIV,			/* Floating point divide by zero.  */
-#  define FPE_FLTDIV	FPE_FLTDIV
-  FPE_FLTOVF,			/* Floating point overflow.  */
-#  define FPE_FLTOVF	FPE_FLTOVF
-  FPE_FLTUND,			/* Floating point underflow.  */
-#  define FPE_FLTUND	FPE_FLTUND
-  FPE_FLTRES,			/* Floating point inexact result.  */
-#  define FPE_FLTRES	FPE_FLTRES
-  FPE_FLTINV,			/* Floating point invalid operation.  */
-#  define FPE_FLTINV	FPE_FLTINV
-  FPE_FLTSUB			/* Subscript out of range.  */
-#  define FPE_FLTSUB	FPE_FLTSUB
-};
-
-/* `si_code' values for SIGSEGV signal.  */
-enum
-{
-  SEGV_MAPERR = 1,		/* Address not mapped to object.  */
-#  define SEGV_MAPERR	SEGV_MAPERR
-  SEGV_ACCERR			/* Invalid permissions for mapped object.  */
-#  define SEGV_ACCERR	SEGV_ACCERR
-};
-
-/* `si_code' values for SIGBUS signal.  */
-enum
-{
-  BUS_ADRALN = 1,		/* Invalid address alignment.  */
-#  define BUS_ADRALN	BUS_ADRALN
-  BUS_ADRERR,			/* Non-existant physical address.  */
-#  define BUS_ADRERR	BUS_ADRERR
-  BUS_OBJERR,			/* Object specific hardware error.  */
-#  define BUS_OBJERR	BUS_OBJERR
-  BUS_MCEERR_AR,		/* Hardware memory error: action required.  */
-#  define BUS_MCEERR_AR	BUS_MCEERR_AR
-  BUS_MCEERR_AO			/* Hardware memory error: action optional.  */
-#  define BUS_MCEERR_AO	BUS_MCEERR_AO
-};
-# endif
-
-# ifdef __USE_XOPEN_EXTENDED
-/* `si_code' values for SIGTRAP signal.  */
-enum
-{
-  TRAP_BRKPT = 1,		/* Process breakpoint.  */
-#  define TRAP_BRKPT	TRAP_BRKPT
-  TRAP_TRACE			/* Process trace trap.  */
-#  define TRAP_TRACE	TRAP_TRACE
-};
-# endif
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGCHLD signal.  */
-enum
-{
-  CLD_EXITED = 1,		/* Child has exited.  */
-#  define CLD_EXITED	CLD_EXITED
-  CLD_KILLED,			/* Child was killed.  */
-#  define CLD_KILLED	CLD_KILLED
-  CLD_DUMPED,			/* Child terminated abnormally.  */
-#  define CLD_DUMPED	CLD_DUMPED
-  CLD_TRAPPED,			/* Traced child has trapped.  */
-#  define CLD_TRAPPED	CLD_TRAPPED
-  CLD_STOPPED,			/* Child has stopped.  */
-#  define CLD_STOPPED	CLD_STOPPED
-  CLD_CONTINUED			/* Stopped child has continued.  */
-#  define CLD_CONTINUED	CLD_CONTINUED
-};
-
-/* `si_code' values for SIGPOLL signal.  */
-enum
-{
-  POLL_IN = 1,			/* Data input available.  */
-#  define POLL_IN	POLL_IN
-  POLL_OUT,			/* Output buffers available.  */
-#  define POLL_OUT	POLL_OUT
-  POLL_MSG,			/* Input message available.   */
-#  define POLL_MSG	POLL_MSG
-  POLL_ERR,			/* I/O error.  */
-#  define POLL_ERR	POLL_ERR
-  POLL_PRI,			/* High priority input available.  */
-#  define POLL_PRI	POLL_PRI
-  POLL_HUP			/* Device disconnected.  */
-#  define POLL_HUP	POLL_HUP
-};
-# endif
-
-# undef __need_siginfo_t
-#endif	/* !have siginfo_t && (have _SIGNAL_H || need siginfo_t).  */
-
-
-#if (defined _SIGNAL_H || defined __need_sigevent_t) \
-    && !defined __have_sigevent_t
-# define __have_sigevent_t	1
-
-/* Structure to transport application-defined values with signals.  */
-# define __SIGEV_MAX_SIZE	64
-# if __WORDSIZE == 64
-#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 4)
-# else
-#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 3)
-# endif
-
-/* Forward declaration.  */
-# ifndef __have_pthread_attr_t
-typedef union pthread_attr_t pthread_attr_t;
-#  define __have_pthread_attr_t	1
-# endif
-
-typedef struct sigevent
-  {
-    sigval_t sigev_value;
-    int sigev_signo;
-    int sigev_notify;
-
-    union
-      {
-	int _pad[__SIGEV_PAD_SIZE];
-
-	/* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
-	   thread to receive the signal.  */
-	__pid_t _tid;
-
-	struct
-	  {
-	    void (*_function) (sigval_t);	/* Function to start.  */
-	    pthread_attr_t *_attribute;		/* Thread attributes.  */
-	  } _sigev_thread;
-      } _sigev_un;
-  } sigevent_t;
-
-/* POSIX names to access some of the members.  */
-# define sigev_notify_function   _sigev_un._sigev_thread._function
-# define sigev_notify_attributes _sigev_un._sigev_thread._attribute
-
-/* `sigev_notify' values.  */
-enum
-{
-  SIGEV_SIGNAL = 0,		/* Notify via signal.  */
-# define SIGEV_SIGNAL	SIGEV_SIGNAL
-  SIGEV_NONE,			/* Other notification: meaningless.  */
-# define SIGEV_NONE	SIGEV_NONE
-  SIGEV_THREAD,			/* Deliver via thread creation.  */
-# define SIGEV_THREAD	SIGEV_THREAD
-
-  SIGEV_THREAD_ID = 4		/* Send signal to specific thread.  */
-#define SIGEV_THREAD_ID	SIGEV_THREAD_ID
-};
-
-#endif	/* have _SIGNAL_H.  */
diff --git a/sysdeps/unix/sysv/linux/tile/sys/ucontext.h b/sysdeps/unix/sysv/linux/tile/sys/ucontext.h
index 8fc2f13834..4a40e5710f 100644
--- a/sysdeps/unix/sysv/linux/tile/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/tile/sys/ucontext.h
@@ -24,6 +24,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
diff --git a/sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h b/sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h
new file mode 100644
index 0000000000..6c85dbb6e8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h
@@ -0,0 +1,19 @@
+/* Architecture-specific adjustments to siginfo_t.  x86 version.  */
+#ifndef _BITS_SIGINFO_ARCH_H
+#define _BITS_SIGINFO_ARCH_H 1
+
+#if defined __x86_64__ && __WORDSIZE == 32
+/* si_utime and si_stime must be 4 byte aligned for x32 to match the
+   kernel.  We align siginfo_t to 8 bytes so that si_utime and
+   si_stime are actually aligned to 8 bytes since their offsets are
+   multiple of 8 bytes.  Note: with some compilers, the alignment
+   attribute would be ignored if it were put in __SI_CLOCK_T instead
+   of encapsulated in a typedef.  */
+typedef __clock_t __attribute__ ((__aligned__ (4))) __sigchld_clock_t;
+# undef  __SI_ALIGNMENT
+# define __SI_ALIGNMENT __attribute__ ((__aligned__ (8)))
+# undef  __SI_CLOCK_T
+# define __SI_CLOCK_T __sigchld_clock_t
+#endif
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/x86/bits/siginfo.h b/sysdeps/unix/sysv/linux/x86/bits/siginfo.h
deleted file mode 100644
index 569359980d..0000000000
--- a/sysdeps/unix/sysv/linux/x86/bits/siginfo.h
+++ /dev/null
@@ -1,360 +0,0 @@
-/* siginfo_t, sigevent and constants.  Linux x86-64 version.
-   Copyright (C) 2012-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#if !defined _SIGNAL_H && !defined __need_siginfo_t \
-    && !defined __need_sigevent_t
-# error "Never include this file directly.  Use <signal.h> instead"
-#endif
-
-#include <bits/wordsize.h>
-
-#if (!defined __have_sigval_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t \
-	 || defined __need_sigevent_t))
-# define __have_sigval_t	1
-
-/* Type for data associated with a signal.  */
-typedef union sigval
-  {
-    int sival_int;
-    void *sival_ptr;
-  } sigval_t;
-#endif
-
-#if (!defined __have_siginfo_t \
-     && (defined _SIGNAL_H || defined __need_siginfo_t))
-# define __have_siginfo_t	1
-
-# define __SI_MAX_SIZE     128
-# if __WORDSIZE == 64
-#  define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 4)
-# else
-#  define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 3)
-# endif
-
-# if defined __x86_64__ && __WORDSIZE == 32
-/* si_utime and si_stime must be 4 byte aligned for x32 to match the
-   kernel.  We align siginfo_t to 8 bytes so that si_utime and si_stime
-   are actually aligned to 8 bytes since their offsets are multiple of
-   8 bytes.  */
-typedef __clock_t __attribute__ ((__aligned__ (4))) __sigchld_clock_t;
-#  define __SI_ALIGNMENT __attribute__ ((__aligned__ (8)))
-# else
-typedef __clock_t __sigchld_clock_t;
-#  define __SI_ALIGNMENT
-# endif
-
-typedef struct
-  {
-    int si_signo;		/* Signal number.  */
-    int si_errno;		/* If non-zero, an errno value associated with
-				   this signal, as defined in <errno.h>.  */
-    int si_code;		/* Signal code.  */
-
-    union
-      {
-	int _pad[__SI_PAD_SIZE];
-
-	 /* kill().  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	  } _kill;
-
-	/* POSIX.1b timers.  */
-	struct
-	  {
-	    int si_tid;		/* Timer ID.  */
-	    int si_overrun;	/* Overrun count.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _timer;
-
-	/* POSIX.1b signals.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Sending process ID.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    sigval_t si_sigval;	/* Signal value.  */
-	  } _rt;
-
-	/* SIGCHLD.  */
-	struct
-	  {
-	    __pid_t si_pid;	/* Which child.  */
-	    __uid_t si_uid;	/* Real user ID of sending process.  */
-	    int si_status;	/* Exit value or signal.  */
-	    __sigchld_clock_t si_utime;
-	    __sigchld_clock_t si_stime;
-	  } _sigchld;
-
-	/* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
-	struct
-	  {
-	    void *si_addr;	/* Faulting insn/memory ref.  */
-	    short int si_addr_lsb;	/* Valid LSB of the reported address.  */
-	    struct
-	      {
-		void *_lower;
-		void *_upper;
-	      } si_addr_bnd;
-	  } _sigfault;
-
-	/* SIGPOLL.  */
-	struct
-	  {
-	    long int si_band;	/* Band event for SIGPOLL.  */
-	    int si_fd;
-	  } _sigpoll;
-
-	/* SIGSYS.  */
-	struct
-	  {
-	    void *_call_addr;	/* Calling user insn.  */
-	    int _syscall;	/* Triggering system call number.  */
-	    unsigned int _arch; /* AUDIT_ARCH_* of syscall.  */
-	  } _sigsys;
-      } _sifields;
-  } siginfo_t __SI_ALIGNMENT;
-
-
-/* X/Open requires some more fields with fixed names.  */
-# define si_pid		_sifields._kill.si_pid
-# define si_uid		_sifields._kill.si_uid
-# define si_timerid	_sifields._timer.si_tid
-# define si_overrun	_sifields._timer.si_overrun
-# define si_status	_sifields._sigchld.si_status
-# define si_utime	_sifields._sigchld.si_utime
-# define si_stime	_sifields._sigchld.si_stime
-# define si_value	_sifields._rt.si_sigval
-# define si_int		_sifields._rt.si_sigval.sival_int
-# define si_ptr		_sifields._rt.si_sigval.sival_ptr
-# define si_addr	_sifields._sigfault.si_addr
-# define si_addr_lsb	_sifields._sigfault.si_addr_lsb
-# define si_lower	_sifields._sigfault.si_addr_bnd._lower
-# define si_upper	_sifields._sigfault.si_addr_bnd._upper
-# define si_band	_sifields._sigpoll.si_band
-# define si_fd		_sifields._sigpoll.si_fd
-# define si_call_addr 	_sifields._sigsys._call_addr
-# define si_syscall	_sifields._sigsys._syscall
-# define si_arch	_sifields._sigsys._arch
-
-
-/* Values for `si_code'.  Positive values are reserved for kernel-generated
-   signals.  */
-enum
-{
-  SI_ASYNCNL = -60,		/* Sent by asynch name lookup completion.  */
-# define SI_ASYNCNL	SI_ASYNCNL
-  SI_TKILL = -6,		/* Sent by tkill.  */
-# define SI_TKILL	SI_TKILL
-  SI_SIGIO,			/* Sent by queued SIGIO. */
-# define SI_SIGIO	SI_SIGIO
-  SI_ASYNCIO,			/* Sent by AIO completion.  */
-# define SI_ASYNCIO	SI_ASYNCIO
-  SI_MESGQ,			/* Sent by real time mesq state change.  */
-# define SI_MESGQ	SI_MESGQ
-  SI_TIMER,			/* Sent by timer expiration.  */
-# define SI_TIMER	SI_TIMER
-  SI_QUEUE,			/* Sent by sigqueue.  */
-# define SI_QUEUE	SI_QUEUE
-  SI_USER,			/* Sent by kill, sigsend.  */
-# define SI_USER	SI_USER
-  SI_KERNEL = 0x80		/* Send by kernel.  */
-#define SI_KERNEL	SI_KERNEL
-};
-
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGILL signal.  */
-enum
-{
-  ILL_ILLOPC = 1,		/* Illegal opcode.  */
-#  define ILL_ILLOPC	ILL_ILLOPC
-  ILL_ILLOPN,			/* Illegal operand.  */
-#  define ILL_ILLOPN	ILL_ILLOPN
-  ILL_ILLADR,			/* Illegal addressing mode.  */
-#  define ILL_ILLADR	ILL_ILLADR
-  ILL_ILLTRP,			/* Illegal trap. */
-#  define ILL_ILLTRP	ILL_ILLTRP
-  ILL_PRVOPC,			/* Privileged opcode.  */
-#  define ILL_PRVOPC	ILL_PRVOPC
-  ILL_PRVREG,			/* Privileged register.  */
-#  define ILL_PRVREG	ILL_PRVREG
-  ILL_COPROC,			/* Coprocessor error.  */
-#  define ILL_COPROC	ILL_COPROC
-  ILL_BADSTK			/* Internal stack error.  */
-#  define ILL_BADSTK	ILL_BADSTK
-};
-
-/* `si_code' values for SIGFPE signal.  */
-enum
-{
-  FPE_INTDIV = 1,		/* Integer divide by zero.  */
-#  define FPE_INTDIV	FPE_INTDIV
-  FPE_INTOVF,			/* Integer overflow.  */
-#  define FPE_INTOVF	FPE_INTOVF
-  FPE_FLTDIV,			/* Floating point divide by zero.  */
-#  define FPE_FLTDIV	FPE_FLTDIV
-  FPE_FLTOVF,			/* Floating point overflow.  */
-#  define FPE_FLTOVF	FPE_FLTOVF
-  FPE_FLTUND,			/* Floating point underflow.  */
-#  define FPE_FLTUND	FPE_FLTUND
-  FPE_FLTRES,			/* Floating point inexact result.  */
-#  define FPE_FLTRES	FPE_FLTRES
-  FPE_FLTINV,			/* Floating point invalid operation.  */
-#  define FPE_FLTINV	FPE_FLTINV
-  FPE_FLTSUB			/* Subscript out of range.  */
-#  define FPE_FLTSUB	FPE_FLTSUB
-};
-
-/* `si_code' values for SIGSEGV signal.  */
-enum
-{
-  SEGV_MAPERR = 1,		/* Address not mapped to object.  */
-#  define SEGV_MAPERR	SEGV_MAPERR
-  SEGV_ACCERR			/* Invalid permissions for mapped object.  */
-#  define SEGV_ACCERR	SEGV_ACCERR
-};
-
-/* `si_code' values for SIGBUS signal.  */
-enum
-{
-  BUS_ADRALN = 1,		/* Invalid address alignment.  */
-#  define BUS_ADRALN	BUS_ADRALN
-  BUS_ADRERR,			/* Non-existant physical address.  */
-#  define BUS_ADRERR	BUS_ADRERR
-  BUS_OBJERR,			/* Object specific hardware error.  */
-#  define BUS_OBJERR	BUS_OBJERR
-  BUS_MCEERR_AR,		/* Hardware memory error: action required.  */
-#  define BUS_MCEERR_AR	BUS_MCEERR_AR
-  BUS_MCEERR_AO			/* Hardware memory error: action optional.  */
-#  define BUS_MCEERR_AO	BUS_MCEERR_AO
-};
-# endif
-
-# ifdef __USE_XOPEN_EXTENDED
-/* `si_code' values for SIGTRAP signal.  */
-enum
-{
-  TRAP_BRKPT = 1,		/* Process breakpoint.  */
-#  define TRAP_BRKPT	TRAP_BRKPT
-  TRAP_TRACE			/* Process trace trap.  */
-#  define TRAP_TRACE	TRAP_TRACE
-};
-# endif
-
-# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
-/* `si_code' values for SIGCHLD signal.  */
-enum
-{
-  CLD_EXITED = 1,		/* Child has exited.  */
-#  define CLD_EXITED	CLD_EXITED
-  CLD_KILLED,			/* Child was killed.  */
-#  define CLD_KILLED	CLD_KILLED
-  CLD_DUMPED,			/* Child terminated abnormally.  */
-#  define CLD_DUMPED	CLD_DUMPED
-  CLD_TRAPPED,			/* Traced child has trapped.  */
-#  define CLD_TRAPPED	CLD_TRAPPED
-  CLD_STOPPED,			/* Child has stopped.  */
-#  define CLD_STOPPED	CLD_STOPPED
-  CLD_CONTINUED			/* Stopped child has continued.  */
-#  define CLD_CONTINUED	CLD_CONTINUED
-};
-
-/* `si_code' values for SIGPOLL signal.  */
-enum
-{
-  POLL_IN = 1,			/* Data input available.  */
-#  define POLL_IN	POLL_IN
-  POLL_OUT,			/* Output buffers available.  */
-#  define POLL_OUT	POLL_OUT
-  POLL_MSG,			/* Input message available.   */
-#  define POLL_MSG	POLL_MSG
-  POLL_ERR,			/* I/O error.  */
-#  define POLL_ERR	POLL_ERR
-  POLL_PRI,			/* High priority input available.  */
-#  define POLL_PRI	POLL_PRI
-  POLL_HUP			/* Device disconnected.  */
-#  define POLL_HUP	POLL_HUP
-};
-# endif
-
-# undef __need_siginfo_t
-#endif	/* !have siginfo_t && (have _SIGNAL_H || need siginfo_t).  */
-
-
-#if (defined _SIGNAL_H || defined __need_sigevent_t) \
-    && !defined __have_sigevent_t
-# define __have_sigevent_t	1
-
-/* Structure to transport application-defined values with signals.  */
-# define __SIGEV_MAX_SIZE	64
-# if __WORDSIZE == 64
-#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 4)
-# else
-#  define __SIGEV_PAD_SIZE	((__SIGEV_MAX_SIZE / sizeof (int)) - 3)
-# endif
-
-/* Forward declaration.  */
-# ifndef __have_pthread_attr_t
-typedef union pthread_attr_t pthread_attr_t;
-#  define __have_pthread_attr_t	1
-# endif
-
-typedef struct sigevent
-  {
-    sigval_t sigev_value;
-    int sigev_signo;
-    int sigev_notify;
-
-    union
-      {
-	int _pad[__SIGEV_PAD_SIZE];
-
-	/* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
-	   thread to receive the signal.  */
-	__pid_t _tid;
-
-	struct
-	  {
-	    void (*_function) (sigval_t);	/* Function to start.  */
-	    pthread_attr_t *_attribute;		/* Thread attributes.  */
-	  } _sigev_thread;
-      } _sigev_un;
-  } sigevent_t;
-
-/* POSIX names to access some of the members.  */
-# define sigev_notify_function   _sigev_un._sigev_thread._function
-# define sigev_notify_attributes _sigev_un._sigev_thread._attribute
-
-/* `sigev_notify' values.  */
-enum
-{
-  SIGEV_SIGNAL = 0,		/* Notify via signal.  */
-# define SIGEV_SIGNAL	SIGEV_SIGNAL
-  SIGEV_NONE,			/* Other notification: meaningless.  */
-# define SIGEV_NONE	SIGEV_NONE
-  SIGEV_THREAD,			/* Deliver via thread creation.  */
-# define SIGEV_THREAD	SIGEV_THREAD
-
-  SIGEV_THREAD_ID = 4		/* Send signal to specific thread.  */
-#define SIGEV_THREAD_ID	SIGEV_THREAD_ID
-};
-
-#endif	/* have _SIGNAL_H.  */
diff --git a/sysdeps/unix/sysv/linux/x86/sys/ucontext.h b/sysdeps/unix/sysv/linux/x86/sys/ucontext.h
index 5dd72acf48..60a3edfea0 100644
--- a/sysdeps/unix/sysv/linux/x86/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/x86/sys/ucontext.h
@@ -23,6 +23,7 @@
 
 /* We need the signal context definitions even if they are not exposed
    by <signal.h>.  */
+#include <bits/types/__sigset_t.h>
 #include <bits/sigcontext.h>
 #include <bits/sigstack.h>
 #include <bits/types/struct_sigstack.h>
-- 
2.11.0

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 5/6] Remove __need_IOV_MAX and __need_FOPEN_MAX.
  2017-05-20 23:18 [PATCH 0/6] Elimination of __need macros, round 3(?) Zack Weinberg
                   ` (4 preceding siblings ...)
  2017-05-20 23:18 ` [PATCH 4/6] Remove __need macros from stdio.h and wchar.h Zack Weinberg
@ 2017-05-20 23:18 ` Zack Weinberg
  2017-05-23 17:42 ` [PATCH 0/6] Elimination of __need macros, round 3(?) Chris Metcalf
  6 siblings, 0 replies; 14+ messages in thread
From: Zack Weinberg @ 2017-05-20 23:18 UTC (permalink / raw)
  To: libc-alpha

__need_FOPEN_MAX wasn't being used anywhere.  __need_IOV_MAX was more
complicated; the basic deal is that sys/uio.h wants to define a
constant named UIO_MAXIOV and bits/xopen_lim.h wants to define a
constant named IOV_MAX, with the same meaning.  For no apparent reason
this was being handled via bits/stdio_lim.h -- stdio.h is NOT supposed
to define IOV_MAX -- and some mess in Makerules.  Also, bits/uio.h on
Linux was being used as a dumping ground for extension functions, and
there's no longer any good reason for the definition of struct iovec
itself to be system-dependent.

So now we have bits/uio_lim.h, which defines __IOV_MAX.
bits/xopen_lim.h and sys/uio.h use that to define their respective
constants.  We also now have bits/types/struct_iovec.h, which is the
one true definition of struct iovec, used by sys/uio.h and
bits/fcntl-linux.h (another dumping ground for extension functions
which I am not tackling in this patch series), and sys/uio_ext.h,
which is the official Proper Home for extensions to sys/uio.h.  And
stdio_lim.h doesn't define IOV_MAX at all.

	* bits/uio_lim.h, sysdeps/unix/sysv/linux/bits/uio_lim.h
	* misc/bits/types/struct_iovec.h, include/bits/types/struct_iovec.h
	* sysdeps/generic/sys/uio_ext.h, sysdeps/unix/sysv/linux/sys/uio_ext.h:
	New file.
	* bits/uio.h, sysdeps/unix/sysv/linux/bits/uio.h: Delete file.

	* include/bits/xopen_lim.h: Use bits/uio_lim.h to get the value
	for IOV_MAX.
	* misc/Makefile: Install sys/uio_ext.h, bits/uio_lim.h, and
	bits/types/struct_iovec.h. Don't install bits/uio.h.
	* misc/sys/uio.h: Use bits/types/struct_iovec.h to get the
	definition of struct iovec, and bits/uio_lim.h to get the value
	for UIO_MAXIOV.  Under __USE_GNU, include sys/uio_ext.h.
	* sysdeps/unix/sysv/linux/bits/fcntl-linux.h:
	Use bits/types/struct_iovec.h to get the definition of struct
	iovec.  Use __ssize_t, not ssize_t, in function prototypes.

	* stdio-common/stdio_lim.h.in: Remove logic for __need_FOPEN_MAX
	and __need_IOV_MAX.  Don't define IOV_MAX at all.
	* Makerules (stdio_lim.h): Remove logic for setting IOV_MAX.
---
 Makerules                                          | 10 +---
 bits/{uio.h => uio_lim.h}                          | 12 +++--
 include/bits/xopen_lim.h                           | 13 +++--
 misc/Makefile                                      |  3 +-
 misc/sys/uio.h                                     | 18 +++++--
 stdio-common/stdio_lim.h.in                        | 31 ++++++------
 sysdeps/generic/sys/uio_ext.h                      | 25 ++++++++++
 sysdeps/unix/sysv/linux/bits/fcntl-linux.h         | 56 +++++++++++-----------
 sysdeps/unix/sysv/linux/bits/uio_lim.h             | 31 ++++++++++++
 .../unix/sysv/linux/{bits/uio.h => sys/uio_ext.h}  | 37 ++------------
 10 files changed, 133 insertions(+), 103 deletions(-)
 rename bits/{uio.h => uio_lim.h} (79%)
 create mode 100644 sysdeps/generic/sys/uio_ext.h
 create mode 100644 sysdeps/unix/sysv/linux/bits/uio_lim.h
 rename sysdeps/unix/sysv/linux/{bits/uio.h => sys/uio_ext.h} (57%)

diff --git a/Makerules b/Makerules
index 7656c492da..f23f5b7896 100644
--- a/Makerules
+++ b/Makerules
@@ -1513,8 +1513,7 @@ $(stdio_lim:h=st): $(..)stdio-common/stdio_lim.h.in $(..)Rules \
 		   $(common-objpfx)config.make
 	$(make-target-directory)
 	{ echo '#include "$(..)posix/bits/posix1_lim.h"';		\
-	  echo '#define _LIBC 1';					\
-	  echo '#include "$(..)misc/sys/uio.h"'; } |			\
+	} |								\
 	$(CC) -E -dM -MD -MP -MF $(@:st=dT) -MT '$(@:st=h) $(@:st=d)' 	\
 	      $(CPPUNDEFS) $(+includes) -xc - -o $(@:st=hT)
 	sed $(sed-remove-objpfx) $(sed-remove-dotdot)			\
@@ -1522,21 +1521,14 @@ $(stdio_lim:h=st): $(..)stdio-common/stdio_lim.h.in $(..)Rules \
 	mv -f $(@:st=dt) $(@:st=d)
 	fopen_max=`sed -n 's/^#define OPEN_MAX //1p' $(@:st=hT)`; 	\
 	filename_max=`sed -n 's/^#define PATH_MAX //1p' $(@:st=hT)`;	\
-	iov_max=`sed -n 's/^#define UIO_MAXIOV //p' $(@:st=hT)`;	\
 	fopen_max=$${fopen_max:-16};					\
 	filename_max=$${filename_max:-1024};				\
-	if [ -z "$$iov_max" ]; then					\
-	  define_iov_max="# undef IOV_MAX";				\
-	else								\
-	  define_iov_max="# define IOV_MAX $$iov_max";			\
-	fi;								\
 	sed -e "s/@FOPEN_MAX@/$$fopen_max/"				\
 	    -e "s/@FILENAME_MAX@/$$filename_max/"			\
 	    -e "s/@L_tmpnam@/$(L_tmpnam)/"				\
 	    -e "s/@TMP_MAX@/$(TMP_MAX)/"				\
 	    -e "s/@L_ctermid@/$(L_ctermid)/"				\
 	    -e "s/@L_cuserid@/$(L_cuserid)/"				\
-	    -e "s/@define_IOV_MAX@/$$define_iov_max/"			\
 	    $< > $(@:st=h.new)
 	$(move-if-change) $(@:st=h.new) $(@:st=h)
 # Remove these last so that they can be examined if something went wrong.
diff --git a/bits/uio.h b/bits/uio_lim.h
similarity index 79%
rename from bits/uio.h
rename to bits/uio_lim.h
index 96a3a71d42..f6919f093c 100644
--- a/bits/uio.h
+++ b/bits/uio_lim.h
@@ -15,9 +15,11 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifndef _SYS_UIO_H
-# error "Never include <bits/uio.h> directly; use <sys/uio.h> instead."
+#ifndef _BITS_UIO_LIM_H
+#define _BITS_UIO_LIM_H 1
+
+/* Maximum length of the 'struct iovec' array in a single call to
+   readv or writev.  If there is no limit, the macro is not defined.  */
+#undef __IOV_MAX
+
 #endif
-
-
-#include <bits/types/struct_iovec.h>
diff --git a/include/bits/xopen_lim.h b/include/bits/xopen_lim.h
index 2ae7cb3652..4c5e62f71b 100644
--- a/include/bits/xopen_lim.h
+++ b/include/bits/xopen_lim.h
@@ -29,9 +29,6 @@
 #ifndef _XOPEN_LIM_H
 #define _XOPEN_LIM_H	1
 
-#define __need_IOV_MAX
-#include <bits/stdio_lim.h>
-
 /* We do not provide fixed values for
 
    ARG_MAX	Maximum length of argument to the `exec' function
@@ -60,10 +57,16 @@
 */
 
 
-/* Maximum number of `iovec' structures that one process has available
-   for use with `readv' or writev'.  */
+/* Maximum number of `iovec' structures that may be used in a single call
+   to `readv', `writev', etc.  */
 #define	_XOPEN_IOV_MAX	_POSIX_UIO_MAXIOV
 
+#include <bits/uio_lim.h>
+#ifdef __IOV_MAX
+# define IOV_MAX __IOV_MAX
+#else
+# undef IOV_MAX
+#endif
 
 /* Maximum value of `digit' in calls to the `printf' and `scanf'
    functions.  We have no limit, so return a reasonable value.  */
diff --git a/misc/Makefile b/misc/Makefile
index 2db1fd8397..74b40e988f 100644
--- a/misc/Makefile
+++ b/misc/Makefile
@@ -23,7 +23,8 @@ subdir	:= misc
 
 include ../Makeconfig
 
-headers	:= sys/uio.h bits/uio.h sys/ioctl.h bits/ioctls.h bits/ioctl-types.h \
+headers	:= sys/uio.h sys/uio_ext.h bits/uio_lim.h \
+	   sys/ioctl.h bits/ioctls.h bits/ioctl-types.h \
 	   sys/ptrace.h sys/file.h sys/dir.h sys/cdefs.h \
 	   ar.h a.out.h libgen.h stab.h bits/stab.def sgtty.h \
 	   ttyent.h paths.h sys/reboot.h \
diff --git a/misc/sys/uio.h b/misc/sys/uio.h
index e80f0136c9..9ad7615a4f 100644
--- a/misc/sys/uio.h
+++ b/misc/sys/uio.h
@@ -19,15 +19,17 @@
 #define _SYS_UIO_H	1
 
 #include <features.h>
-
 #include <sys/types.h>
+#include <bits/types/struct_iovec.h>
+#include <bits/uio_lim.h>
+#ifdef __IOV_MAX
+# define UIO_MAXIOV __IOV_MAX
+#else
+# undef UIO_MAXIOV
+#endif
 
 __BEGIN_DECLS
 
-/* This file defines `struct iovec'.  */
-#include <bits/uio.h>
-
-
 /* Read data from file descriptor FD, and put the result in the
    buffers described by IOVEC, which is a vector of COUNT 'struct iovec's.
    The buffers are filled in the order specified.
@@ -119,4 +121,10 @@ extern ssize_t pwritev64 (int __fd, const struct iovec *__iovec, int __count,
 
 __END_DECLS
 
+/* Some operating systems provide system-specific extensions to this
+   header.  */
+#ifdef __USE_GNU
+# include <sys/uio_ext.h>
+#endif
+
 #endif /* sys/uio.h */
diff --git a/stdio-common/stdio_lim.h.in b/stdio-common/stdio_lim.h.in
index 510bf008aa..5288907469 100644
--- a/stdio-common/stdio_lim.h.in
+++ b/stdio-common/stdio_lim.h.in
@@ -15,28 +15,25 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#if !defined _STDIO_H && !defined __need_FOPEN_MAX && !defined __need_IOV_MAX
+#ifndef _BITS_STDIO_LIM_H
+#define _BITS_STDIO_LIM_H 1
+
+#ifndef _STDIO_H
 # error "Never include <bits/stdio_lim.h> directly; use <stdio.h> instead."
 #endif
 
-#ifdef _STDIO_H
-# define L_tmpnam @L_tmpnam@
-# define TMP_MAX @TMP_MAX@
-# define FILENAME_MAX @FILENAME_MAX@
+#define L_tmpnam @L_tmpnam@
+#define TMP_MAX @TMP_MAX@
+#define FILENAME_MAX @FILENAME_MAX@
 
-# ifdef __USE_POSIX
-#  define L_ctermid @L_ctermid@
-#  if !defined __USE_XOPEN2K || defined __USE_GNU
-#   define L_cuserid @L_cuserid@
-#  endif
+#ifdef __USE_POSIX
+# define L_ctermid @L_ctermid@
+# if !defined __USE_XOPEN2K || defined __USE_GNU
+#  define L_cuserid @L_cuserid@
 # endif
 #endif
 
-#if defined __need_FOPEN_MAX || defined _STDIO_H
-# undef  FOPEN_MAX
-# define FOPEN_MAX @FOPEN_MAX@
-#endif
+#undef  FOPEN_MAX
+#define FOPEN_MAX @FOPEN_MAX@
 
-#if defined __need_IOV_MAX && !defined IOV_MAX
-@define_IOV_MAX@
-#endif
+#endif /* bits/stdio_lim.h */
diff --git a/sysdeps/generic/sys/uio_ext.h b/sysdeps/generic/sys/uio_ext.h
new file mode 100644
index 0000000000..bd49003a7c
--- /dev/null
+++ b/sysdeps/generic/sys/uio_ext.h
@@ -0,0 +1,25 @@
+/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SYS_UIO_EXT_H
+#define _SYS_UIO_EXT_H 1
+
+#include <sys/uio.h>
+
+/* This operating system does not extend sys/uio.h.  */
+
+#endif /* sys/uio_ext.h */
diff --git a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
index 59d663196a..f68b2f22f6 100644
--- a/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
+++ b/sysdeps/unix/sysv/linux/bits/fcntl-linux.h
@@ -35,10 +35,10 @@
 */
 
 #ifdef __USE_GNU
-# include <bits/uio.h>
+# include <bits/types/struct_iovec.h>
 #endif
 
-/* open/fcntl.  */
+/* open/fcntl.	*/
 #define O_ACCMODE	   0003
 #define O_RDONLY	     00
 #define O_WRONLY	     01
@@ -76,7 +76,7 @@
 #endif
 
 #ifndef __O_DIRECTORY
-# define __O_DIRECTORY  0200000
+# define __O_DIRECTORY	0200000
 #endif
 #ifndef __O_NOFOLLOW
 # define __O_NOFOLLOW	0400000
@@ -104,7 +104,7 @@
 # ifndef __USE_FILE_OFFSET64
 #  define F_GETLK	5	/* Get record locking info.  */
 #  define F_SETLK	6	/* Set record locking info (non-blocking).  */
-#  define F_SETLKW	7	/* Set record locking info (blocking).	*/
+#  define F_SETLKW	7	/* Set record locking info (blocking).  */
 # else
 #  define F_GETLK	F_GETLK64  /* Get record locking info.	*/
 #  define F_SETLK	F_SETLK64  /* Set record locking info (non-blocking).*/
@@ -114,7 +114,7 @@
 #ifndef F_GETLK64
 # define F_GETLK64	12	/* Get record locking info.  */
 # define F_SETLK64	13	/* Set record locking info (non-blocking).  */
-# define F_SETLKW64	14	/* Set record locking info (blocking).	*/
+# define F_SETLKW64	14	/* Set record locking info (blocking).  */
 #endif
 
 /* open file description locks.
@@ -139,27 +139,27 @@
 #endif
 
 #ifdef __USE_XOPEN2K8
-# define O_DIRECTORY	__O_DIRECTORY	/* Must be a directory.	 */
-# define O_NOFOLLOW	__O_NOFOLLOW	/* Do not follow links.	 */
+# define O_DIRECTORY	__O_DIRECTORY	/* Must be a directory.  */
+# define O_NOFOLLOW	__O_NOFOLLOW	/* Do not follow links.  */
 # define O_CLOEXEC	__O_CLOEXEC	/* Set close_on_exec.  */
 #endif
 
 #ifdef __USE_GNU
-# define O_DIRECT	__O_DIRECT	/* Direct disk access.	*/
+# define O_DIRECT	__O_DIRECT	/* Direct disk access.  */
 # define O_NOATIME	__O_NOATIME	/* Do not set atime.  */
 # define O_PATH		__O_PATH	/* Resolve pathname but do not open file.  */
 # define O_TMPFILE	__O_TMPFILE	/* Atomically create nameless file.  */
 #endif
 
-/* For now, Linux has no separate synchronicitiy options for read
+/* For now, Linux has no separate synchronicity options for read
    operations.  We define O_RSYNC therefore as the same as O_SYNC
    since this is a superset.  */
 #if defined __USE_POSIX199309 || defined __USE_UNIX98
 # define O_DSYNC	__O_DSYNC	/* Synchronize data.  */
 # if defined __O_RSYNC
-#  define O_RSYNC	__O_RSYNC	/* Synchronize read operations.	 */
+#  define O_RSYNC	__O_RSYNC	/* Synchronize read operations.  */
 # else
-#  define O_RSYNC	O_SYNC		/* Synchronize read operations.	 */
+#  define O_RSYNC	O_SYNC		/* Synchronize read operations.  */
 # endif
 #endif
 
@@ -197,7 +197,7 @@
 #endif
 
 #ifdef __USE_GNU
-# define F_SETLEASE	1024	/* Set a lease.	 */
+# define F_SETLEASE	1024	/* Set a lease.  */
 # define F_GETLEASE	1025	/* Enquire what lease is active.  */
 # define F_NOTIFY	1026	/* Request notifications on a directory.  */
 # define F_SETPIPE_SZ	1031	/* Set pipe page size array.  */
@@ -214,8 +214,8 @@
 #ifndef F_RDLCK
 /* For posix fcntl() and `l_type' field of a `struct flock' for lockf().  */
 # define F_RDLCK		0	/* Read lock.  */
-# define F_WRLCK		1	/* Write lock.	*/
-# define F_UNLCK		2	/* Remove lock.	 */
+# define F_WRLCK		1	/* Write lock.  */
+# define F_UNLCK		2	/* Remove lock.  */
 #endif
 
 
@@ -236,9 +236,9 @@
 
 #ifdef __USE_GNU
 # define LOCK_MAND	32	/* This is a mandatory flock:	*/
-# define LOCK_READ	64	/* ... which allows concurrent read operations.	 */
+# define LOCK_READ	64	/* ... which allows concurrent read operations.  */
 # define LOCK_WRITE	128	/* ... which allows concurrent write operations.  */
-# define LOCK_RW	192	/* ... Which allows concurrent read & write operations.	 */
+# define LOCK_RW	192	/* ... Which allows concurrent read & write operations.  */
 #endif
 
 #ifdef __USE_GNU
@@ -260,7 +260,7 @@ enum __pid_type
     F_OWNER_TID = 0,		/* Kernel thread.  */
     F_OWNER_PID,		/* Process.  */
     F_OWNER_PGRP,		/* Process group.  */
-    F_OWNER_GID = F_OWNER_PGRP	/* Alternative, obsolete name.  */
+    F_OWNER_GID = F_OWNER_PGRP	/* Alternative, obsolete name.	*/
   };
 
 /* Structure to use with F_GETOWN_EX and F_SETOWN_EX.  */
@@ -289,7 +289,7 @@ struct f_owner_ex
 #ifdef __USE_XOPEN2K
 # define POSIX_FADV_NORMAL	0 /* No further special treatment.  */
 # define POSIX_FADV_RANDOM	1 /* Expect random page references.  */
-# define POSIX_FADV_SEQUENTIAL	2 /* Expect sequential page references.	 */
+# define POSIX_FADV_SEQUENTIAL	2 /* Expect sequential page references.  */
 # define POSIX_FADV_WILLNEED	3 /* Will need these pages.  */
 # define POSIX_FADV_DONTNEED	__POSIX_FADV_DONTNEED /* Don't need these pages.  */
 # define POSIX_FADV_NOREUSE	__POSIX_FADV_NOREUSE /* Data will be accessed once.  */
@@ -312,9 +312,9 @@ struct f_owner_ex
 # define SPLICE_F_MOVE		1	/* Move pages instead of copying.  */
 # define SPLICE_F_NONBLOCK	2	/* Don't block on the pipe splicing
 					   (but we may still block on the fd
-					   we splice from/to).  */
+					   we splice from/to).	*/
 # define SPLICE_F_MORE		4	/* Expect more data.  */
-# define SPLICE_F_GIFT		8	/* Pages passed in are a gift.  */
+# define SPLICE_F_GIFT		8	/* Pages passed in are a gift.	*/
 
 
 /* Flags for fallocate.  */
@@ -339,7 +339,7 @@ __BEGIN_DECLS
 #ifdef __USE_GNU
 
 /* Provide kernel hint to read ahead.  */
-extern ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
+extern __ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
     __THROW;
 
 
@@ -355,23 +355,23 @@ extern int sync_file_range (int __fd, __off64_t __offset, __off64_t __count,
 
    This function is a possible cancellation point and therefore not
    marked with __THROW.  */
-extern ssize_t vmsplice (int __fdout, const struct iovec *__iov,
-			 size_t __count, unsigned int __flags);
+extern __ssize_t vmsplice (int __fdout, const struct iovec *__iov,
+			   size_t __count, unsigned int __flags);
 
 /* Splice two files together.
 
    This function is a possible cancellation point and therefore not
    marked with __THROW.  */
-extern ssize_t splice (int __fdin, __off64_t *__offin, int __fdout,
-		       __off64_t *__offout, size_t __len,
-		       unsigned int __flags);
+extern __ssize_t splice (int __fdin, __off64_t *__offin, int __fdout,
+			 __off64_t *__offout, size_t __len,
+			 unsigned int __flags);
 
 /* In-kernel implementation of tee for pipe buffers.
 
    This function is a possible cancellation point and therefore not
    marked with __THROW.  */
-extern ssize_t tee (int __fdin, int __fdout, size_t __len,
-		    unsigned int __flags);
+extern __ssize_t tee (int __fdin, int __fdout, size_t __len,
+		      unsigned int __flags);
 
 /* Reserve storage for the data of the file associated with FD.
 
diff --git a/sysdeps/unix/sysv/linux/bits/uio_lim.h b/sysdeps/unix/sysv/linux/bits/uio_lim.h
new file mode 100644
index 0000000000..7c69b93d31
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/uio_lim.h
@@ -0,0 +1,31 @@
+/* Copyright (C) 1996-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _BITS_UIO_LIM_H
+#define _BITS_UIO_LIM_H 1
+
+/* Maximum length of the 'struct iovec' array in a single call to
+   readv or writev.
+
+   This macro has different values in different kernel versions.  The
+   latest versions of the kernel use 1024 and this is good choice.  Since
+   the C library implementation of readv/writev is able to emulate the
+   functionality even if the currently running kernel does not support
+   this large value the readv/writev call will not fail because of this.  */
+#define __IOV_MAX	1024
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/bits/uio.h b/sysdeps/unix/sysv/linux/sys/uio_ext.h
similarity index 57%
rename from sysdeps/unix/sysv/linux/bits/uio.h
rename to sysdeps/unix/sysv/linux/sys/uio_ext.h
index 1583f0455b..3999e91e5a 100644
--- a/sysdeps/unix/sysv/linux/bits/uio.h
+++ b/sysdeps/unix/sysv/linux/sys/uio_ext.h
@@ -15,38 +15,10 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#if !defined _SYS_UIO_H && !defined _FCNTL_H
-# error "Never include <bits/uio.h> directly; use <sys/uio.h> instead."
-#endif
+#ifndef _SYS_UIO_EXT_H
+#define _SYS_UIO_EXT_H 1
 
-#ifndef _BITS_UIO_H
-#define _BITS_UIO_H	1
-
-#include <sys/types.h>
-
-
-/* We should normally use the Linux kernel header file to define this
-   type and macros but this calls for trouble because of the header
-   includes other kernel headers.  */
-
-/* Size of object which can be written atomically.
-
-   This macro has different values in different kernel versions.  The
-   latest versions of the kernel use 1024 and this is good choice.  Since
-   the C library implementation of readv/writev is able to emulate the
-   functionality even if the currently running kernel does not support
-   this large value the readv/writev call will not fail because of this.  */
-#define UIO_MAXIOV	1024
-
-
-#include <bits/types/struct_iovec.h>
-
-#endif
-
-
-#ifdef __USE_GNU
-# if defined _SYS_UIO_H && !defined _BITS_UIO_H_FOR_SYS_UIO_H
-#  define _BITS_UIO_H_FOR_SYS_UIO_H 1
+#include <sys/uio.h>
 
 __BEGIN_DECLS
 
@@ -68,5 +40,4 @@ extern ssize_t process_vm_writev (pid_t __pid, const struct iovec *__lvec,
 
 __END_DECLS
 
-# endif
-#endif
+#endif /* sys/uio_ext.h */
-- 
2.11.0

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 6/6] Remove __need_schedparam and __cpu_set_t_defined.
  2017-05-20 23:18 [PATCH 0/6] Elimination of __need macros, round 3(?) Zack Weinberg
  2017-05-20 23:18 ` [PATCH 3/6] Remove __need macros from errno.h (__need_Emath, __need_error_t) Zack Weinberg
  2017-05-20 23:18 ` [PATCH 1/6] Committed: Remove __need_list_t and __need_res_state Zack Weinberg
@ 2017-05-20 23:18 ` Zack Weinberg
  2017-05-20 23:18 ` [PATCH 2/6] Committed: Remove __need macros from signal.h Zack Weinberg
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: Zack Weinberg @ 2017-05-20 23:18 UTC (permalink / raw)
  To: libc-alpha

bits/sched.h has logic to expose only an impl-namespace variant of
struct sched_param (i.e. struct __sched_param), but nothing uses it,
and the only header that includes bits/sched.h is sched.h.  The
__need_schedparam logic can therefore be removed.

bits/sched.h also has a great deal of code relating to cpu_set_t
objects that was *almost* the same between the two versions of
bits/sched.h in the tree; a little spelunking indicated that this is
because some bug fixes got applied to the Linux-specific bits/sched.h
but not the generic one.  Introduce a new header, bits/cpu-set.h,
containing the version of that code with the bugfixes, have sched.h
include it directly, and delete all of the code from both versions of
bits/sched.h.

Also remove the unnecessary name mangling in the definition of struct
sched_param -- POSIX specifies a field 'sched_priority', so there is
no reason to define it as '__sched_priority' and then paper over that
with a macro.  (Just in case someone was using the internal name,
'sched_priority' remains a macro defined to expand to itself, and
'__sched_priority' now expands to 'sched_priority'.)

Finally, as long as I'm touching these files anyway, merge new
constants from linux/sched.h into the Linux bits/sched.h.

	* bits/sched.h: Remove __need_schedparam logic and replace with a
	normal multiple-include guard.  Change field name in struct
	sched_param from __sched_priority to sched_priority.  Delete
	everything under #ifndef __cpu_set_t_defined.
	* sysdeps/unix/sysv/linux/bits/sched.h: Likewise.  Also sync with
	kernel sched.h, adding SCHED_ISO and SCHED_DEADLINE constants.

	* posix/sched.h: Include bits/cpu-set.h as well as bits/sched.h.
	For compatibility, #define sched_priority to itself, and #define
	__sched_priority as sched_priority.
	* posix/bits/cpu-set.h: New file containing, verbatim, the code
	that was under #ifndef __cpu_set_t_defined in
	sysdeps/unix/sysv/linux/bits/sched.h.
	* include/bits/cpu-set.h: New wrapper.
	* posix/Makefile: Install bits/cpu-set.h.
---
 bits/sched.h                         | 121 ++------------------------------
 include/bits/cpu-set.h               |   1 +
 posix/Makefile                       |   4 +-
 posix/bits/cpu-set.h                 | 124 +++++++++++++++++++++++++++++++++
 posix/sched.h                        |   8 ++-
 sysdeps/unix/sysv/linux/bits/sched.h | 130 +++--------------------------------
 6 files changed, 145 insertions(+), 243 deletions(-)
 create mode 100644 include/bits/cpu-set.h
 create mode 100644 posix/bits/cpu-set.h

diff --git a/bits/sched.h b/bits/sched.h
index c36c569db3..0588f3142e 100644
--- a/bits/sched.h
+++ b/bits/sched.h
@@ -17,13 +17,13 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifndef __need_schedparam
+#ifndef _BITS_SCHED_H
+#define _BITS_SCHED_H 1
 
 #ifndef _SCHED_H
 # error "Never include <bits/sched.h> directly; use <sched.h> instead."
 #endif
 
-
 /* Scheduling algorithms.  */
 #define SCHED_OTHER	0
 #define SCHED_FIFO	1
@@ -32,120 +32,7 @@
 /* Data structure to describe a process' schedulability.  */
 struct sched_param
 {
-  int __sched_priority;
+  int sched_priority;
 };
 
-#endif	/* need schedparam */
-
-#if !defined __defined_schedparam \
-    && (defined __need_schedparam || defined _SCHED_H)
-# define __defined_schedparam	1
-/* Data structure to describe a process' schedulability.  */
-struct __sched_param
-  {
-    int __sched_priority;
-  };
-# undef __need_schedparam
-#endif
-
-
-#if defined _SCHED_H && !defined __cpu_set_t_defined
-# define __cpu_set_t_defined
-/* Size definition for CPU sets.  */
-# define __CPU_SETSIZE	1024
-# define __NCPUBITS	(8 * sizeof (__cpu_mask))
-
-/* Type for array elements in 'cpu_set_t'.  */
-typedef unsigned long int __cpu_mask;
-
-/* Basic access functions.  */
-# define __CPUELT(cpu)	((cpu) / __NCPUBITS)
-# define __CPUMASK(cpu)	((__cpu_mask) 1 << ((cpu) % __NCPUBITS))
-
-/* Data structure to describe CPU mask.  */
-typedef struct
-{
-  __cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS];
-} cpu_set_t;
-
-/* Access functions for CPU masks.  */
-# if __GNUC_PREREQ (2, 91)
-#  define __CPU_ZERO_S(setsize, cpusetp) \
-  do __builtin_memset (cpusetp, '\0', setsize); while (0)
-# else
-#  define __CPU_ZERO_S(setsize, cpusetp) \
-  do {									      \
-    size_t __i;								      \
-    size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
-    __cpu_mask *__bits = (cpusetp)->__bits;				      \
-    for (__i = 0; __i < __imax; ++__i)					      \
-      __bits[__i] = 0;							      \
-  } while (0)
-# endif
-# define __CPU_SET_S(cpu, setsize, cpusetp) \
-  (__extension__							      \
-   ({ size_t __cpu = (cpu);						      \
-      __cpu < 8 * (setsize)						      \
-      ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]		      \
-	 |= __CPUMASK (__cpu))						      \
-      : 0; }))
-# define __CPU_CLR_S(cpu, setsize, cpusetp) \
-  (__extension__							      \
-   ({ size_t __cpu = (cpu);						      \
-      __cpu < 8 * (setsize)						      \
-      ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]		      \
-	 &= ~__CPUMASK (__cpu))						      \
-      : 0; }))
-# define __CPU_ISSET_S(cpu, setsize, cpusetp) \
-  (__extension__							      \
-   ({ size_t __cpu = (cpu);						      \
-      __cpu < 8 * (setsize)						      \
-      ? ((((const __cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]      \
-	  & __CPUMASK (__cpu))) != 0					      \
-      : 0; }))
-
-# define __CPU_COUNT_S(setsize, cpusetp) \
-  __sched_cpucount (setsize, cpusetp)
-
-# if __GNUC_PREREQ (2, 91)
-#  define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
-  (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0)
-# else
-#  define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
-  (__extension__							      \
-   ({ const __cpu_mask *__arr1 = (cpusetp1)->__bits;			      \
-      const __cpu_mask *__arr2 = (cpusetp2)->__bits;			      \
-      size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
-      size_t __i;							      \
-      for (__i = 0; __i < __imax; ++__i)				      \
-	if (__arr1[__i] != __arr2[__i])					      \
-	  break;							      \
-      __i == __imax; }))
-# endif
-
-# define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \
-  (__extension__							      \
-   ({ cpu_set_t *__dest = (destset);					      \
-      const __cpu_mask *__arr1 = (srcset1)->__bits;			      \
-      const __cpu_mask *__arr2 = (srcset2)->__bits;			      \
-      size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
-      size_t __i;							      \
-      for (__i = 0; __i < __imax; ++__i)				      \
-	((__cpu_mask *) __dest->__bits)[__i] = __arr1[__i] op __arr2[__i];    \
-      __dest; }))
-
-# define __CPU_ALLOC_SIZE(count) \
-  ((((count) + __NCPUBITS - 1) / __NCPUBITS) * sizeof (__cpu_mask))
-# define __CPU_ALLOC(count) __sched_cpualloc (count)
-# define __CPU_FREE(cpuset) __sched_cpufree (cpuset)
-
-__BEGIN_DECLS
-
-extern int __sched_cpucount (size_t __setsize, const cpu_set_t *__setp)
-     __THROW;
-extern cpu_set_t *__sched_cpualloc (size_t __count) __THROW __wur;
-extern void __sched_cpufree (cpu_set_t *__set) __THROW;
-
-__END_DECLS
-
-#endif
+#endif /* bits/sched.h */
diff --git a/include/bits/cpu-set.h b/include/bits/cpu-set.h
new file mode 100644
index 0000000000..388f03cfbd
--- /dev/null
+++ b/include/bits/cpu-set.h
@@ -0,0 +1 @@
+#include <posix/bits/cpu-set.h>
diff --git a/posix/Makefile b/posix/Makefile
index 52b022cf66..1c328b81af 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -30,8 +30,8 @@ headers	:= sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h	      \
 	   bits/posix1_lim.h bits/posix2_lim.h bits/posix_opt.h		      \
 	   bits/local_lim.h tar.h bits/utsname.h bits/confname.h	      \
 	   bits/waitflags.h bits/waitstatus.h sys/unistd.h sched.h	      \
-	   bits/sched.h re_comp.h wait.h bits/environments.h cpio.h	      \
-	   spawn.h bits/unistd.h
+	   bits/sched.h bits/cpu-set.h re_comp.h wait.h bits/environments.h   \
+	   cpio.h spawn.h bits/unistd.h
 
 routines :=								      \
 	uname								      \
diff --git a/posix/bits/cpu-set.h b/posix/bits/cpu-set.h
new file mode 100644
index 0000000000..f9b11b9714
--- /dev/null
+++ b/posix/bits/cpu-set.h
@@ -0,0 +1,124 @@
+/* Definition of the cpu_set_t structure used by the POSIX 1003.1b-1993
+   scheduling interface.
+   Copyright (C) 1996-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _BITS_CPU_SET_H
+#define _BITS_CPU_SET_H 1
+
+#ifndef _SCHED_H
+# error "Never include <bits/cpu-set.h> directly; use <sched.h> instead."
+#endif
+
+/* Size definition for CPU sets.  */
+# define __CPU_SETSIZE	1024
+# define __NCPUBITS	(8 * sizeof (__cpu_mask))
+
+/* Type for array elements in 'cpu_set_t'.  */
+typedef __CPU_MASK_TYPE __cpu_mask;
+
+/* Basic access functions.  */
+# define __CPUELT(cpu)	((cpu) / __NCPUBITS)
+# define __CPUMASK(cpu)	((__cpu_mask) 1 << ((cpu) % __NCPUBITS))
+
+/* Data structure to describe CPU mask.  */
+typedef struct
+{
+  __cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS];
+} cpu_set_t;
+
+/* Access functions for CPU masks.  */
+# if __GNUC_PREREQ (2, 91)
+#  define __CPU_ZERO_S(setsize, cpusetp) \
+  do __builtin_memset (cpusetp, '\0', setsize); while (0)
+# else
+#  define __CPU_ZERO_S(setsize, cpusetp) \
+  do {									      \
+    size_t __i;								      \
+    size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
+    __cpu_mask *__bits = (cpusetp)->__bits;				      \
+    for (__i = 0; __i < __imax; ++__i)					      \
+      __bits[__i] = 0;							      \
+  } while (0)
+# endif
+# define __CPU_SET_S(cpu, setsize, cpusetp) \
+  (__extension__							      \
+   ({ size_t __cpu = (cpu);						      \
+      __cpu / 8 < (setsize)						      \
+      ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]		      \
+	 |= __CPUMASK (__cpu))						      \
+      : 0; }))
+# define __CPU_CLR_S(cpu, setsize, cpusetp) \
+  (__extension__							      \
+   ({ size_t __cpu = (cpu);						      \
+      __cpu / 8 < (setsize)						      \
+      ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]		      \
+	 &= ~__CPUMASK (__cpu))						      \
+      : 0; }))
+# define __CPU_ISSET_S(cpu, setsize, cpusetp) \
+  (__extension__							      \
+   ({ size_t __cpu = (cpu);						      \
+      __cpu / 8 < (setsize)						      \
+      ? ((((const __cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]	      \
+	  & __CPUMASK (__cpu))) != 0					      \
+      : 0; }))
+
+# define __CPU_COUNT_S(setsize, cpusetp) \
+  __sched_cpucount (setsize, cpusetp)
+
+# if __GNUC_PREREQ (2, 91)
+#  define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
+  (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0)
+# else
+#  define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
+  (__extension__							      \
+   ({ const __cpu_mask *__arr1 = (cpusetp1)->__bits;			      \
+      const __cpu_mask *__arr2 = (cpusetp2)->__bits;			      \
+      size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
+      size_t __i;							      \
+      for (__i = 0; __i < __imax; ++__i)				      \
+	if (__arr1[__i] != __arr2[__i])					      \
+	  break;							      \
+      __i == __imax; }))
+# endif
+
+# define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \
+  (__extension__							      \
+   ({ cpu_set_t *__dest = (destset);					      \
+      const __cpu_mask *__arr1 = (srcset1)->__bits;			      \
+      const __cpu_mask *__arr2 = (srcset2)->__bits;			      \
+      size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
+      size_t __i;							      \
+      for (__i = 0; __i < __imax; ++__i)				      \
+	((__cpu_mask *) __dest->__bits)[__i] = __arr1[__i] op __arr2[__i];    \
+      __dest; }))
+
+# define __CPU_ALLOC_SIZE(count) \
+  ((((count) + __NCPUBITS - 1) / __NCPUBITS) * sizeof (__cpu_mask))
+# define __CPU_ALLOC(count) __sched_cpualloc (count)
+# define __CPU_FREE(cpuset) __sched_cpufree (cpuset)
+
+__BEGIN_DECLS
+
+extern int __sched_cpucount (size_t __setsize, const cpu_set_t *__setp)
+     __THROW;
+extern cpu_set_t *__sched_cpualloc (size_t __count) __THROW __wur;
+extern void __sched_cpufree (cpu_set_t *__set) __THROW;
+
+__END_DECLS
+
+#endif /* bits/cpu-set.h */
diff --git a/posix/sched.h b/posix/sched.h
index 7037ab398d..d5cdac37b0 100644
--- a/posix/sched.h
+++ b/posix/sched.h
@@ -39,11 +39,13 @@ typedef __pid_t pid_t;
 # define __pid_t_defined
 #endif
 
-
 /* Get system specific constant and data structure definitions.  */
 #include <bits/sched.h>
-/* Define the real names for the elements of `struct sched_param'.  */
-#define sched_priority	__sched_priority
+#include <bits/cpu-set.h>
+
+/* Backward compatibility.  */
+#define sched_priority    sched_priority
+#define __sched_priority  sched_priority
 
 
 __BEGIN_DECLS
diff --git a/sysdeps/unix/sysv/linux/bits/sched.h b/sysdeps/unix/sysv/linux/bits/sched.h
index cc0d698f34..6d23e94ae6 100644
--- a/sysdeps/unix/sysv/linux/bits/sched.h
+++ b/sysdeps/unix/sysv/linux/bits/sched.h
@@ -17,20 +17,22 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifndef __need_schedparam
+#ifndef _BITS_SCHED_H
+#define _BITS_SCHED_H 1
 
 #ifndef _SCHED_H
 # error "Never include <bits/sched.h> directly; use <sched.h> instead."
 #endif
 
-
 /* Scheduling algorithms.  */
 #define SCHED_OTHER		0
 #define SCHED_FIFO		1
 #define SCHED_RR		2
 #ifdef __USE_GNU
 # define SCHED_BATCH		3
+# define SCHED_ISO		4
 # define SCHED_IDLE		5
+# define SCHED_DEADLINE		6
 
 # define SCHED_RESET_ON_FORK	0x40000000
 #endif
@@ -69,11 +71,11 @@
 # define CLONE_IO	0x80000000	/* Clone I/O context.  */
 #endif
 
-/* The official definition.  */
+/* Data structure to describe a process' schedulability.  */
 struct sched_param
-  {
-    int __sched_priority;
-  };
+{
+  int sched_priority;
+};
 
 __BEGIN_DECLS
 
@@ -92,120 +94,6 @@ extern int sched_getcpu (void) __THROW;
 extern int setns (int __fd, int __nstype) __THROW;
 #endif
 
-
 __END_DECLS
 
-#endif	/* need schedparam */
-
-#if !defined __defined_schedparam \
-    && (defined __need_schedparam || defined _SCHED_H)
-# define __defined_schedparam	1
-/* Data structure to describe a process' schedulability.  */
-struct __sched_param
-  {
-    int __sched_priority;
-  };
-# undef __need_schedparam
-#endif
-
-
-#if defined _SCHED_H && !defined __cpu_set_t_defined
-# define __cpu_set_t_defined
-/* Size definition for CPU sets.  */
-# define __CPU_SETSIZE	1024
-# define __NCPUBITS	(8 * sizeof (__cpu_mask))
-
-/* Type for array elements in 'cpu_set_t'.  */
-typedef __CPU_MASK_TYPE __cpu_mask;
-
-/* Basic access functions.  */
-# define __CPUELT(cpu)	((cpu) / __NCPUBITS)
-# define __CPUMASK(cpu)	((__cpu_mask) 1 << ((cpu) % __NCPUBITS))
-
-/* Data structure to describe CPU mask.  */
-typedef struct
-{
-  __cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS];
-} cpu_set_t;
-
-/* Access functions for CPU masks.  */
-# if __GNUC_PREREQ (2, 91)
-#  define __CPU_ZERO_S(setsize, cpusetp) \
-  do __builtin_memset (cpusetp, '\0', setsize); while (0)
-# else
-#  define __CPU_ZERO_S(setsize, cpusetp) \
-  do {									      \
-    size_t __i;								      \
-    size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
-    __cpu_mask *__bits = (cpusetp)->__bits;				      \
-    for (__i = 0; __i < __imax; ++__i)					      \
-      __bits[__i] = 0;							      \
-  } while (0)
-# endif
-# define __CPU_SET_S(cpu, setsize, cpusetp) \
-  (__extension__							      \
-   ({ size_t __cpu = (cpu);						      \
-      __cpu / 8 < (setsize)						      \
-      ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]		      \
-	 |= __CPUMASK (__cpu))						      \
-      : 0; }))
-# define __CPU_CLR_S(cpu, setsize, cpusetp) \
-  (__extension__							      \
-   ({ size_t __cpu = (cpu);						      \
-      __cpu / 8 < (setsize)						      \
-      ? (((__cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]		      \
-	 &= ~__CPUMASK (__cpu))						      \
-      : 0; }))
-# define __CPU_ISSET_S(cpu, setsize, cpusetp) \
-  (__extension__							      \
-   ({ size_t __cpu = (cpu);						      \
-      __cpu / 8 < (setsize)						      \
-      ? ((((const __cpu_mask *) ((cpusetp)->__bits))[__CPUELT (__cpu)]	      \
-	  & __CPUMASK (__cpu))) != 0					      \
-      : 0; }))
-
-# define __CPU_COUNT_S(setsize, cpusetp) \
-  __sched_cpucount (setsize, cpusetp)
-
-# if __GNUC_PREREQ (2, 91)
-#  define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
-  (__builtin_memcmp (cpusetp1, cpusetp2, setsize) == 0)
-# else
-#  define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
-  (__extension__							      \
-   ({ const __cpu_mask *__arr1 = (cpusetp1)->__bits;			      \
-      const __cpu_mask *__arr2 = (cpusetp2)->__bits;			      \
-      size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
-      size_t __i;							      \
-      for (__i = 0; __i < __imax; ++__i)				      \
-	if (__arr1[__i] != __arr2[__i])					      \
-	  break;							      \
-      __i == __imax; }))
-# endif
-
-# define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \
-  (__extension__							      \
-   ({ cpu_set_t *__dest = (destset);					      \
-      const __cpu_mask *__arr1 = (srcset1)->__bits;			      \
-      const __cpu_mask *__arr2 = (srcset2)->__bits;			      \
-      size_t __imax = (setsize) / sizeof (__cpu_mask);			      \
-      size_t __i;							      \
-      for (__i = 0; __i < __imax; ++__i)				      \
-	((__cpu_mask *) __dest->__bits)[__i] = __arr1[__i] op __arr2[__i];    \
-      __dest; }))
-
-# define __CPU_ALLOC_SIZE(count) \
-  ((((count) + __NCPUBITS - 1) / __NCPUBITS) * sizeof (__cpu_mask))
-# define __CPU_ALLOC(count) __sched_cpualloc (count)
-# define __CPU_FREE(cpuset) __sched_cpufree (cpuset)
-
-__BEGIN_DECLS
-
-extern int __sched_cpucount (size_t __setsize, const cpu_set_t *__setp)
-  __THROW;
-extern cpu_set_t *__sched_cpualloc (size_t __count) __THROW __wur;
-extern void __sched_cpufree (cpu_set_t *__set) __THROW;
-
-__END_DECLS
-
-#endif
+#endif /* bits/sched.h */
-- 
2.11.0

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/6] Committed: Remove __need macros from signal.h.
  2017-05-20 23:18 ` [PATCH 2/6] Committed: Remove __need macros from signal.h Zack Weinberg
@ 2017-05-21  7:19   ` Andreas Schwab
  2017-05-21 13:55     ` Zack Weinberg
  2017-05-22 11:18   ` Joseph Myers
  1 sibling, 1 reply; 14+ messages in thread
From: Andreas Schwab @ 2017-05-21  7:19 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: libc-alpha

On Mai 20 2017, Zack Weinberg <zackw@panix.com> wrote:

> 	* signal/bits/types/sig_atomic_t.h
> 	* signal/bits/types/sigset_t.h
> 	* signal/bits/types/sigval_t.h:
> 	New non-system-dependent bits headers.

/usr/include/bits/types/siginfo_t.h:6:33: fatal error: bits/types/sigval_t.h: No such file or directory
 #include <bits/types/sigval_t.h>

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/6] Committed: Remove __need macros from signal.h.
  2017-05-21  7:19   ` Andreas Schwab
@ 2017-05-21 13:55     ` Zack Weinberg
  0 siblings, 0 replies; 14+ messages in thread
From: Zack Weinberg @ 2017-05-21 13:55 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: GNU C Library

On Sun, May 21, 2017 at 3:19 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
>
> /usr/include/bits/types/siginfo_t.h:6:33: fatal error: bits/types/sigval_t.h: No such file or directory
>  #include <bits/types/sigval_t.h>

Fixed by appended patch.

Given the difficulty of test-installing glibc and then testing
compilation with it, I would have appreciated somewhat more
explanation of what the problem was, e.g. including the words "Any
program that includes signal.h fails to compile against an installed
glibc with this patch applied" in your message would have saved me
from a couple of false leads.

zw

    * signal/Makefile (headers): Add bits/types/sigval_t.h.
---
 ChangeLog       | 4 ++++
 signal/Makefile | 4 ++--
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 62341b8ed3..ce060eb8de 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2017-05-21  Zack Weinberg  <zackw@panix.com>
+
+    * signal/Makefile (headers): Add bits/types/sigval_t.h.
+
 2017-05-20  Zack Weinberg  <zackw@panix.com>

     * bits/sigevent-consts.h
diff --git a/signal/Makefile b/signal/Makefile
index de92558f2c..9ce8232d43 100644
--- a/signal/Makefile
+++ b/signal/Makefile
@@ -28,8 +28,8 @@ headers := signal.h sys/signal.h \
        bits/sigstack.h bits/sigthread.h bits/ss_flags.h \
        bits/types/__sigset_t.h bits/types/sig_atomic_t.h \
        bits/types/sigevent_t.h bits/types/siginfo_t.h \
-       bits/types/sigset_t.h bits/types/stack_t.h \
-       bits/types/struct_sigstack.h
+       bits/types/sigset_t.h bits/types/sigval_t.h \
+       bits/types/stack_t.h bits/types/struct_sigstack.h

 routines    := signal raise killpg \
            sigaction sigprocmask kill \
-- 
2.11.0

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/6] Committed: Remove __need macros from signal.h.
  2017-05-20 23:18 ` [PATCH 2/6] Committed: Remove __need macros from signal.h Zack Weinberg
  2017-05-21  7:19   ` Andreas Schwab
@ 2017-05-22 11:18   ` Joseph Myers
  2017-05-22 11:25     ` Joseph Myers
  1 sibling, 1 reply; 14+ messages in thread
From: Joseph Myers @ 2017-05-22 11:18 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: libc-alpha

This seems to have broken the build for MIPS.

In file included from ../signal/signal.h:59:0,
                 from ../include/signal.h:2,
                 from ../misc/sys/param.h:28,
                 from ../include/sys/param.h:1,
                 from ../csu/init-first.c:26,
                 from ../sysdeps/unix/sysv/linux/mips/init-first.c:44:
../sysdeps/unix/sysv/linux/bits/siginfo-consts.h:28:0: error: "__SI_ASYNCIO_AFTER_SIGIO" redefined [-Werror]
 #define __SI_ASYNCIO_AFTER_SIGIO 1
 
In file included from 
../sysdeps/unix/sysv/linux/bits/types/siginfo_t.h:22:0,
                 from ../signal/signal.h:57,
                 from ../include/signal.h:2,
                 from ../misc/sys/param.h:28,
                 from ../include/sys/param.h:1,
                 from ../csu/init-first.c:26,
                 from ../sysdeps/unix/sysv/linux/mips/init-first.c:44:
../sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h:13:0: note: this is the location of the previous definition
 #define __SI_ASYNCIO_AFTER_SIGIO 0
 
cc1: all warnings being treated as errors

https://sourceware.org/ml/libc-testresults/2017-q2/msg00210.html

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/6] Committed: Remove __need macros from signal.h.
  2017-05-22 11:18   ` Joseph Myers
@ 2017-05-22 11:25     ` Joseph Myers
  2017-05-22 11:59       ` Zack Weinberg
  0 siblings, 1 reply; 14+ messages in thread
From: Joseph Myers @ 2017-05-22 11:25 UTC (permalink / raw)
  To: Zack Weinberg; +Cc: libc-alpha

The basic issue behind this build breakage is: bits/siginfo-arch.h uses 
#undef/#define to make adjustments to defaults from more than one other 
bits/ header (so it's included from bits/types/siginfo_t.h to adjust some 
defines from there, but also from bits/siginfo-consts.h to adjust some 
defines from there).  For this to work, however, it can only safely be 
included after both sets of defaults have been defined.  I think either it 
needs to be split up into two headers, each one only included after the 
relevant defaults have been defined, or the defaults all need to come in 
one place.  (One possibility for the split would be a header that defines 
only __SI_ASYNCIO_AFTER_SIGIO, at which point you don't need a #undef, 
just a version that defines it to 1 and a version that defines it to 0.)

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/6] Committed: Remove __need macros from signal.h.
  2017-05-22 11:25     ` Joseph Myers
@ 2017-05-22 11:59       ` Zack Weinberg
  2017-05-23  2:33         ` Zack Weinberg
  0 siblings, 1 reply; 14+ messages in thread
From: Zack Weinberg @ 2017-05-22 11:59 UTC (permalink / raw)
  To: Joseph Myers; +Cc: GNU C Library

I'm testing this patch now.  It will take all day to test thoroughly.
I apologize for the inconvenience.

diff --git a/sysdeps/unix/sysv/linux/bits/siginfo-consts.h
b/sysdeps/unix/sysv/linux/bits/siginfo-consts.h
index a7a31bfe5f..525840cea1 100644
--- a/sysdeps/unix/sysv/linux/bits/siginfo-consts.h
+++ b/sysdeps/unix/sysv/linux/bits/siginfo-consts.h
@@ -25,8 +25,10 @@

 /* Most of these constants are uniform across all architectures, but there
    is one exception.  */
-#define __SI_ASYNCIO_AFTER_SIGIO 1
 #include <bits/siginfo-arch.h>
+#ifndef __SI_ASYNCIO_AFTER_SIGIO
+# define __SI_ASYNCIO_AFTER_SIGIO 1
+#endif

 /* Values for `si_code'.  Positive values are reserved for kernel-generated
    signals.  */
diff --git a/sysdeps/unix/sysv/linux/bits/types/siginfo_t.h
b/sysdeps/unix/sysv/linux/bits/types/siginfo_t.h
index 1bb6da5264..bed69148f9 100644
--- a/sysdeps/unix/sysv/linux/bits/types/siginfo_t.h
+++ b/sysdeps/unix/sysv/linux/bits/types/siginfo_t.h
@@ -13,13 +13,25 @@
 #endif

 /* Some fields of siginfo_t have architecture-specific variations.  */
-#define __SI_ALIGNMENT        /* nothing */
-#define __SI_BAND_TYPE        long int
-#define __SI_CLOCK_T        __clock_t
-#define __SI_ERRNO_THEN_CODE    1
-#define __SI_HAVE_SIGSYS    1
-#define __SI_SIGFAULT_ADDL    /* nothing */
 #include <bits/siginfo-arch.h>
+#ifndef __SI_ALIGNMENT
+# define __SI_ALIGNMENT        /* nothing */
+#endif
+#ifndef __SI_BAND_TYPE
+# define __SI_BAND_TYPE        long int
+#endif
+#ifndef __SI_CLOCK_T
+# define __SI_CLOCK_T        __clock_t
+#endif
+#ifndef __SI_ERRNO_THEN_CODE
+# define __SI_ERRNO_THEN_CODE    1
+#endif
+#ifndef __SI_HAVE_SIGSYS
+# define __SI_HAVE_SIGSYS    1
+#endif
+#ifndef __SI_SIGFAULT_ADDL
+# define __SI_SIGFAULT_ADDL    /* nothing */
+#endif

 typedef struct
   {
diff --git a/sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h
b/sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h
index f824adb77a..8b5647062c 100644
--- a/sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h
+++ b/sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h
@@ -1,10 +1,8 @@
 /* Architecture-specific adjustments to siginfo_t.  ia64 version.  */
 #ifndef _BITS_SIGINFO_ARCH_H

-#undef __SI_HAVE_SIGSYS
 #define __SI_HAVE_SIGSYS 0

-#undef __SI_SIGFAULT_ADDL
 #define __SI_SIGFAULT_ADDL            \
   int _si_imm;                    \
   unsigned int _si_flags;            \
diff --git a/sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h
b/sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h
index 4292d7c9cd..cd3af7db06 100644
--- a/sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h
+++ b/sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h
@@ -4,12 +4,10 @@

 /* MIPS has the si_code and si_errno fields in the opposite order from
    all other architectures.  */
-#undef __SI_ERRNO_THEN_CODE
 #define __SI_ERRNO_THEN_CODE 0

 /* MIPS also has different values for SI_ASYNCIO, SI_MESGQ, and SI_TIMER
    than all other architectures.  */
-#undef __SI_ASYNCIO_AFTER_SIGIO
 #define __SI_ASYNCIO_AFTER_SIGIO 0

 #endif
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
b/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
index 92fe30f11e..9f79715ebe 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
@@ -2,10 +2,8 @@
 #ifndef _BITS_SIGINFO_ARCH_H
 #define _BITS_SIGINFO_ARCH_H 1

-#undef __SI_BAND_TYPE
 #define __SI_BAND_TYPE int

-#undef __SI_SIGFAULT_ADDL
 #define __SI_SIGFAULT_ADDL \
   int _si_trapno;

diff --git a/sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h
b/sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h
index 013ad7187d..7d0c24c84b 100644
--- a/sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h
+++ b/sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h
@@ -2,7 +2,6 @@
 #ifndef _BITS_SIGINFO_ARCH_H
 #define _BITS_SIGINFO_ARCH_H 1

-#undef __SI_SIGFAULT_ADDL
 #define __SI_SIGFAULT_ADDL \
   int _si_trapno;

diff --git a/sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h
b/sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h
index 6c85dbb6e8..7688a8d66d 100644
--- a/sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h
+++ b/sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h
@@ -10,9 +10,7 @@
    attribute would be ignored if it were put in __SI_CLOCK_T instead
    of encapsulated in a typedef.  */
 typedef __clock_t __attribute__ ((__aligned__ (4))) __sigchld_clock_t;
-# undef  __SI_ALIGNMENT
 # define __SI_ALIGNMENT __attribute__ ((__aligned__ (8)))
-# undef  __SI_CLOCK_T
 # define __SI_CLOCK_T __sigchld_clock_t
 #endif

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 2/6] Committed: Remove __need macros from signal.h.
  2017-05-22 11:59       ` Zack Weinberg
@ 2017-05-23  2:33         ` Zack Weinberg
  0 siblings, 0 replies; 14+ messages in thread
From: Zack Weinberg @ 2017-05-23  2:33 UTC (permalink / raw)
  To: Joseph Myers; +Cc: GNU C Library

On Mon, May 22, 2017 at 7:59 AM, Zack Weinberg <zackw@panix.com> wrote:
> I'm testing this patch now.  It will take all day to test thoroughly.
> I apologize for the inconvenience.

This has been checked in now.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 0/6] Elimination of __need macros, round 3(?)
  2017-05-20 23:18 [PATCH 0/6] Elimination of __need macros, round 3(?) Zack Weinberg
                   ` (5 preceding siblings ...)
  2017-05-20 23:18 ` [PATCH 5/6] Remove __need_IOV_MAX and __need_FOPEN_MAX Zack Weinberg
@ 2017-05-23 17:42 ` Chris Metcalf
  6 siblings, 0 replies; 14+ messages in thread
From: Chris Metcalf @ 2017-05-23 17:42 UTC (permalink / raw)
  To: Zack Weinberg, libc-alpha

On 5/20/2017 7:18 PM, Zack Weinberg wrote:
> __need_int_reg_t interacts with a kernel header; a patch was posted,
> but I don't know if the replacement micro-header is available in a
> released kernel yet.

I neglected to ask Linus to pull the change for 4.12.  I will try to do 
so next
time the kernel merge window opens.

-- 
Chris Metcalf, Mellanox Technologies
http://www.mellanox.com

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2017-05-23 17:42 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-20 23:18 [PATCH 0/6] Elimination of __need macros, round 3(?) Zack Weinberg
2017-05-20 23:18 ` [PATCH 3/6] Remove __need macros from errno.h (__need_Emath, __need_error_t) Zack Weinberg
2017-05-20 23:18 ` [PATCH 1/6] Committed: Remove __need_list_t and __need_res_state Zack Weinberg
2017-05-20 23:18 ` [PATCH 6/6] Remove __need_schedparam and __cpu_set_t_defined Zack Weinberg
2017-05-20 23:18 ` [PATCH 2/6] Committed: Remove __need macros from signal.h Zack Weinberg
2017-05-21  7:19   ` Andreas Schwab
2017-05-21 13:55     ` Zack Weinberg
2017-05-22 11:18   ` Joseph Myers
2017-05-22 11:25     ` Joseph Myers
2017-05-22 11:59       ` Zack Weinberg
2017-05-23  2:33         ` Zack Weinberg
2017-05-20 23:18 ` [PATCH 4/6] Remove __need macros from stdio.h and wchar.h Zack Weinberg
2017-05-20 23:18 ` [PATCH 5/6] Remove __need_IOV_MAX and __need_FOPEN_MAX Zack Weinberg
2017-05-23 17:42 ` [PATCH 0/6] Elimination of __need macros, round 3(?) Chris Metcalf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).