This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch zack/headers-cleanups created. glibc-2.25-154-gc1fcf1a


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, zack/headers-cleanups has been created
        at  c1fcf1a2c8d228fa1eed490a6180dbfb70098c89 (commit)

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=c1fcf1a2c8d228fa1eed490a6180dbfb70098c89

commit c1fcf1a2c8d228fa1eed490a6180dbfb70098c89
Author: Zack Weinberg <zackw@panix.com>
Date:   Tue Mar 21 16:30:53 2017 -0400

    Remove __need macros from errno.h (__need_Emath, __need_error_t).
    
    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,
    there were only two versions of the definition in a live port, so I
    moved them to errno.h and added a new __GLIBC_USE macro to choose
    between them.  As a consequence of *that*, attribute_tls_model_ie
    needed to move to sys/cdefs.h and be renamed __attribute_tls_model_ie__.
    
    __need_error_t exists for gnulib compatibility in argz.h and argp.h.
    error_t itself is a slightly-too-clever 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 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.
            Include bits/types/error_t.h for error_t.  Declare errno here,
    	using either __thread or __errno_location, as directed by
    	bits/errno.h.  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__).
    	* include/features.h (__GLIBC_USE_TLS_ERRNO): New feature
    	selection macro, defaults to 0.
    
    	* sysdeps/mach/hurd/errnos.awk
    	* sysdeps/nacl/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.
    
    	* include/libc-symbols.h (attribute_tls_model_ie): Remove.
    	* misc/sys/cdefs.h (__attribute_tls_model_ie__): New.
    	* elf/dl-error-skeleton.c, include/errno.h, include/netdb.h
    	* include/resolv.h, locale/localeinfo.h, malloc/arena.c
    	* sunrpc/rpc_thread.c, sysdeps/generic/libc-tsd.h
    	* sysdeps/ieee754/ldbl-opt/math_ldbl_opt.c
    	* sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h
    	* sysdeps/powerpc/nofpu/soft-supp.h
    	* sysdeps/powerpc/soft-fp/sfp-machine.h
    	Use __attribute_tls_model_ie__ and/or __attribute_const__.

diff --git a/Makeconfig b/Makeconfig
index b494b82..0e7777f 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/argp/argp.h b/argp/argp.h
index 86b8e5a..f48c007 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
-
 __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 cd4fcfa..398766a 100644
--- a/bits/errno.h
+++ b/bits/errno.h
@@ -15,20 +15,37 @@
    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.
+
+   Also, if you want your port to expose errno as a thread-local
+   variable instead of using the older __errno_location mechanism,
+   this file should undefine __USE_TLS_ERRNO and redefine it with the
+   value 1.  (features.h provides the default value of 0.)
+
+   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/elf/dl-error-skeleton.c b/elf/dl-error-skeleton.c
index 8e5888d..b2d8de0 100644
--- a/elf/dl-error-skeleton.c
+++ b/elf/dl-error-skeleton.c
@@ -53,7 +53,7 @@ struct catch
    Therefore we have to be prepared to save the state in thread-local
    memory.  */
 #if !DL_ERROR_BOOTSTRAP
-static __thread struct catch *catch_hook attribute_tls_model_ie;
+static __thread struct catch *catch_hook __attribute_tls_model_ie__;
 #else
 /* The version of this code in ld.so cannot use thread-local variables
    and is used during bootstrap only.  */
diff --git a/include/bits/types/error_t.h b/include/bits/types/error_t.h
new file mode 100644
index 0000000..1ce1f79
--- /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 73fc32e..2b54a8e 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>
@@ -32,21 +30,18 @@ extern int rtld_errno attribute_hidden;
 #  else
 #   define errno errno		/* For #ifndef errno tests.  */
 #  endif
-extern __thread int errno attribute_tls_model_ie;
+extern __thread int errno __attribute_tls_model_ie__;
 
 # endif	/* IS_IN_LIB */
 
 # 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/include/features.h b/include/features.h
index 7de4089..19458d1 100644
--- a/include/features.h
+++ b/include/features.h
@@ -137,6 +137,7 @@
 #undef	__USE_FORTIFY_LEVEL
 #undef	__KERNEL_STRICT_NAMES
 #undef	__GLIBC_USE_DEPRECATED_GETS
+#undef  __GLIBC_USE_TLS_ERRNO
 
 /* Suppress kernel-name space pollution unless user expressedly asks
    for it.  */
@@ -394,6 +395,11 @@
 # define __GLIBC_USE_DEPRECATED_GETS 1
 #endif
 
+/* Whether errno should be declared as a thread-local variable, or
+   as a macro that calls __errno_location.  This is the default;
+   bits/errno.h may override.  */
+#define __GLIBC_USE_TLS_ERRNO 0
+
 /* Get definitions of __STDC_* predefined macros, if the compiler has
    not preincluded this header automatically.  */
 #include <stdc-predef.h>
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index f6c9a9d..6ef64f5 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -361,8 +361,6 @@ for linking")
 # define attribute_hidden
 #endif
 
-#define attribute_tls_model_ie __attribute__ ((tls_model ("initial-exec")))
-
 #define attribute_relro __attribute__ ((section (".data.rel.ro")))
 
 
diff --git a/include/netdb.h b/include/netdb.h
index e1f051d..8b3da45 100644
--- a/include/netdb.h
+++ b/include/netdb.h
@@ -11,7 +11,7 @@
 #  else
 #   define h_errno __h_errno
 #  endif
-extern __thread int h_errno attribute_tls_model_ie;
+extern __thread int h_errno __attribute_tls_model_ie__;
 # endif /* IS_IN_LIB */
 # define __set_h_errno(x) (h_errno = (x))
 
diff --git a/include/resolv.h b/include/resolv.h
index 95dcd3c..52258b5 100644
--- a/include/resolv.h
+++ b/include/resolv.h
@@ -18,7 +18,7 @@
 # if IS_IN (libc)
 #  define __resp __libc_resp
 # endif
-extern __thread struct __res_state *__resp attribute_tls_model_ie;
+extern __thread struct __res_state *__resp __attribute_tls_model_ie__;
 # undef _res
 # define _res (*__resp)
 
diff --git a/locale/localeinfo.h b/locale/localeinfo.h
index f0694dc..734c402 100644
--- a/locale/localeinfo.h
+++ b/locale/localeinfo.h
@@ -241,7 +241,7 @@ __libc_tsd_define (extern, __locale_t, LOCALE)
    associated with this category.  */
 #define DEFINE_CATEGORY(category, category_name, items, a) \
 extern __thread struct __locale_data *const *_nl_current_##category \
-  attribute_hidden attribute_tls_model_ie;
+  attribute_hidden __attribute_tls_model_ie__;
 #include "categories.def"
 #undef	DEFINE_CATEGORY
 
diff --git a/malloc/arena.c b/malloc/arena.c
index d49e4a2..a38dce5 100644
--- a/malloc/arena.c
+++ b/malloc/arena.c
@@ -71,7 +71,7 @@ extern int sanity_check_heap_info_alignment[(sizeof (heap_info)
 
 /* Thread specific data.  */
 
-static __thread mstate thread_arena attribute_tls_model_ie;
+static __thread mstate thread_arena __attribute_tls_model_ie__;
 
 /* Arena free list.  free_list_lock synchronizes access to the
    free_list variable below, and the next_free and attached_threads
diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h
index 74f9a49..075c996 100644
--- a/misc/sys/cdefs.h
+++ b/misc/sys/cdefs.h
@@ -326,6 +326,13 @@
 # define __attribute_artificial__ /* Ignore */
 #endif
 
+/* Force use of the initial-exec TLS model.  */
+#if __GNUC_PREREQ (3,3)
+# define __attribute_tls_model_ie__ __attribute__ ((tls_model ("initial-exec")))
+#else
+# define __attribute_tls_model_ie__ /* ignore */
+#endif
+
 /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
    inline semantics, unless -fgnu89-inline is used.  Using __GNUC_STDC_INLINE__
    or __GNUC_GNU_INLINE is not a good enough check for gcc because gcc versions
diff --git a/scripts/make-errno-enum.sh b/scripts/make-errno-enum.sh
new file mode 100644
index 0000000..99a07d3
--- /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 d4edcf8..183e46f 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
diff --git a/stdlib/bits/types/error_t.h b/stdlib/bits/types/error_t.h
new file mode 100644
index 0000000..2b6197c
--- /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 65f2f45..b085891 100644
--- a/stdlib/errno.h
+++ b/stdlib/errno.h
@@ -20,53 +20,41 @@
  */
 
 #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
 
-__BEGIN_DECLS
+/* 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__
 
-/* 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
+__BEGIN_DECLS
 
-#ifdef	_ERRNO_H
+/* The error code set by various library functions.  */
+#  if __GLIBC_USE (TLS_ERRNO)
+extern __thread int errno __attribute_tls_model_ie__;
+#   define errno errno
+#  else
+extern int *__errno_location (void) __THROW __attribute_const__;
+#   define errno (*__errno_location ())
+#  endif
 
-/* 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
 
-#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 f9d0ac9..58fcbd0 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/sunrpc/rpc_thread.c b/sunrpc/rpc_thread.c
index e5225c5..e4d96f5 100644
--- a/sunrpc/rpc_thread.c
+++ b/sunrpc/rpc_thread.c
@@ -11,7 +11,7 @@
 /* Variable used in non-threaded applications or for the first thread.  */
 static struct rpc_thread_variables __libc_tsd_RPC_VARS_mem;
 static __thread struct rpc_thread_variables *thread_rpc_vars
-        attribute_tls_model_ie;
+        __attribute_tls_model_ie__;
 
 /*
  * Task-variable destructor
diff --git a/sysdeps/generic/libc-tsd.h b/sysdeps/generic/libc-tsd.h
index cd04e02..da19bf0 100644
--- a/sysdeps/generic/libc-tsd.h
+++ b/sysdeps/generic/libc-tsd.h
@@ -51,7 +51,7 @@
    translate directly into variables by macro magic.  */
 
 #define __libc_tsd_define(CLASS, TYPE, KEY)	\
-  CLASS __thread TYPE __libc_tsd_##KEY attribute_tls_model_ie;
+  CLASS __thread TYPE __libc_tsd_##KEY __attribute_tls_model_ie__;
 
 #define __libc_tsd_address(TYPE, KEY)		(&__libc_tsd_##KEY)
 #define __libc_tsd_get(TYPE, KEY)		(__libc_tsd_##KEY)
diff --git a/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S b/sysdeps/i386/i686/fpu/multiarch/s_cosf-sse2.S
index f37850d..a5b76e9 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 f31a925..1e99ee6 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 ee96018..03b9254 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/ieee754/ldbl-opt/math_ldbl_opt.c b/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.c
index 49c5c12..b084043 100644
--- a/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.c
+++ b/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.c
@@ -1,3 +1,3 @@
 /* Set temporarily to non-zero if long double should be considered
    the same as double.  */
-__thread int __no_long_double attribute_tls_model_ie attribute_hidden;
+__thread int __no_long_double __attribute_tls_model_ie__ attribute_hidden;
diff --git a/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h b/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h
index af861c1..6c54dca 100644
--- a/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h
+++ b/sysdeps/ieee754/ldbl-opt/math_ldbl_opt.h
@@ -41,6 +41,7 @@
 
 /* Set temporarily to non-zero if long double should be considered
    the same as double.  */
-extern __thread int __no_long_double attribute_tls_model_ie attribute_hidden;
+extern __thread int __no_long_double
+  __attribute_tls_model_ie__ attribute_hidden;
 # define __ldbl_is_dbl __builtin_expect (__no_long_double, 0)
 #endif
diff --git a/sysdeps/mach/hurd/bits/errno.h b/sysdeps/mach/hurd/bits/errno.h
index d20ffe6..de49025 100644
--- a/sysdeps/mach/hurd/bits/errno.h
+++ b/sysdeps/mach/hurd/bits/errno.h
@@ -1,329 +1,196 @@
 /* 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))
-#endif
-
-#ifdef _ERRNO_H
+#ifndef _BITS_ERRNO_H
+#define _BITS_ERRNO_H 1
 
-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,
-
-#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 */
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H
+#error "Never include <bits/errno.h> directly; use <errno.h> instead."
+#endif
 
-	/* 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,
+/* 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 */
 
-	/* 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/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
 
-	/* 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 <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
 
-	/* 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 <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 <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 a20815f..ed6dfc9 100644
--- a/sysdeps/mach/hurd/errnos.awk
+++ b/sysdeps/mach/hurd/errnos.awk
@@ -24,27 +24,18 @@
 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 "#endif";
+    print "#ifndef _BITS_ERRNO_H";
+    print "#define _BITS_ERRNO_H 1";
     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 "#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 "/* The Hurd uses Mach error system 0x10, currently only subsystem 0. */";
     errnoh = 0;
     maxerrno = 0;
     in_mach_errors = "";
     in_math = 0;
-    edom = erange = "";
-    print "#undef EDOM\n#undef ERANGE";
     lno = 0;
   }
 
@@ -64,23 +55,21 @@ errnoh == 2 && $1 == "@deftypevr"  && $2 == "Macro" && $3 == "int" \
 errnoh == 3 && $1 == "@comment" && $2 == "errno" {
     if (e == "EWOULDBLOCK")
       {
-	lines[lno++]="#define EWOULDBLOCK EAGAIN /* Operation would block */";
+        printf ("#define %-30s %-10s /* Operation would block */\n",
+                "EWOULDBLOCK", "EAGAIN");
 	next;
       }
     errno = $3 + 0;
     if (errno == 0)
       next;
+    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;
-    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;
+    printf ("#define %-30s 0x%08x /*%s */\n",
+            e, 0x40000000 + errno, etext);
     next;
   }
 { errnoh=0 }
@@ -88,12 +77,12 @@ errnoh == 3 && $1 == "@comment" && $2 == "errno" {
 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;
   }
 
@@ -104,14 +93,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_" \
@@ -125,14 +113,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" \
@@ -141,35 +132,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/nacl/errnos.awk b/sysdeps/nacl/errnos.awk
index 926d595..bab8588 100644
--- a/sysdeps/nacl/errnos.awk
+++ b/sysdeps/nacl/errnos.awk
@@ -59,19 +59,12 @@ END {
   print "\
 /* This file generated by errnos.awk.  */\n\
 \n\
-#if !defined __Emath_defined && (defined _ERRNO_H || defined __need_Emath)\n\
-#undef	__need_Emath\n\
-#define	__Emath_defined	1";
-  emath["EDOM"] = emath["EILSEQ"] = emath["ERANGE"] = 1;
-  for (ename in emath) {
-    errno = errnos_by_name[ename];
-    define_errno(errno, ename);
-    delete errnos[errno];
-  }
-  print "\
-#endif\n\
+#ifndef _BITS_ERRNO_H\n\
+#define _BITS_ERRNO_H 1\n\
 \n\
-#ifdef _ERRNO_H\n";
+#if !defined _ERRNO_H && !defined _BITS_ERRNO_ENUM_H\n\
+#error \"Never include <bits/errno.h> directly; use <errno.h> instead.\"\n\
+#endif\n"
 
   for (i = 1; i <= maxerrno; ++i)
     if (i in errnos) define_errno(i, errnos[i]);
@@ -80,8 +73,8 @@ END {
 #define	EWOULDBLOCK	EAGAIN\n\
 #define	ENOTSUP		EOPNOTSUPP\n\
 \n\
-extern __thread int errno __attribute__ ((__tls_model__ (\"initial-exec\")));\n\
-#define errno errno\n\
+#undef __USE_TLS_ERRNO\n\
+#define __USE_TLS_ERRNO 1\n\
 \n\
-#endif";
+#endif /* bits/errno.h.  */";
 }
diff --git a/sysdeps/powerpc/nofpu/soft-supp.h b/sysdeps/powerpc/nofpu/soft-supp.h
index f66d957..e329f43 100644
--- a/sysdeps/powerpc/nofpu/soft-supp.h
+++ b/sysdeps/powerpc/nofpu/soft-supp.h
@@ -33,12 +33,12 @@ typedef union
 
 #endif
 
-extern __thread int __sim_exceptions_thread attribute_tls_model_ie;
+extern __thread int __sim_exceptions_thread __attribute_tls_model_ie__;
 libc_hidden_tls_proto (__sim_exceptions_thread, tls_model ("initial-exec"));
-extern __thread int __sim_disabled_exceptions_thread attribute_tls_model_ie;
+extern __thread int __sim_disabled_exceptions_thread __attribute_tls_model_ie__;
 libc_hidden_tls_proto (__sim_disabled_exceptions_thread,
 		       tls_model ("initial-exec"));
-extern __thread int __sim_round_mode_thread attribute_tls_model_ie;
+extern __thread int __sim_round_mode_thread __attribute_tls_model_ie__;
 libc_hidden_tls_proto (__sim_round_mode_thread, tls_model ("initial-exec"));
 
 /* These variables were formerly global, so there are compat symbols
diff --git a/sysdeps/powerpc/soft-fp/sfp-machine.h b/sysdeps/powerpc/soft-fp/sfp-machine.h
index d92a90e..1ff116a 100644
--- a/sysdeps/powerpc/soft-fp/sfp-machine.h
+++ b/sysdeps/powerpc/soft-fp/sfp-machine.h
@@ -103,12 +103,12 @@ libc_hidden_proto (__feraiseexcept_soft)
 
 #endif
 
-extern __thread int __sim_exceptions_thread attribute_tls_model_ie;
+extern __thread int __sim_exceptions_thread __attribute_tls_model_ie__;
 libc_hidden_tls_proto (__sim_exceptions_thread, tls_model ("initial-exec"));
-extern __thread int __sim_disabled_exceptions_thread attribute_tls_model_ie;
+extern __thread int __sim_disabled_exceptions_thread __attribute_tls_model_ie__;
 libc_hidden_tls_proto (__sim_disabled_exceptions_thread,
 		       tls_model ("initial-exec"));
-extern __thread int __sim_round_mode_thread attribute_tls_model_ie;
+extern __thread int __sim_round_mode_thread __attribute_tls_model_ie__;
 libc_hidden_tls_proto (__sim_round_mode_thread, tls_model ("initial-exec"));
 
 extern void __simulate_exceptions (int x) attribute_hidden;
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/errno.h b/sysdeps/unix/sysv/linux/alpha/bits/errno.h
index 3338621..bcab228 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
+/* Older Linux headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
 
 # ifndef ECANCELED
-#  define ECANCELED	131
+#  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 c0f4d20..38019b7 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 headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
 
-/* Older Linux versions also had no ECANCELED error code.  */
 # ifndef ECANCELED
-#  define ECANCELED	125
+#  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 ce6bebe..241b696 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 fa62e1f..55df83d 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
+/* Older Linux headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
 
 # ifndef ECANCELED
-#  define ECANCELED	158
+#  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 4a8d8a0..9e13e66 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
+/* Older Linux headers do not define these constants.  */
+# ifndef ENOTSUP
+#  define ENOTSUP		EOPNOTSUPP
+# endif
 
 # ifndef ECANCELED
-#  define ECANCELED	127
+#  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 e9fdc7e..7acafcd 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 e6ed81e..fd35a31 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 0aa5d43..253ba7d 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:
  *

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=c2a4e44e1ff062a076be1aea22b45859df7a6255

commit c2a4e44e1ff062a076be1aea22b45859df7a6255
Author: Zack Weinberg <zackw@panix.com>
Date:   Thu Dec 1 19:24:13 2016 -0500

    Convert signal.h from __need macros to bits/types/ headers.
    
    This was considerably hairier than any of the preceding conversions,
    because sigset_t is OS-dependent, and siginfo_t and sigevent_t are
    both OS- and machine-dependent.  And the bits headers that defined
    them also defined a whole bunch of other stuff that was mostly _not_
    OS- or machine-dependent.  I have disentangled it as much as I think
    is feasible short of going to generated 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 (you know the thing where a perfectly
    ordinary user-namespace identifier is defined as a macro expanding
    to a chain of nested structure references? that thing is terrible).
    Internal code that wants to manipulate signal masks must now include
    <bits/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, which returns 'int' solely
    so that it can return -1 instead of crashing when given null pointers).
    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; I might do
    a follow-on patch that unifies the Linux-generic bits headers with the
    totally generic ones.
    
    It might make sense to make bits/sigsetops.h into a new, public set of
    inline functions (like the existing bits/string2.h) but it seems
    unlikely that signal mask manipulation is performance-critical to
    anyone, so I'm not inclined to bother.
    
    	* 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.
    
    	* bits/sigsetops.h
    	* sysdeps/unix/sysv/linux/bits/sigsetops.h
    	New private 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.
    
    	* include/bits/types/sig_atomic_t.h
    	* include/bits/types/sigset_t.h
    	* include/bits/types/sigval_t.h:
    	New wrappers.
    
    	* 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/sigsetops.h
    	* 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 bits/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/sigsetops.c: Explicitly define __sigismember,
    	__sigaddset, and __sigdelset as compatibility symbols.
    
    	* signal/Versions: Correct commentary on __sigpause,
    	__sigaddset, __sigdelset, __sigismember.
    
    	* inet/rcmd.c: Include bits/sigsetops.h.  Convert old code using
    	__sigblock/__sigsetmask to use __sigprocmask and friends.

diff --git a/sysdeps/posix/sigignore.c b/bits/sigevent-consts.h
similarity index 55%
copy from sysdeps/posix/sigignore.c
copy to bits/sigevent-consts.h
index e797573..f5940e0 100644
--- a/sysdeps/posix/sigignore.c
+++ b/bits/sigevent-consts.h
@@ -1,7 +1,6 @@
-/* Set the disposition of SIG to SIG_IGN.
-   Copyright (C) 1998-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.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
@@ -17,22 +16,22 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <errno.h>
-#define __need_NULL
-#include <stddef.h>
-#include <signal.h>
-#include <string.h>	/* For the real memset prototype.  */
+#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
 
-int
-sigignore (int sig)
+/* `sigev_notify' values.  */
+enum
 {
-  struct sigaction act;
-
-  act.sa_handler = SIG_IGN;
-  if (__sigemptyset (&act.sa_mask) < 0)
-    return -1;
-  act.sa_flags = 0;
-
-  return __sigaction (sig, &act, NULL);
-}
+  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
diff --git a/bits/siginfo.h b/bits/siginfo-consts.h
similarity index 68%
copy from bits/siginfo.h
copy to bits/siginfo-consts.h
index 4919df5..a58ac4b 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 4099cc7..0000000
--- 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/sigsetops.h b/bits/sigsetops.h
new file mode 100644
index 0000000..5db5023
--- /dev/null
+++ b/bits/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 _BITS_SIGSETOPS_H
+#define _BITS_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/bits/types/__sigset_t.h b/bits/types/__sigset_t.h
new file mode 100644
index 0000000..c90d760
--- /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 0000000..7b8cb05
--- /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 0000000..ab6bf18
--- /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 0000000..783693f
--- /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 0000000..20c3dc2
--- /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 0000000..296734e
--- /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 276a99d..e39ddc6 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 b7cc7a8..2d885b7 100644
--- a/inet/rcmd.c
+++ b/inet/rcmd.c
@@ -78,6 +78,7 @@
 #include <stdlib.h>
 #include <wchar.h>
 #include <sys/uio.h>
+#include <bits/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 7356fb9..e34c2db 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 b1dfb3f..107585c 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 <bits/sigsetops.h>
 
 #include "utmp-private.h"
 #include "utmp-equal.h"
diff --git a/misc/sys/select.h b/misc/sys/select.h
index e27fb44..06dd31b 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 7638bd0..e2f73a8 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 36e3867..7329e3b 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 897bfae..d5b7e4d 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 f4eb1a7..f2f8e36 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 5647e52..d72ad5d 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 d65871e..c79aa53 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 e10adaf..86fb2ed 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 5e9a976..2cc04ee 100644
--- a/shadow/lckpwdf.c
+++ b/shadow/lckpwdf.c
@@ -24,6 +24,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <sys/file.h>
+#include <bits/sigsetops.h>
 
 #include <kernel-features.h>
 
diff --git a/signal/Makefile b/signal/Makefile
index b65bf6b..b1704fe 100644
--- a/signal/Makefile
+++ b/signal/Makefile
@@ -23,8 +23,10 @@ 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/sigaction.h bits/sigstack.h bits/sigthread.h \
+	   bits/sigevent-consts.h bits/siginfo-consts.h \
+	   bits/types/sig_atomic_t.h bits/types/sigevent_t.h \
+	   bits/types/siginfo_t.h bits/types/sigset_t.h bits/types/__sigset_t.h
 
 routines	:= signal raise killpg \
 		   sigaction sigprocmask kill \
diff --git a/signal/Versions b/signal/Versions
index 4d86930..a915ef4 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 0000000..47eaa28
--- /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 0000000..8b27e91
--- /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 0000000..666598f
--- /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 ca280d8..9e73ff2 100644
--- a/signal/sigaddset.c
+++ b/signal/sigaddset.c
@@ -27,6 +27,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 f81a593..0af28f2 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 <bits/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 4632103..27546ea 100644
--- a/signal/sigdelset.c
+++ b/signal/sigdelset.c
@@ -27,6 +27,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 eabe71c..936d972 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 <bits/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/signal.h b/signal/signal.h
index 84f2a1f..3f9ffbd 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.  */
+#include <bits/types.h>
+#include <bits/signum.h>
 
-/* 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
+#include <bits/types/sig_atomic_t.h>
 
-#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
+#if defined __USE_POSIX
+#include <bits/types/sigset_t.h>
 #endif
 
-#ifdef _SIGNAL_H
-
-#include <bits/types.h>
-#include <bits/signum.h>
-
 #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__;
@@ -363,8 +346,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 9ea867d..6a45943 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 <bits/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 0317662..78bd417 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) 2016 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.
 
-#define _EXTERN_INLINE
-#ifndef __USE_EXTERN_INLINES
-# define __USE_EXTERN_INLINES	1
-#endif
+   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 <bits/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_25)
 
-#include "signal.h"
+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);
+
+#endif
diff --git a/signal/sigsetops.h b/signal/sigsetops.h
index cd12820..1c038e2 100644
--- a/signal/sigsetops.h
+++ b/signal/sigsetops.h
@@ -17,9 +17,12 @@
 
 /* Definitions relevant to functions that operate on `sigset_t's.  */
 
+#ifndef SIGSETOPS_H
+
 #include <errno.h>
 #include <signal.h>
 #include <string.h>
+#include <bits/sigsetops.h>
 
 #define	BITS		(_NSIG - 1)
 #define	ELT(signo)	(((signo) - 1) / BITS)
@@ -30,3 +33,5 @@
 #undef	sigaddset
 #undef	sigdelset
 #undef	sigismember
+
+#endif
diff --git a/socket/sys/socket.h b/socket/sys/socket.h
index 609a08d..7c15a91 100644
--- a/socket/sys/socket.h
+++ b/socket/sys/socket.h
@@ -26,11 +26,6 @@ __BEGIN_DECLS
 #include <sys/uio.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 d30de0b..33dad7c 100644
--- a/stdlib/abort.c
+++ b/stdlib/abort.c
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <bits/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 f2cc43d..98596db 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>
 
diff --git a/sysdeps/generic/sys/ucontext.h b/sysdeps/generic/sys/ucontext.h
index 6c475b5..70ed30f 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>
 
diff --git a/sysdeps/i386/sys/ucontext.h b/sysdeps/i386/sys/ucontext.h
index 055d4aa..d9144f0 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>
 
diff --git a/sysdeps/m68k/sys/ucontext.h b/sysdeps/m68k/sys/ucontext.h
index 1a90751..d82ec4c 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>
 
diff --git a/sysdeps/mach/hurd/i386/bits/sigcontext.h b/sysdeps/mach/hurd/i386/bits/sigcontext.h
index 286b80e..3d5a673 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 348b7ef..375bbc7 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>
 
diff --git a/sysdeps/posix/profil.c b/sysdeps/posix/profil.c
index f5b8ee1..4f5683e 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 <bits/sigsetops.h>
 
 #ifndef SIGPROF
 
diff --git a/sysdeps/posix/sigignore.c b/sysdeps/posix/sigignore.c
index e797573..7738d79 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 <bits/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 d02469a..6f7d060 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 <bits/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 32db07b..b39c7ef 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 <bits/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 0c2aa76..011e503 100644
--- a/sysdeps/posix/sigset.c
+++ b/sysdeps/posix/sigset.c
@@ -20,7 +20,7 @@
 #include <stddef.h>
 #include <signal.h>
 #include <string.h>	/* For the real memset prototype.  */
-
+#include <bits/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.  */
-  if (disp == SIG_HOLD)
+  /* Check signal extents to protect __sigismember.  */
+  if (disp == SIG_ERR || sig < 1 || sig >= NSIG)
     {
-      /* Create an empty signal set.  */
-      if (__sigemptyset (&set) < 0)
-	return SIG_ERR;
+      __set_errno (EINVAL);
+      return SIG_ERR;
+    }
 
-      /* Add the specified signal.  */
-      if (__sigaddset (&set, sig) < 0)
-	return SIG_ERR;
+  __sigemptyset (&set);
+  __sigaddset (&set, sig);
 
-      /* Add the signal set to the current signal mask.  */
+  if (disp == SIG_HOLD)
+    {
+      /* 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 f72245c..d65e7e4 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 <bits/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 6d80803..309ea5e 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 <bits/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 ed87eff..aa76bf9 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 4302ee4..a7a861c 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 b23b389..8cd4ec4 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -40,7 +40,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 0bf101a..bd00159 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>
 
diff --git a/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h b/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h
index dc76e49..0cc6601 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>
 
diff --git a/sysdeps/unix/sysv/linux/arm/sys/ucontext.h b/sysdeps/unix/sysv/linux/arm/sys/ucontext.h
index cdd3965..19f94fa 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>
 
diff --git a/sysdeps/generic/sys/ucontext.h b/sysdeps/unix/sysv/linux/bits/sigevent-consts.h
similarity index 52%
copy from sysdeps/generic/sys/ucontext.h
copy to sysdeps/unix/sysv/linux/bits/sigevent-consts.h
index 6c475b5..32ae3f3 100644
--- a/sysdeps/generic/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/bits/sigevent-consts.h
@@ -1,4 +1,4 @@
-/* Data structures for user-level context switching.  Generic version.
+/* sigevent constants.  Linux version.
    Copyright (C) 1997-2017 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -16,31 +16,26 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-/* This file's definitions suffice for any platform where all
-   the machine-specific state is described in `struct sigcontext'.  */
-
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
-
-#include <features.h>
-#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>
-
-
-typedef struct sigcontext mcontext_t;
-
-/* Userlevel context.  */
-typedef struct ucontext
-  {
-    unsigned long int uc_flags;
-    struct ucontext *uc_link;
-    stack_t uc_stack;
-    mcontext_t uc_mcontext;
-    __sigset_t uc_sigmask;
-  } ucontext_t;
-
-#endif /* sys/ucontext.h */
+#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 0000000..00018fa
--- /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 0000000..96b4edb
--- /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/bits/siginfo.h b/sysdeps/unix/sysv/linux/bits/siginfo-consts.h
similarity index 64%
rename from bits/siginfo.h
rename to sysdeps/unix/sysv/linux/bits/siginfo-consts.h
index 4919df5..57aa560 100644
--- a/bits/siginfo.h
+++ b/sysdeps/unix/sysv/linux/bits/siginfo-consts.h
@@ -1,4 +1,4 @@
-/* siginfo_t, sigevent and constants.  Stub version.
+/* siginfo constants.  Linux version.
    Copyright (C) 1997-2017 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -16,57 +16,50 @@
    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
+#ifndef _BITS_SIGINFO_CONSTS_H
+#define _BITS_SIGINFO_CONSTS_H 1
 
-#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;
+#ifndef _SIGNAL_H
+#error "Don't include <bits/siginfo-consts.h> directly; use <signal.h> instead."
 #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;
-
+/* Most of these constants are uniform across all architectures, but there
+   is one exception.  */
+#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.  */
 enum
 {
-  SI_ASYNCIO = -4,		/* Sent by AIO completion.  */
-# define SI_ASYNCIO	SI_ASYNCIO
+  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.  */
-# define SI_MESGQ	SI_MESGQ
   SI_TIMER,			/* Sent by timer expiration.  */
-# define SI_TIMER	SI_TIMER
+#else
+  SI_MESGQ,
+  SI_TIMER,
+  SI_ASYNCIO,
+#endif
   SI_QUEUE,			/* Sent by sigqueue.  */
-# define SI_QUEUE	SI_QUEUE
-  SI_USER			/* Sent by kill, sigsend, raise.  */
-# define SI_USER	SI_USER
+  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
 };
 
 
@@ -129,8 +122,12 @@ enum
 #  define BUS_ADRALN	BUS_ADRALN
   BUS_ADRERR,			/* Non-existant physical address.  */
 #  define BUS_ADRERR	BUS_ADRERR
-  BUS_OBJERR			/* Object specific hardware error.  */
+  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
 
@@ -181,36 +178,10 @@ 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
-};
+/* Architectures might also add architecture-specific constants.
+   These are all considered GNU extensions.  */
+#ifdef __USE_GNU
+# include <bits/siginfo-consts-arch.h>
+#endif
 
-#endif	/* have _SIGNAL_H.  */
+#endif
diff --git a/sysdeps/unix/sysv/linux/bits/siginfo.h b/sysdeps/unix/sysv/linux/bits/siginfo.h
deleted file mode 100644
index 7b0d4f6..0000000
--- 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 4b2916f..0000000
--- 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/sigsetops.h b/sysdeps/unix/sysv/linux/bits/sigsetops.h
new file mode 100644
index 0000000..59f5a14
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/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 _BITS_SIGSETOPS_H
+#define _BITS_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/bits/types/__sigset_t.h b/sysdeps/unix/sysv/linux/bits/types/__sigset_t.h
new file mode 100644
index 0000000..e2f18ac
--- /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 0000000..0d4857b
--- /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 0000000..c958c1c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bits/types/siginfo_t.h
@@ -0,0 +1,134 @@
+#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.  */
+#include <bits/siginfo-arch.h>
+#ifndef  __SI_BAND_TYPE
+# define __SI_BAND_TYPE		long int
+#endif
+#ifndef  __SI_ERRNO_THEN_CODE
+# define __SI_ERRNO_THEN_CODE	1
+#endif
+#ifndef  __SI_ALIGNMENT
+# define __SI_ALIGNMENT		/* nothing */
+#endif
+#ifndef  __SI_SIGFAULT_ADDL_1
+# define __SI_SIGFAULT_ADDL_1	/* nothing */
+#endif
+#ifndef  __SI_SIGFAULT_ADDL_2
+# define __SI_SIGFAULT_ADDL_2	/* nothing */
+#endif
+#ifndef  __SI_CLOCK_T
+# define __SI_CLOCK_T		__clock_t
+#endif
+
+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_1
+	    short int si_addr_lsb;  /* Valid LSB of the reported address.  */
+	    __SI_SIGFAULT_ADDL_2
+	  } _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_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
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h b/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h
index 8faac50..e40a6d1 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>
 
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 0000000..0b25d37
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/ia64/bits/siginfo-arch.h
@@ -0,0 +1,15 @@
+/* Architecture-specific adjustments to siginfo_t.  ia64 version.  */
+#ifndef _BITS_SIGINFO_ARCH_H
+
+#define __SI_SIGFAULT_ADDL_1                    \
+  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 0000000..4c5c4da
--- /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 b2a7338..0000000
--- 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 977b4ee..f62bf39 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>
 
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 0000000..cd3af7d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/bits/siginfo-arch.h
@@ -0,0 +1,13 @@
+/* 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.  */
+#define __SI_ERRNO_THEN_CODE 0
+
+/* MIPS also has different values for SI_ASYNCIO, SI_MESGQ, and SI_TIMER
+   than all other architectures.  */
+#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 8d3f1df..0000000
--- 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 c237a51..f511cb7 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>
 
diff --git a/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h b/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
index 6701d7e..5c8965f 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>
 
diff --git a/sysdeps/unix/sysv/linux/nptl-signals.h b/sysdeps/unix/sysv/linux/nptl-signals.h
index 43aa1a9..8f1d388 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 <bits/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 c3f9622..68fb552 100644
--- a/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
@@ -19,14 +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>
 
 #if __WORDSIZE == 32
 
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 b32b9eb..0000000
--- 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 9790c0c..d1d3e36 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>
 
diff --git a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h b/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
index 9fa479c..52659e3 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>
 
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 0000000..b1c340d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/bits/siginfo-arch.h
@@ -0,0 +1,12 @@
+/* Architecture-specific adjustments to siginfo_t.  SPARC version.  */
+#ifndef _BITS_SIGINFO_ARCH_H
+#define _BITS_SIGINFO_ARCH_H 1
+
+#define __SI_BAND_TYPE int
+
+#define __SI_SIGFAULT_ADDL_1 \
+  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 0000000..721dc9c
--- /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 5881416..0000000
--- 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 b8f3ca7..23c42b1 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>
 
diff --git a/sysdeps/unix/sysv/linux/sys/epoll.h b/sysdeps/unix/sysv/linux/sys/epoll.h
index 7542e8a..1498058 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 a18db51..a01c7d1 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 0000000..11ae545
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tile/bits/siginfo-arch.h
@@ -0,0 +1,10 @@
+/* Architecture-specific adjustments to siginfo_t.  Tile version.  */
+#ifndef _BITS_SIGINFO_ARCH_H
+#define _BITS_SIGINFO_ARCH_H 1
+
+#define __SI_SIGFAULT_ADDL_1 \
+  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 0000000..2e76d20
--- /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 44d66a0..0000000
--- 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 247f297..065b61f 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>
 
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 0000000..47c3c36
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/x86/bits/siginfo-arch.h
@@ -0,0 +1,26 @@
+/* Architecture-specific adjustments to siginfo_t.  x86 version.  */
+#ifndef _BITS_SIGINFO_ARCH_H
+#define _BITS_SIGINFO_ARCH_H 1
+
+/* Additional fields for _sifields._sigfault.  */
+#define __SI_SIGFAULT_ADDL_2			\
+  struct					\
+     {						\
+       void *_lower;				\
+       void *_upper;				\
+     } si_addr_bnd;
+
+#define si_lower	_sifields._sigfault.si_addr_bnd._lower
+#define si_upper	_sifields._sigfault.si_addr_bnd._upper
+
+#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)))
+# 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 5693599..0000000
--- 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 0da12f4..833f5e9 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>
 

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=316f2c8d7aa3821a714331fe1e34588a355af229

commit 316f2c8d7aa3821a714331fe1e34588a355af229
Author: Zack Weinberg <zackw@panix.com>
Date:   Sun Nov 20 23:00:02 2016 -0500

    The bits/types/*.h treatment for stdio and wchar.
    
    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.

diff --git a/grp/grp.h b/grp/grp.h
index d829e4c..0f833ff 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 a93b3bd..70ab83d 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 e51d3c5..3caa69f 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);
 
-#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 71d91a0..db678db 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 0000000..09b599b
--- /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 0000000..236f60b
--- /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 0000000..13e764e
--- /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 0000000..99ec08a
--- /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 0000000..f1e373d
--- /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 0000000..8273cd7
--- /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 ad0d0f0..6cc03bf 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,
@@ -181,5 +179,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 e2579a1..6a7af27 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 a71b103..5fd3f86 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 be252f7..a002a33 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 0000000..f268263
--- /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 0000000..06dd79b
--- /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 3e01d54..2d4e6df 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>
@@ -897,5 +870,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 3ceb7b6..42605af 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 039a454..e54e165 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 fabd950..100f33e 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 855fe63..f55c946 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 bf5ccd4..bb23d47 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 f44a3d4..c49eed3 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 abec245..3bc6cfd 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 d6b214b..08b1de1 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 0000000..8eb9537
--- /dev/null
+++ b/wcsmbs/bits/types/__mbstate_t.h
@@ -0,0 +1,19 @@
+#ifndef ____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
diff --git a/wcsmbs/bits/types/mbstate_t.h b/wcsmbs/bits/types/mbstate_t.h
new file mode 100644
index 0000000..8d1baa5
--- /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 0000000..26649c0
--- /dev/null
+++ b/wcsmbs/bits/types/wint_t.h
@@ -0,0 +1,27 @@
+#ifndef _BITS_TYPES_WINT_T_H
+#define _BITS_TYPES_WINT_T_H 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
+
+/* GCC's stddef.h may or may not define wint_t.  If it does, it defines
+   _WINT_T to indicate that it has.  */
+#ifndef _WINT_T
+# define _WINT_T 1
+typedef __WINT_TYPE__ wint_t;
+#endif
+
+/* GCC's stddef.h may or may not know to put wint_t in namespace std in C++.
+   Fortunately, redundant using-declarations are harmless.  */
+#if defined __cplusplus && defined _GLIBCPP_USE_NAMESPACES
+__BEGIN_NAMESPACE_STD
+using ::wint_t;
+__END_NAMESPACE_STD
+#endif
+
+#endif
diff --git a/wcsmbs/uchar.h b/wcsmbs/uchar.h
index a656982..f937519 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 79be9fc..d389428 100644
--- a/wcsmbs/wchar.h
+++ b/wcsmbs/wchar.h
@@ -21,82 +21,32 @@
  */
 
 #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>
-#endif
+#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+#include <bits/libc-header-start.h>
 
-#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>
+#define __need_size_t
+#define __need_wchar_t
+#define __need_NULL
+#include <stddef.h>
 
-# include <bits/wchar.h>
+#define __need___va_list
+#include <stdarg.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
+#include <bits/wchar.h>
+#include <bits/types/wint_t.h>
+#include <bits/types/mbstate_t.h>
+#include <bits/types/__FILE.h>
 
-/* 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 __USE_UNIX98 || defined __USE_XOPEN2K
+# include <bits/types/FILE.h>
 #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;
+/* Tell the caller that we provide correct C++ prototypes.  */
+#if defined __cplusplus && __GNUC_PREREQ (4, 4)
+# define __CORRECT_ISO_CPP_WCHAR_H_PROTO
 #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>.  */
@@ -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 18756c3..2cb2a6d 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 0000000..df5fd03
--- /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 73165bb..962aef1 100644
--- a/wctype/wctype.h
+++ b/wctype/wctype.h
@@ -21,186 +21,32 @@
  */
 
 #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
+/* Some definitions from this header also appear in <wchar.h> in
+   Unix98 mode.  */
+#include <bits/wctype-wchar.h>
 
 /*
- * 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.
+ * Extensible wide-character mapping functions: 7.15.3.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.
- */
+__BEGIN_DECLS
 
 /* 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
-
-/*
- * Extensible wide-character mapping functions: 7.15.3.2.
- */
-
-__BEGIN_DECLS
-
 /* 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  */

-----------------------------------------------------------------------


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]