diff --git a/ctype/ctype.h b/ctype/ctype.h
index 35efe0d2cf5..d17f727cf0d 100644
--- a/ctype/ctype.h
+++ b/ctype/ctype.h
@@ -36,7 +36,7 @@ __BEGIN_DECLS
    endian).  We define the bit value interpretations here dependent on the
    machine's byte order.  */
 
-# include <endian.h>
+# include <bits/endian.h>
 # if __BYTE_ORDER == __BIG_ENDIAN
 #  define _ISbit(bit)	(1 << (bit))
 # else /* __BYTE_ORDER == __LITTLE_ENDIAN */
diff --git a/include/bits/endian.h b/include/bits/endian.h
new file mode 100644
index 00000000000..ad614f1c1ac
--- /dev/null
+++ b/include/bits/endian.h
@@ -0,0 +1 @@
+#include <string/bits/endian.h>
diff --git a/string/Makefile b/string/Makefile
index 52fe28207c1..f01b34509aa 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -25,7 +25,8 @@ include ../Makeconfig
 headers		:= string.h bits/string_fortified.h			\
 		   strings.h bits/strings_fortified.h			\
 		   byteswap.h bits/byteswap.h				\
-		   endian.h bits/endian.h bits/uintn-identity.h		\
+		   endian.h bits/endian.h bits/endianness.h		\
+		   bits/uintn-identity.h				\
 		   memory.h argz.h envz.h
 
 routines	:= strcat strchr strcmp strcoll strcpy strcspn		\
diff --git a/string/bits/endian.h b/string/bits/endian.h
new file mode 100644
index 00000000000..ed2ee578c3b
--- /dev/null
+++ b/string/bits/endian.h
@@ -0,0 +1,48 @@
+/* Copyright (C) 1992-2019 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_ENDIAN_H
+#define _BITS_ENDIAN_H 1
+
+/* Definitions for byte order, according to significance of bytes,
+   from low addresses to high addresses.  The value is what you get by
+   putting '4' in the most significant byte, '3' in the second most
+   significant byte, '2' in the second least significant byte, and '1'
+   in the least significant byte, and then writing down one digit for
+   each byte, starting with the byte at the lowest address at the left,
+   and proceeding to the byte with the highest address at the right.  */
+
+#define	__LITTLE_ENDIAN	1234
+#define	__BIG_ENDIAN	4321
+#define	__PDP_ENDIAN	3412
+
+/* This file defines `__BYTE_ORDER' for the particular machine.  */
+#include <bits/endianness.h>
+
+/* Some machines may need to use a different endianness for floating point
+   values.  */
+#ifndef __FLOAT_WORD_ORDER
+# define __FLOAT_WORD_ORDER __BYTE_ORDER
+#endif
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define __LONG_LONG_PAIR(HI, LO) LO, HI
+#elif __BYTE_ORDER == __BIG_ENDIAN
+# define __LONG_LONG_PAIR(HI, LO) HI, LO
+#endif
+
+#endif /* bits/endian.h */
diff --git a/string/endian.h b/string/endian.h
index 17e4e893fb5..0eb534e434b 100644
--- a/string/endian.h
+++ b/string/endian.h
@@ -20,42 +20,15 @@
 
 #include <features.h>
 
-/* Definitions for byte order, according to significance of bytes,
-   from low addresses to high addresses.  The value is what you get by
-   putting '4' in the most significant byte, '3' in the second most
-   significant byte, '2' in the second least significant byte, and '1'
-   in the least significant byte, and then writing down one digit for
-   each byte, starting with the byte at the lowest address at the left,
-   and proceeding to the byte with the highest address at the right.  */
-
-#define	__LITTLE_ENDIAN	1234
-#define	__BIG_ENDIAN	4321
-#define	__PDP_ENDIAN	3412
-
-/* This file defines `__BYTE_ORDER' for the particular machine.  */
+/* Get the definitions of __*_ENDIAN, __BYTE_ORDER, and __FLOAT_WORD_ORDER.  */
 #include <bits/endian.h>
 
-/* Some machines may need to use a different endianness for floating point
-   values.  */
-#ifndef __FLOAT_WORD_ORDER
-# define __FLOAT_WORD_ORDER __BYTE_ORDER
-#endif
-
-#ifdef	__USE_MISC
-# define LITTLE_ENDIAN	__LITTLE_ENDIAN
-# define BIG_ENDIAN	__BIG_ENDIAN
-# define PDP_ENDIAN	__PDP_ENDIAN
-# define BYTE_ORDER	__BYTE_ORDER
-#endif
-
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-# define __LONG_LONG_PAIR(HI, LO) LO, HI
-#elif __BYTE_ORDER == __BIG_ENDIAN
-# define __LONG_LONG_PAIR(HI, LO) HI, LO
-#endif
-
+#define LITTLE_ENDIAN	__LITTLE_ENDIAN
+#define BIG_ENDIAN	__BIG_ENDIAN
+#define PDP_ENDIAN	__PDP_ENDIAN
+#define BYTE_ORDER	__BYTE_ORDER
 
-#if defined __USE_MISC && !defined __ASSEMBLER__
+#ifndef __ASSEMBLER__
 /* Conversion interfaces.  */
 # include <bits/byteswap.h>
 # include <bits/uintn-identity.h>
diff --git a/sysdeps/aarch64/bits/endian.h b/sysdeps/aarch64/bits/endian.h
deleted file mode 100644
index 03801d312a7..00000000000
--- a/sysdeps/aarch64/bits/endian.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Copyright (C) 1997-2019 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
-   <https://www.gnu.org/licenses/>.  */
-
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-/* AArch64 can be either big or little endian.  */
-#ifdef __AARCH64EB__
-# define __BYTE_ORDER __BIG_ENDIAN
-#else
-# define __BYTE_ORDER __LITTLE_ENDIAN
-#endif
-
-#define __FLOAT_WORD_ORDER __BYTE_ORDER
diff --git a/sysdeps/aarch64/bits/endianness.h b/sysdeps/aarch64/bits/endianness.h
new file mode 100644
index 00000000000..300ebc8f9ca
--- /dev/null
+++ b/sysdeps/aarch64/bits/endianness.h
@@ -0,0 +1,15 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* AArch64 has selectable endianness.  */
+#ifdef __AARCH64EB__
+# define __BYTE_ORDER __BIG_ENDIAN
+#else
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h
index 4cf3a689274..758b127a1a0 100644
--- a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #ifdef __ILP32__
 # define __SIZEOF_PTHREAD_ATTR_T        32
diff --git a/sysdeps/alpha/bits/endian.h b/sysdeps/alpha/bits/endian.h
deleted file mode 100644
index 8a16e14e24e..00000000000
--- a/sysdeps/alpha/bits/endian.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Alpha is little-endian.  */
-
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-#define __BYTE_ORDER __LITTLE_ENDIAN
diff --git a/sysdeps/alpha/bits/endianness.h b/sysdeps/alpha/bits/endianness.h
new file mode 100644
index 00000000000..69f9a147f68
--- /dev/null
+++ b/sysdeps/alpha/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* Alpha is little-endian.  */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/arm/bits/endian.h b/sysdeps/arm/bits/endian.h
deleted file mode 100644
index f49f6ab1c9b..00000000000
--- a/sysdeps/arm/bits/endian.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-/* ARM can be either big or little endian.  */
-#ifdef __ARMEB__
-#define __BYTE_ORDER __BIG_ENDIAN
-#else
-#define __BYTE_ORDER __LITTLE_ENDIAN
-#endif
diff --git a/sysdeps/arm/bits/endianness.h b/sysdeps/arm/bits/endianness.h
new file mode 100644
index 00000000000..2d671fff661
--- /dev/null
+++ b/sysdeps/arm/bits/endianness.h
@@ -0,0 +1,15 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* ARM has selectable endianness.  */
+#ifdef __ARMEB__
+#define __BYTE_ORDER __BIG_ENDIAN
+#else
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h
index 70419c99f64..78b37eb5b89 100644
--- a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h
@@ -18,7 +18,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #define __SIZEOF_PTHREAD_ATTR_T 36
 #define __SIZEOF_PTHREAD_MUTEX_T 24
diff --git a/sysdeps/csky/bits/endian.h b/sysdeps/csky/bits/endian.h
deleted file mode 100644
index 51df38d8f91..00000000000
--- a/sysdeps/csky/bits/endian.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-#ifdef __CSKYBE__
-# error "Big endian not supported for C-SKY."
-#else
-# define __BYTE_ORDER __LITTLE_ENDIAN
-#endif
diff --git a/sysdeps/csky/bits/endianness.h b/sysdeps/csky/bits/endianness.h
new file mode 100644
index 00000000000..ad20cf64e0b
--- /dev/null
+++ b/sysdeps/csky/bits/endianness.h
@@ -0,0 +1,14 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+#ifdef __CSKYBE__
+# error "Big endian not supported for C-SKY."
+#else
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/csky/nptl/bits/pthreadtypes-arch.h b/sysdeps/csky/nptl/bits/pthreadtypes-arch.h
index 5260c58d37c..58be51dcfd0 100644
--- a/sysdeps/csky/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/csky/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #define __SIZEOF_PTHREAD_ATTR_T			36
 #define __SIZEOF_PTHREAD_MUTEX_T		24
diff --git a/sysdeps/hppa/bits/endian.h b/sysdeps/hppa/bits/endian.h
deleted file mode 100644
index 585db0c0faa..00000000000
--- a/sysdeps/hppa/bits/endian.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* hppa1.1 big-endian.  */
-
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-#define __BYTE_ORDER __BIG_ENDIAN
diff --git a/sysdeps/hppa/bits/endianness.h b/sysdeps/hppa/bits/endianness.h
new file mode 100644
index 00000000000..96fd5ae5efb
--- /dev/null
+++ b/sysdeps/hppa/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* HP-PA is big-endian.  */
+#define __BYTE_ORDER __BIG_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/ia64/bits/endianness.h b/sysdeps/ia64/bits/endianness.h
new file mode 100644
index 00000000000..70c211e5696
--- /dev/null
+++ b/sysdeps/ia64/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* IA64 is little-endian.  */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/ia64/ieee754.h b/sysdeps/ia64/ieee754.h
index 21c4149ba22..610631a71df 100644
--- a/sysdeps/ia64/ieee754.h
+++ b/sysdeps/ia64/ieee754.h
@@ -16,11 +16,11 @@
    <https://www.gnu.org/licenses/>.  */
 
 #ifndef _IEEE754_H
-
 #define _IEEE754_H 1
+
 #include <features.h>
 
-#include <endian.h>
+#include <bits/endian.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/ieee754/ieee754.h b/sysdeps/ieee754/ieee754.h
index 581fe5c9ded..7605d0d3217 100644
--- a/sysdeps/ieee754/ieee754.h
+++ b/sysdeps/ieee754/ieee754.h
@@ -16,11 +16,11 @@
    <https://www.gnu.org/licenses/>.  */
 
 #ifndef _IEEE754_H
-
 #define _IEEE754_H 1
+
 #include <features.h>
 
-#include <endian.h>
+#include <bits/endian.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/ieee754/ldbl-128/ieee754.h b/sysdeps/ieee754/ldbl-128/ieee754.h
index 87dc1d781dc..47f11d8a6b7 100644
--- a/sysdeps/ieee754/ldbl-128/ieee754.h
+++ b/sysdeps/ieee754/ldbl-128/ieee754.h
@@ -16,11 +16,11 @@
    <https://www.gnu.org/licenses/>.  */
 
 #ifndef _IEEE754_H
-
 #define _IEEE754_H 1
+
 #include <features.h>
 
-#include <endian.h>
+#include <bits/endian.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/ieee754/ldbl-128ibm/ieee754.h b/sysdeps/ieee754/ldbl-128ibm/ieee754.h
index 35f22895e6b..606b4c7d8a6 100644
--- a/sysdeps/ieee754/ldbl-128ibm/ieee754.h
+++ b/sysdeps/ieee754/ldbl-128ibm/ieee754.h
@@ -16,11 +16,11 @@
    <https://www.gnu.org/licenses/>.  */
 
 #ifndef _IEEE754_H
-
 #define _IEEE754_H 1
+
 #include <features.h>
 
-#include <endian.h>
+#include <bits/endian.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/m68k/bits/endian.h b/sysdeps/m68k/bits/endian.h
deleted file mode 100644
index bf4ecb60a4c..00000000000
--- a/sysdeps/m68k/bits/endian.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* m68k is big-endian.  */
-
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-#define __BYTE_ORDER __BIG_ENDIAN
diff --git a/sysdeps/m68k/bits/endianness.h b/sysdeps/m68k/bits/endianness.h
new file mode 100644
index 00000000000..7e5f0d29696
--- /dev/null
+++ b/sysdeps/m68k/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* m68k is big-endian.  */
+#define __BYTE_ORDER __BIG_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h
index 81990763999..792cb322896 100644
--- a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #define __SIZEOF_PTHREAD_ATTR_T 36
 #define __SIZEOF_PTHREAD_MUTEX_T 24
diff --git a/sysdeps/microblaze/bits/endian.h b/sysdeps/microblaze/bits/endian.h
deleted file mode 100644
index 6e961a55474..00000000000
--- a/sysdeps/microblaze/bits/endian.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Copyright (C) 1997-2019 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
-   <https://www.gnu.org/licenses/>.  */
-
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-/* MicroBlaze can be either big or little endian.  */
-#ifdef _BIG_ENDIAN
-# define __BYTE_ORDER __BIG_ENDIAN
-# define __FLOAT_WORD_ORDER __BIG_ENDIAN
-#else
-# define __BYTE_ORDER __LITTLE_ENDIAN
-# define __FLOAT_WORD_ORDER __LITTLE_ENDIAN
-#endif
diff --git a/sysdeps/microblaze/bits/endianness.h b/sysdeps/microblaze/bits/endianness.h
new file mode 100644
index 00000000000..c4bb7e5f2e9
--- /dev/null
+++ b/sysdeps/microblaze/bits/endianness.h
@@ -0,0 +1,15 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* MicroBlaze has selectable endianness.  */
+#ifdef _BIG_ENDIAN
+# define __BYTE_ORDER __BIG_ENDIAN
+#else
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h
index b1ae4aacdb1..7cf1ff6a725 100644
--- a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 # define _BITS_PTHREADTYPES_ARCH_H	1
 
-# include <endian.h>
+# include <bits/endian.h>
 
 # define __SIZEOF_PTHREAD_ATTR_T         36
 # define __SIZEOF_PTHREAD_MUTEX_T        24
diff --git a/sysdeps/mips/bits/endian.h b/sysdeps/mips/bits/endian.h
deleted file mode 100644
index 126059799d7..00000000000
--- a/sysdeps/mips/bits/endian.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/* The MIPS architecture has selectable endianness.
-   It exists in both little and big endian flavours and we
-   want to be able to share the installed header files between
-   both, so we define __BYTE_ORDER based on GCC's predefines.  */
-
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-#ifdef __MIPSEB
-# define __BYTE_ORDER __BIG_ENDIAN
-#endif
-#ifdef __MIPSEL
-# define __BYTE_ORDER __LITTLE_ENDIAN
-#endif
diff --git a/sysdeps/mips/bits/endianness.h b/sysdeps/mips/bits/endianness.h
new file mode 100644
index 00000000000..09e138b89be
--- /dev/null
+++ b/sysdeps/mips/bits/endianness.h
@@ -0,0 +1,16 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* MIPS has selectable endianness.  */
+#ifdef __MIPSEB
+# define __BYTE_ORDER __BIG_ENDIAN
+#endif
+#ifdef __MIPSEL
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/mips/ieee754/ieee754.h b/sysdeps/mips/ieee754/ieee754.h
index ebaf8d84c39..250fa5e8c08 100644
--- a/sysdeps/mips/ieee754/ieee754.h
+++ b/sysdeps/mips/ieee754/ieee754.h
@@ -16,13 +16,16 @@
    <https://www.gnu.org/licenses/>.  */
 
 #ifndef _IEEE754_H
-
 #define _IEEE754_H 1
+
 #include <features.h>
 
-#include <endian.h>
+#include <bits/endian.h>
 
-#include <float.h>
+#ifndef __LDBL_MANT_DIG__
+# include <float.h>
+# define __LDBL_MANT_DIG__ __LDBL_MANT_DIG__
+#endif
 
 __BEGIN_DECLS
 
@@ -127,7 +130,7 @@ union ieee754_double
 
 #define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
 
-#if LDBL_MANT_DIG == 113
+#if __LDBL_MANT_DIG__ == 113
 
 union ieee854_long_double
   {
@@ -184,7 +187,7 @@ union ieee854_long_double
 
 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent.  */
 
-#elif LDBL_MANT_DIG == 64
+#elif __LDBL_MANT_DIG__ == 64
 
 union ieee854_long_double
   {
@@ -253,7 +256,7 @@ union ieee854_long_double
 
 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff
 
-#elif LDBL_MANT_DIG == 53
+#elif __LDBL_MANT_DIG__ == 53
 
 union ieee854_long_double
   {
@@ -316,7 +319,7 @@ union ieee854_long_double
 
 #define IEEE854_LONG_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
 
-#endif /* LDBL_MANT_DIG == 53 */
+#endif /* __LDBL_MANT_DIG__ == 53 */
 
 __END_DECLS
 
diff --git a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h
index b32e888ea53..0bb703511c6 100644
--- a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #if _MIPS_SIM == _ABI64
 # define __SIZEOF_PTHREAD_ATTR_T 56
diff --git a/sysdeps/nios2/bits/endian.h b/sysdeps/nios2/bits/endian.h
deleted file mode 100644
index 164f9e4d785..00000000000
--- a/sysdeps/nios2/bits/endian.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/* The Nios II architecture has selectable endianness.  */
-
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-#ifdef __nios2_big_endian__
-# define __BYTE_ORDER __BIG_ENDIAN
-#endif
-#ifdef __nios2_little_endian__
-# define __BYTE_ORDER __LITTLE_ENDIAN
-#endif
diff --git a/sysdeps/nios2/bits/endianness.h b/sysdeps/nios2/bits/endianness.h
new file mode 100644
index 00000000000..87e66ebd716
--- /dev/null
+++ b/sysdeps/nios2/bits/endianness.h
@@ -0,0 +1,16 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* Nios II has selectable endianness.  */
+#ifdef __nios2_big_endian__
+# define __BYTE_ORDER __BIG_ENDIAN
+#endif
+#ifdef __nios2_little_endian__
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h
index 8cd8bbedafd..dcd3499a861 100644
--- a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #define __SIZEOF_PTHREAD_ATTR_T 36
 #define __SIZEOF_PTHREAD_MUTEX_T 24
diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h
index ceb724d3a24..467b446aca5 100644
--- a/sysdeps/nptl/pthread.h
+++ b/sysdeps/nptl/pthread.h
@@ -19,10 +19,10 @@
 #define _PTHREAD_H	1
 
 #include <features.h>
-#include <endian.h>
 #include <sched.h>
 #include <time.h>
 
+#include <bits/endian.h>
 #include <bits/pthreadtypes.h>
 #include <bits/setjmp.h>
 #include <bits/wordsize.h>
diff --git a/sysdeps/powerpc/bits/endian.h b/sysdeps/powerpc/bits/endian.h
deleted file mode 100644
index c82f7ad4de6..00000000000
--- a/sysdeps/powerpc/bits/endian.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Copyright (C) 1997-2019 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
-   <https://www.gnu.org/licenses/>.  */
-
-/* PowerPC can be little or big endian.  Hopefully gcc will know...  */
-
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-#if defined __BIG_ENDIAN__ || defined _BIG_ENDIAN
-# if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN
-#  error Both BIG_ENDIAN and LITTLE_ENDIAN defined!
-# endif
-# define __BYTE_ORDER __BIG_ENDIAN
-#else
-# if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN
-#  define __BYTE_ORDER __LITTLE_ENDIAN
-# else
-#  warning Cannot determine current byte order, assuming big-endian.
-#  define __BYTE_ORDER __BIG_ENDIAN
-# endif
-#endif
diff --git a/sysdeps/powerpc/bits/endianness.h b/sysdeps/powerpc/bits/endianness.h
new file mode 100644
index 00000000000..3e7735237e4
--- /dev/null
+++ b/sysdeps/powerpc/bits/endianness.h
@@ -0,0 +1,16 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* PowerPC has selectable endianness.  */
+#if defined __BIG_ENDIAN__ || defined _BIG_ENDIAN
+# define __BYTE_ORDER __BIG_ENDIAN
+#endif
+#if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/riscv/bits/endian.h b/sysdeps/riscv/bits/endian.h
deleted file mode 100644
index 4aaf559d4f4..00000000000
--- a/sysdeps/riscv/bits/endian.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-#define __BYTE_ORDER __LITTLE_ENDIAN
diff --git a/sysdeps/riscv/bits/endianness.h b/sysdeps/riscv/bits/endianness.h
new file mode 100644
index 00000000000..952d08595a8
--- /dev/null
+++ b/sysdeps/riscv/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* RISC-V is little-endian.  */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/riscv/nptl/bits/pthreadtypes-arch.h b/sysdeps/riscv/nptl/bits/pthreadtypes-arch.h
index 583443954e4..33f0ee43fe9 100644
--- a/sysdeps/riscv/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/riscv/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #if __riscv_xlen == 64
 # define __SIZEOF_PTHREAD_ATTR_T 		56
diff --git a/sysdeps/s390/bits/endian.h b/sysdeps/s390/bits/endian.h
deleted file mode 100644
index ac27f0119a8..00000000000
--- a/sysdeps/s390/bits/endian.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* s390 is big-endian */
-
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-#define __BYTE_ORDER __BIG_ENDIAN
diff --git a/sysdeps/s390/bits/endianness.h b/sysdeps/s390/bits/endianness.h
new file mode 100644
index 00000000000..c2d34e1c3ee
--- /dev/null
+++ b/sysdeps/s390/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* S/390 is big-endian.  */
+#define __BYTE_ORDER __BIG_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/sh/bits/endian.h b/sysdeps/sh/bits/endian.h
deleted file mode 100644
index 1fef1ff938f..00000000000
--- a/sysdeps/sh/bits/endian.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/* SH is bi-endian but with a big-endian FPU.  */
-
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-#ifdef __LITTLE_ENDIAN__
-#define __BYTE_ORDER __LITTLE_ENDIAN
-#define __FLOAT_WORD_ORDER __LITTLE_ENDIAN
-#else
-#define __BYTE_ORDER __BIG_ENDIAN
-#define __FLOAT_WORD_ORDER __BIG_ENDIAN
-#endif
diff --git a/sysdeps/sh/bits/endianness.h b/sysdeps/sh/bits/endianness.h
new file mode 100644
index 00000000000..45c7c83a63f
--- /dev/null
+++ b/sysdeps/sh/bits/endianness.h
@@ -0,0 +1,15 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* SH has selectable endianness.  */
+#ifdef __LITTLE_ENDIAN__
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#else
+#define __BYTE_ORDER __BIG_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h
index 6c9485d989d..219a8613987 100644
--- a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h
@@ -18,7 +18,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #define __SIZEOF_PTHREAD_ATTR_T 36
 #define __SIZEOF_PTHREAD_MUTEX_T 24
diff --git a/sysdeps/sparc/bits/endian.h b/sysdeps/sparc/bits/endianness.h
similarity index 56%
rename from sysdeps/sparc/bits/endian.h
rename to sysdeps/sparc/bits/endianness.h
index 8acfdf5df6f..0b6f5bf8b23 100644
--- a/sysdeps/sparc/bits/endian.h
+++ b/sysdeps/sparc/bits/endianness.h
@@ -1,12 +1,16 @@
-/* Sparc is big-endian, but v9 supports endian conversion on loads/stores
-   and GCC supports such a mode.  Be prepared.  */
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
 
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
 #endif
 
+/* Sparc is big-endian, but v9 supports endian conversion on loads/stores
+   and GCC supports such a mode.  Be prepared.  */
 #ifdef __LITTLE_ENDIAN__
 # define __BYTE_ORDER __LITTLE_ENDIAN
 #else
 # define __BYTE_ORDER __BIG_ENDIAN
 #endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/sparc/sparc32/ieee754.h b/sysdeps/sparc/sparc32/ieee754.h
index 87dc1d781dc..47f11d8a6b7 100644
--- a/sysdeps/sparc/sparc32/ieee754.h
+++ b/sysdeps/sparc/sparc32/ieee754.h
@@ -16,11 +16,11 @@
    <https://www.gnu.org/licenses/>.  */
 
 #ifndef _IEEE754_H
-
 #define _IEEE754_H 1
+
 #include <features.h>
 
-#include <endian.h>
+#include <bits/endian.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/unix/sysv/linux/generic/bits/stat.h b/sysdeps/unix/sysv/linux/generic/bits/stat.h
index 62aeea5a88d..1565f3f8248 100644
--- a/sysdeps/unix/sysv/linux/generic/bits/stat.h
+++ b/sysdeps/unix/sysv/linux/generic/bits/stat.h
@@ -23,7 +23,7 @@
 #ifndef _BITS_STAT_H
 #define _BITS_STAT_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 #include <bits/wordsize.h>
 
 /* 64-bit libc uses the kernel's 'struct stat', accessed via the
diff --git a/sysdeps/unix/sysv/linux/generic/bits/statfs.h b/sysdeps/unix/sysv/linux/generic/bits/statfs.h
index 3472084ade0..c4069aba620 100644
--- a/sysdeps/unix/sysv/linux/generic/bits/statfs.h
+++ b/sysdeps/unix/sysv/linux/generic/bits/statfs.h
@@ -20,7 +20,7 @@
 # error "Never include <bits/statfs.h> directly; use <sys/statfs.h> instead."
 #endif
 
-#include <endian.h>
+#include <bits/endian.h>
 #include <bits/types.h>
 #include <bits/wordsize.h>
 
diff --git a/sysdeps/unix/sysv/linux/hppa/pthread.h b/sysdeps/unix/sysv/linux/hppa/pthread.h
index e168901ba05..424135c800d 100644
--- a/sysdeps/unix/sysv/linux/hppa/pthread.h
+++ b/sysdeps/unix/sysv/linux/hppa/pthread.h
@@ -19,7 +19,6 @@
 #define _PTHREAD_H	1
 
 #include <features.h>
-#include <endian.h>
 #include <sched.h>
 #include <time.h>
 
diff --git a/sysdeps/unix/sysv/linux/ia64/bits/endian.h b/sysdeps/unix/sysv/linux/ia64/bits/endian.h
deleted file mode 100644
index 98a5e239916..00000000000
--- a/sysdeps/unix/sysv/linux/ia64/bits/endian.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Linux/ia64 is little-endian.  */
-
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-#define __BYTE_ORDER __LITTLE_ENDIAN
diff --git a/sysdeps/unix/sysv/linux/powerpc/htm.h b/sysdeps/unix/sysv/linux/powerpc/htm.h
index 75e3eb0397b..f17d7510130 100644
--- a/sysdeps/unix/sysv/linux/powerpc/htm.h
+++ b/sysdeps/unix/sysv/linux/powerpc/htm.h
@@ -50,7 +50,7 @@
 
 #else
 
-#include <endian.h>
+#include <bits/endian.h>
 
 /* Official HTM intrinsics interface matching GCC, but works
    on older GCC compatible compilers and binutils.
diff --git a/sysdeps/unix/sysv/linux/sys/acct.h b/sysdeps/unix/sysv/linux/sys/acct.h
index 5db43fd6759..1d2f22402af 100644
--- a/sysdeps/unix/sysv/linux/sys/acct.h
+++ b/sysdeps/unix/sysv/linux/sys/acct.h
@@ -20,7 +20,7 @@
 
 #include <sys/types.h>
 #include <stdint.h>
-#include <endian.h>
+#include <bits/endian.h>
 #include <bits/types/time_t.h>
 
 __BEGIN_DECLS
diff --git a/sysdeps/x86/bits/endian.h b/sysdeps/x86/bits/endian.h
deleted file mode 100644
index 5a56c726f71..00000000000
--- a/sysdeps/x86/bits/endian.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* i386/x86_64 are little-endian.  */
-
-#ifndef _ENDIAN_H
-# error "Never use <bits/endian.h> directly; include <endian.h> instead."
-#endif
-
-#define __BYTE_ORDER __LITTLE_ENDIAN
diff --git a/sysdeps/x86/bits/endianness.h b/sysdeps/x86/bits/endianness.h
new file mode 100644
index 00000000000..962a9ae4d6e
--- /dev/null
+++ b/sysdeps/x86/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* i386/x86_64 are little-endian.  */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/wctype/bits/wctype-wchar.h b/wctype/bits/wctype-wchar.h
index 7481f33a8cd..f584669f358 100644
--- a/wctype/bits/wctype-wchar.h
+++ b/wctype/bits/wctype-wchar.h
@@ -42,7 +42,7 @@ typedef unsigned long int wctype_t;
    endian).  We define the bit value interpretations here dependent on the
    machine's byte order.  */
 
-#  include <endian.h>
+#  include <bits/endian.h>
 #  if __BYTE_ORDER == __BIG_ENDIAN
 #   define _ISwbit(bit)	(1 << (bit))
 #  else /* __BYTE_ORDER == __LITTLE_ENDIAN */
