diff --git a/debug/pcprofile.c b/debug/pcprofile.c
index 1643ef652f..b6402ef63b 100644
--- a/debug/pcprofile.c
+++ b/debug/pcprofile.c
@@ -22,7 +22,6 @@
 #include <stdint.h>
 #include <stdlib.h>
 #include <unistd.h>
-#include <libc-internal.h>
 
 /* Nonzero if we are actually doing something.  */
 static int active;
diff --git a/elf/dl-load.c b/elf/dl-load.c
index a5318f9c8d..c1b6d4ba0f 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -36,7 +36,7 @@
 #include <caller.h>
 #include <sysdep.h>
 #include <stap-probe.h>
-#include <libc-internal.h>
+#include <libc-pointer-arith.h>
 
 #include <dl-dst.h>
 #include <dl-load.h>
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index 4ac558df52..b3c3a9bbf9 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -25,8 +25,8 @@
 #include <sys/param.h>
 #include <sys/types.h>
 #include <_itoa.h>
+#include <libc-pointer-arith.h>
 #include "dynamic-link.h"
-#include <libc-internal.h>
 
 /* Statistics function.  */
 #ifdef SHARED
diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c
index e42aa67003..ebf48bb389 100644
--- a/elf/dl-tunables.c
+++ b/elf/dl-tunables.c
@@ -22,7 +22,6 @@
 #include <stdbool.h>
 #include <unistd.h>
 #include <stdlib.h>
-#include <libc-internal.h>
 #include <sysdep.h>
 #include <fcntl.h>
 #include <ldsodefs.h>
diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h
index 86760d8844..6413558975 100644
--- a/elf/get-dynamic-info.h
+++ b/elf/get-dynamic-info.h
@@ -16,8 +16,11 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _GET_DYNAMIC_INFO_H
+#define _GET_DYNAMIC_INFO_H 1
+
 #include <assert.h>
-#include <libc-internal.h>
+#include <libc-diag.h>
 
 #ifndef RESOLVE_MAP
 static
@@ -179,3 +182,5 @@ elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
     info[DT_RPATH] = NULL;
 #endif
 }
+
+#endif /* get-dynamic-info.h */
diff --git a/elf/soinit.c b/elf/soinit.c
index 71398308d2..fe9935732b 100644
--- a/elf/soinit.c
+++ b/elf/soinit.c
@@ -4,7 +4,6 @@
    calling those lists of functions.  */
 
 #ifndef NO_CTORS_DTORS_SECTIONS
-# include <libc-internal.h>
 # include <stdlib.h>
 
 static void (*const __CTOR_LIST__[1]) (void)
diff --git a/iconv/loop.c b/iconv/loop.c
index 42a03e79b0..0160f72cd6 100644
--- a/iconv/loop.c
+++ b/iconv/loop.c
@@ -56,7 +56,7 @@
 #include <sys/param.h>		/* For MIN.  */
 #define __need_size_t
 #include <stddef.h>
-#include <libc-internal.h>
+#include <libc-diag.h>
 
 /* We have to provide support for machines which are not able to handled
    unaligned memory accesses.  Some of the character encodings have
diff --git a/iconvdata/iso-2022-cn-ext.c b/iconvdata/iso-2022-cn-ext.c
index c9c698ee85..919524f001 100644
--- a/iconvdata/iso-2022-cn-ext.c
+++ b/iconvdata/iso-2022-cn-ext.c
@@ -27,7 +27,7 @@
 #include "cns11643.h"
 #include "cns11643l1.h"
 #include "cns11643l2.h"
-#include <libc-internal.h>
+#include <libc-diag.h>
 
 #include <assert.h>
 
diff --git a/include/libc-internal.h b/include/libc-internal.h
index be6c02186f..cd2f2622ed 100644
--- a/include/libc-internal.h
+++ b/include/libc-internal.h
@@ -53,42 +53,4 @@ extern void __init_misc (int, char **, char **);
 extern __typeof (__profile_frequency) __profile_frequency attribute_hidden;
 # endif
 
-/* 1 if 'type' is a pointer type, 0 otherwise.  */
-# define __pointer_type(type) (__builtin_classify_type ((type) 0) == 5)
-
-/* __intptr_t if P is true, or T if P is false.  */
-# define __integer_if_pointer_type_sub(T, P) \
-  __typeof__ (*(0 ? (__typeof__ (0 ? (T *) 0 : (void *) (P))) 0 \
-		  : (__typeof__ (0 ? (__intptr_t *) 0 : (void *) (!(P)))) 0))
-
-/* __intptr_t if EXPR has a pointer type, or the type of EXPR otherwise.  */
-# define __integer_if_pointer_type(expr) \
-  __integer_if_pointer_type_sub(__typeof__ ((__typeof__ (expr)) 0), \
-				__pointer_type (__typeof__ (expr)))
-
-/* Cast an integer or a pointer VAL to integer with proper type.  */
-# define cast_to_integer(val) ((__integer_if_pointer_type (val)) (val))
-
-/* Align a value by rounding down to closest size.
-   e.g. Using size of 4096, we get this behavior:
-	{4095, 4096, 4097} = {0, 4096, 4096}.  */
-#define ALIGN_DOWN(base, size)	((base) & -((__typeof__ (base)) (size)))
-
-/* Align a value by rounding up to closest size.
-   e.g. Using size of 4096, we get this behavior:
-	{4095, 4096, 4097} = {4096, 4096, 8192}.
-
-  Note: The size argument has side effects (expanded multiple times).  */
-#define ALIGN_UP(base, size)	ALIGN_DOWN ((base) + (size) - 1, (size))
-
-/* Same as ALIGN_DOWN(), but automatically casts when base is a pointer.  */
-#define PTR_ALIGN_DOWN(base, size) \
-  ((__typeof__ (base)) ALIGN_DOWN ((uintptr_t) (base), (size)))
-
-/* Same as ALIGN_UP(), but automatically casts when base is a pointer.  */
-#define PTR_ALIGN_UP(base, size) \
-  ((__typeof__ (base)) ALIGN_UP ((uintptr_t) (base), (size)))
-
-#include <libc-diag.h>
-
 #endif /* _LIBC_INTERNAL  */
diff --git a/include/libc-pointer-arith.h b/include/libc-pointer-arith.h
new file mode 100644
index 0000000000..715cbc1bbe
--- /dev/null
+++ b/include/libc-pointer-arith.h
@@ -0,0 +1,60 @@
+/* Helper macros for pointer arithmetic.
+   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/>.  */
+
+#ifndef _LIBC_POINTER_ARITH_H
+#define _LIBC_POINTER_ARITH_H 1
+
+#include <stdint.h>
+
+/* 1 if 'type' is a pointer type, 0 otherwise.  */
+# define __pointer_type(type) (__builtin_classify_type ((type) 0) == 5)
+
+/* intptr_t if P is true, or T if P is false.  */
+# define __integer_if_pointer_type_sub(T, P) \
+  __typeof__ (*(0 ? (__typeof__ (0 ? (T *) 0 : (void *) (P))) 0 \
+		  : (__typeof__ (0 ? (intptr_t *) 0 : (void *) (!(P)))) 0))
+
+/* intptr_t if EXPR has a pointer type, or the type of EXPR otherwise.  */
+# define __integer_if_pointer_type(expr) \
+  __integer_if_pointer_type_sub(__typeof__ ((__typeof__ (expr)) 0), \
+				__pointer_type (__typeof__ (expr)))
+
+/* Cast an integer or a pointer VAL to integer with proper type.  */
+# define cast_to_integer(val) ((__integer_if_pointer_type (val)) (val))
+
+/* Align a value by rounding down to closest size.
+   e.g. Using size of 4096, we get this behavior:
+	{4095, 4096, 4097} = {0, 4096, 4096}.  */
+#define ALIGN_DOWN(base, size)	((base) & -((__typeof__ (base)) (size)))
+
+/* Align a value by rounding up to closest size.
+   e.g. Using size of 4096, we get this behavior:
+	{4095, 4096, 4097} = {4096, 4096, 8192}.
+
+  Note: The size argument has side effects (expanded multiple times).  */
+#define ALIGN_UP(base, size)	ALIGN_DOWN ((base) + (size) - 1, (size))
+
+/* Same as ALIGN_DOWN(), but automatically casts when base is a pointer.  */
+#define PTR_ALIGN_DOWN(base, size) \
+  ((__typeof__ (base)) ALIGN_DOWN ((uintptr_t) (base), (size)))
+
+/* Same as ALIGN_UP(), but automatically casts when base is a pointer.  */
+#define PTR_ALIGN_UP(base, size) \
+  ((__typeof__ (base)) ALIGN_UP ((uintptr_t) (base), (size)))
+
+#endif
diff --git a/io/openat.c b/io/openat.c
index c54ee34678..529f418da2 100644
--- a/io/openat.c
+++ b/io/openat.c
@@ -22,7 +22,6 @@
 #include <stdio.h>
 #include <sys/stat.h>
 #include <kernel-features.h>
-#include <libc-internal.h>
 
 /* Some mostly-generic code (e.g. sysdeps/posix/getcwd.c) uses this variable
    if __ASSUME_ATFCTS is not defined.  */
diff --git a/io/openat64.c b/io/openat64.c
index 2f564b51f0..116becda98 100644
--- a/io/openat64.c
+++ b/io/openat64.c
@@ -21,7 +21,6 @@
 #include <stddef.h>
 #include <stdio.h>
 #include <sys/stat.h>
-#include <libc-internal.h>
 
 /* Open FILE with access OFLAG.  Interpret relative paths relative to
    the directory associated with FD.  If O_CREAT or O_TMPFILE is in OFLAG, a
diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c
index 13c4e9ee42..f67b7b8d99 100644
--- a/locale/programs/locarchive.c
+++ b/locale/programs/locarchive.c
@@ -40,8 +40,8 @@
 #include <sys/shm.h>
 #include <sys/stat.h>
 
-#include <libc-internal.h>
 #include <libc-mmap.h>
+#include <libc-pointer-arith.h>
 #include "../../crypt/md5.h"
 #include "../localeinfo.h"
 #include "../locarchive.h"
diff --git a/locale/weight.h b/locale/weight.h
index f4797180d1..0558123f34 100644
--- a/locale/weight.h
+++ b/locale/weight.h
@@ -19,7 +19,7 @@
 #ifndef _WEIGHT_H_
 #define _WEIGHT_H_	1
 
-#include <libc-internal.h>
+#include <libc-diag.h>
 
 /* Find index of weight.  */
 static inline int32_t __attribute__ ((always_inline))
diff --git a/locale/weightwc.h b/locale/weightwc.h
index 6a726aa86b..97ce2b3dec 100644
--- a/locale/weightwc.h
+++ b/locale/weightwc.h
@@ -19,7 +19,7 @@
 #ifndef _WEIGHTWC_H_
 #define _WEIGHTWC_H_	1
 
-#include <libc-internal.h>
+#include <libc-diag.h>
 
 /* Find index of weight.  */
 static inline int32_t __attribute__ ((always_inline))
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 4885793905..e29105c372 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -237,7 +237,7 @@
 #include <sys/param.h>
 
 /* For ALIGN_UP et. al.  */
-#include <libc-internal.h>
+#include <libc-pointer-arith.h>
 
 #include <malloc/malloc-internal.h>
 
diff --git a/misc/ptrace.c b/misc/ptrace.c
index 06356c9c92..aace1b5a34 100644
--- a/misc/ptrace.c
+++ b/misc/ptrace.c
@@ -19,7 +19,6 @@
 #include <sys/ptrace.h>
 #include <sys/types.h>
 #include <stdarg.h>
-#include <libc-internal.h>
 
 /* Perform process tracing functions.  REQUEST is one of the values
    in <sys/ptrace.h>, and determines the action to be taken.
diff --git a/misc/reboot.c b/misc/reboot.c
index 86b0a50d65..70549c41b7 100644
--- a/misc/reboot.c
+++ b/misc/reboot.c
@@ -18,7 +18,7 @@
 #include <errno.h>
 #include <unistd.h>
 #include <sys/reboot.h>
-#include <libc-internal.h>
+#include <libc-diag.h>
 
 /* Reboot the system.  */
 int
diff --git a/nis/nis_table.c b/nis/nis_table.c
index c0b05db819..caf3e6af43 100644
--- a/nis/nis_table.c
+++ b/nis/nis_table.c
@@ -19,7 +19,7 @@
 #include <assert.h>
 #include <string.h>
 #include <rpcsvc/nis.h>
-#include <libc-internal.h>
+#include <libc-diag.h>
 
 #include "nis_xdr.h"
 #include "nis_intern.h"
diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
index 2f8599b391..29216077a2 100644
--- a/nptl/nptl-init.c
+++ b/nptl/nptl-init.c
@@ -36,7 +36,7 @@
 #include <lowlevellock.h>
 #include <futex-internal.h>
 #include <kernel-features.h>
-#include <libc-internal.h>
+#include <libc-pointer-arith.h>
 #include <pthread-pids.h>
 
 #ifndef TLS_MULTIPLE_THREADS_IN_TCB
diff --git a/nptl/pthread_clock_gettime.c b/nptl/pthread_clock_gettime.c
index e3a82f7e6a..c9abb61540 100644
--- a/nptl/pthread_clock_gettime.c
+++ b/nptl/pthread_clock_gettime.c
@@ -18,7 +18,6 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <time.h>
-#include <libc-internal.h>
 #include "pthreadP.h"
 
 
diff --git a/nptl/pthread_clock_settime.c b/nptl/pthread_clock_settime.c
index 6aeb3bece0..f2722d9635 100644
--- a/nptl/pthread_clock_settime.c
+++ b/nptl/pthread_clock_settime.c
@@ -18,7 +18,6 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <time.h>
-#include <libc-internal.h>
 #include "pthreadP.h"
 
 
diff --git a/nptl/pthread_cond_common.c b/nptl/pthread_cond_common.c
index 7c63ef9b89..ffbbde4106 100644
--- a/nptl/pthread_cond_common.c
+++ b/nptl/pthread_cond_common.c
@@ -19,7 +19,6 @@
 #include <atomic.h>
 #include <stdint.h>
 #include <pthread.h>
-#include <libc-internal.h>
 
 /* We need 3 least-significant bits on __wrefs for something else.  */
 #define __PTHREAD_COND_MAX_GROUP_SIZE ((unsigned) 1 << 29)
diff --git a/nptl_db/thread_dbP.h b/nptl_db/thread_dbP.h
index d359e79f72..c88ee2923f 100644
--- a/nptl_db/thread_dbP.h
+++ b/nptl_db/thread_dbP.h
@@ -30,7 +30,7 @@
 #include "../nptl/pthreadP.h"  	/* This is for *_BITMASK only.  */
 #include <list.h>
 #include <gnu/lib-names.h>
-#include <libc-internal.h>
+#include <libc-diag.h>
 
 /* Indeces for the symbol names.  */
 enum
diff --git a/nscd/connections.c b/nscd/connections.c
index 26d2c0091b..205ff423de 100644
--- a/nscd/connections.c
+++ b/nscd/connections.c
@@ -59,7 +59,7 @@
 #include <resolv/resolv.h>
 
 #include <kernel-features.h>
-#include <libc-internal.h>
+#include <libc-diag.h>
 
 
 /* Support to run nscd as an unprivileged user */
diff --git a/posix/wordexp-test.c b/posix/wordexp-test.c
index 15eb233001..17ae812346 100644
--- a/posix/wordexp-test.c
+++ b/posix/wordexp-test.c
@@ -22,10 +22,11 @@
 #include <unistd.h>
 #include <pwd.h>
 #include <stdio.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
 #include <wordexp.h>
-#include <libc-internal.h>
+#include <libc-pointer-arith.h>
 
 #define IFS " \n\t"
 
diff --git a/resolv/res_send.c b/resolv/res_send.c
index 93db5b9a61..28c4cabfcb 100644
--- a/resolv/res_send.c
+++ b/resolv/res_send.c
@@ -108,7 +108,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <kernel-features.h>
-#include <libc-internal.h>
+#include <libc-diag.h>
 
 #if PACKETSZ > 65536
 #define MAXPACKET       PACKETSZ
diff --git a/soft-fp/fmadf4.c b/soft-fp/fmadf4.c
index 7b7342b2e2..74e2360eb7 100644
--- a/soft-fp/fmadf4.c
+++ b/soft-fp/fmadf4.c
@@ -25,8 +25,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <libc-internal.h>
-#include <sys/cdefs.h>
+#include <math.h>
+#include <libc-diag.h>
+
 /* R_e is not set in cases where it is not used in packing, but the
    compiler does not see that it is set in all cases where it is
    used, resulting in warnings that it may be used uninitialized.
@@ -35,7 +36,7 @@
    macro is defined.  */
 DIAG_PUSH_NEEDS_COMMENT;
 DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wmaybe-uninitialized");
-#include <math.h>
+
 #include "soft-fp.h"
 #include "double.h"
 
diff --git a/soft-fp/fmasf4.c b/soft-fp/fmasf4.c
index 20c0ca8f5a..2d3120eda9 100644
--- a/soft-fp/fmasf4.c
+++ b/soft-fp/fmasf4.c
@@ -25,8 +25,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <libc-internal.h>
-#include <sys/cdefs.h>
+#include <math.h>
+#include <libc-diag.h>
+
 /* R_e is not set in cases where it is not used in packing, but the
    compiler does not see that it is set in all cases where it is
    used, resulting in warnings that it may be used uninitialized.
@@ -35,7 +36,7 @@
    macro is defined.  */
 DIAG_PUSH_NEEDS_COMMENT;
 DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wmaybe-uninitialized");
-#include <math.h>
+
 #include "soft-fp.h"
 #include "single.h"
 
diff --git a/soft-fp/fmatf4.c b/soft-fp/fmatf4.c
index d3a4ee4dc0..553a7ad3f8 100644
--- a/soft-fp/fmatf4.c
+++ b/soft-fp/fmatf4.c
@@ -25,8 +25,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <libc-internal.h>
-#include <sys/cdefs.h>
+#include <math.h>
+#include <libc-diag.h>
+
 /* R_e is not set in cases where it is not used in packing, but the
    compiler does not see that it is set in all cases where it is
    used, resulting in warnings that it may be used uninitialized.
@@ -35,7 +36,7 @@
    macro is defined.  */
 DIAG_PUSH_NEEDS_COMMENT;
 DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wmaybe-uninitialized");
-#include <math.h>
+
 #include "soft-fp.h"
 #include "quad.h"
 
diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c
index 214dab469d..1adf27e11b 100644
--- a/stdio-common/vfscanf.c
+++ b/stdio-common/vfscanf.c
@@ -27,7 +27,7 @@
 #include <string.h>
 #include <wchar.h>
 #include <wctype.h>
-#include <libc-internal.h>
+#include <libc-diag.h>
 #include <libc-lock.h>
 #include <locale/localeinfo.h>
 #include <scratch_buffer.h>
diff --git a/string/strcoll_l.c b/string/strcoll_l.c
index 7e8fbf3895..8fd55b000a 100644
--- a/string/strcoll_l.c
+++ b/string/strcoll_l.c
@@ -24,7 +24,6 @@
 #include <stdint.h>
 #include <string.h>
 #include <sys/param.h>
-#include <libc-internal.h>
 
 #ifndef STRING_TYPE
 # define STRING_TYPE char
diff --git a/string/strcspn.c b/string/strcspn.c
index 06299e2098..1035552a8e 100644
--- a/string/strcspn.c
+++ b/string/strcspn.c
@@ -17,7 +17,7 @@
 
 #include <string.h>
 #include <stdint.h>
-#include <libc-internal.h>
+#include <libc-pointer-arith.h>
 
 #undef strcspn
 
diff --git a/string/strspn.c b/string/strspn.c
index a7fec70c65..c63197cdf0 100644
--- a/string/strspn.c
+++ b/string/strspn.c
@@ -17,7 +17,7 @@
 
 #include <string.h>
 #include <stdint.h>
-#include <libc-internal.h>
+#include <libc-pointer-arith.h>
 
 #undef strspn
 #ifndef STRSPN
diff --git a/sysdeps/i386/nptl/tls.h b/sysdeps/i386/nptl/tls.h
index 2500c82305..04dc6aef91 100644
--- a/sysdeps/i386/nptl/tls.h
+++ b/sysdeps/i386/nptl/tls.h
@@ -26,7 +26,7 @@
 # include <stdint.h>
 # include <stdlib.h>
 # include <sysdep.h>
-# include <libc-internal.h>
+# include <libc-pointer-arith.h> /* For cast_to_integer. */
 # include <kernel-features.h>
 # include <dl-dtv.h>
 
diff --git a/sysdeps/ieee754/dbl-64/e_lgamma_r.c b/sysdeps/ieee754/dbl-64/e_lgamma_r.c
index c337679f7c..b5860d8a24 100644
--- a/sysdeps/ieee754/dbl-64/e_lgamma_r.c
+++ b/sysdeps/ieee754/dbl-64/e_lgamma_r.c
@@ -77,9 +77,9 @@
  *
  */
 
-#include <libc-internal.h>
 #include <math.h>
 #include <math_private.h>
+#include <libc-diag.h>
 
 static const double
 two52=  4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
diff --git a/sysdeps/ieee754/dbl-64/k_rem_pio2.c b/sysdeps/ieee754/dbl-64/k_rem_pio2.c
index d853b65a05..2b5add6976 100644
--- a/sysdeps/ieee754/dbl-64/k_rem_pio2.c
+++ b/sysdeps/ieee754/dbl-64/k_rem_pio2.c
@@ -132,7 +132,7 @@ static char rcsid[] = "$NetBSD: k_rem_pio2.c,v 1.7 1995/05/10 20:46:25 jtc Exp $
 
 #include <math.h>
 #include <math_private.h>
-#include <libc-internal.h>
+#include <libc-diag.h>
 
 static const int init_jk[] = {2,3,4,6}; /* initial value for jk */
 
diff --git a/sysdeps/ieee754/flt-32/e_lgammaf_r.c b/sysdeps/ieee754/flt-32/e_lgammaf_r.c
index 1bd2122663..1b30dcd84d 100644
--- a/sysdeps/ieee754/flt-32/e_lgammaf_r.c
+++ b/sysdeps/ieee754/flt-32/e_lgammaf_r.c
@@ -13,9 +13,9 @@
  * ====================================================
  */
 
-#include <libc-internal.h>
 #include <math.h>
 #include <math_private.h>
+#include <libc-diag.h>
 
 static const float
 two23=  8.3886080000e+06, /* 0x4b000000 */
diff --git a/sysdeps/ieee754/flt-32/k_rem_pio2f.c b/sysdeps/ieee754/flt-32/k_rem_pio2f.c
index 52ffb09f0e..a8d5b216e6 100644
--- a/sysdeps/ieee754/flt-32/k_rem_pio2f.c
+++ b/sysdeps/ieee754/flt-32/k_rem_pio2f.c
@@ -19,7 +19,7 @@ static char rcsid[] = "$NetBSD: k_rem_pio2f.c,v 1.4 1995/05/10 20:46:28 jtc Exp
 
 #include <math.h>
 #include <math_private.h>
-#include <libc-internal.h>
+#include <libc-diag.h>
 
 /* In the float version, the input parameter x contains 8 bit
    integers, not 24 bit integers.  113 bit precision is not supported.  */
diff --git a/sysdeps/ieee754/ldbl-128/k_tanl.c b/sysdeps/ieee754/ldbl-128/k_tanl.c
index dc9c457f6a..e79023c69a 100644
--- a/sysdeps/ieee754/ldbl-128/k_tanl.c
+++ b/sysdeps/ieee754/ldbl-128/k_tanl.c
@@ -57,9 +57,10 @@
  */
 
 #include <float.h>
-#include <libc-internal.h>
 #include <math.h>
 #include <math_private.h>
+#include <libc-diag.h>
+
 static const _Float128
   one = 1,
   pio4hi = L(7.8539816339744830961566084581987569936977E-1),
diff --git a/sysdeps/ieee754/ldbl-128ibm/k_tanl.c b/sysdeps/ieee754/ldbl-128ibm/k_tanl.c
index 3c1bf32af9..232e00c345 100644
--- a/sysdeps/ieee754/ldbl-128ibm/k_tanl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/k_tanl.c
@@ -57,9 +57,10 @@
  */
 
 #include <float.h>
-#include <libc-internal.h>
 #include <math.h>
 #include <math_private.h>
+#include <libc-diag.h>
+
 static const long double
   one = 1.0L,
   pio4hi = 7.8539816339744830961566084581987569936977E-1L,
diff --git a/sysdeps/ieee754/ldbl-96/e_lgammal_r.c b/sysdeps/ieee754/ldbl-96/e_lgammal_r.c
index 9862fe8d5c..4ecd63045f 100644
--- a/sysdeps/ieee754/ldbl-96/e_lgammal_r.c
+++ b/sysdeps/ieee754/ldbl-96/e_lgammal_r.c
@@ -91,9 +91,9 @@
  *
  */
 
-#include <libc-internal.h>
 #include <math.h>
 #include <math_private.h>
+#include <libc-diag.h>
 
 static const long double
   half = 0.5L,
diff --git a/sysdeps/ieee754/ldbl-96/k_tanl.c b/sysdeps/ieee754/ldbl-96/k_tanl.c
index 0c050c112f..f8641d5ce4 100644
--- a/sysdeps/ieee754/ldbl-96/k_tanl.c
+++ b/sysdeps/ieee754/ldbl-96/k_tanl.c
@@ -57,9 +57,10 @@
  */
 
 #include <float.h>
-#include <libc-internal.h>
 #include <math.h>
 #include <math_private.h>
+#include <libc-diag.h>
+
 static const long double
   one = 1.0L,
   pio4hi = 0xc.90fdaa22168c235p-4L,
diff --git a/sysdeps/nacl/brk.c b/sysdeps/nacl/brk.c
index 15e0c4fdfe..c96c66f3b8 100644
--- a/sysdeps/nacl/brk.c
+++ b/sysdeps/nacl/brk.c
@@ -17,7 +17,6 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <errno.h>
-#include <libc-internal.h>
 #include <stdint.h>
 #include <sys/mman.h>
 #include <sys/param.h>
diff --git a/sysdeps/nacl/dl-map-segments.h b/sysdeps/nacl/dl-map-segments.h
index 501d8be6ec..ab2ad43838 100644
--- a/sysdeps/nacl/dl-map-segments.h
+++ b/sysdeps/nacl/dl-map-segments.h
@@ -16,12 +16,15 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _NACL_DL_MAP_SEGMENTS_H
+#define _NACL_DL_MAP_SEGMENTS_H 1
+
 #include <assert.h>
 #include <dl-load.h>
 #include <errno.h>
 #include <stdbool.h>
 #include <unistd.h>
-#include <libc-internal.h>
+#include <libc-pointer-arith.h>
 
 
 /* This is basically pread, but with iteration after short reads.  */
@@ -262,3 +265,5 @@ _dl_map_segments (struct link_map *l, int fd,
 
   return NULL;
 }
+
+#endif /* dl-map-segments.h */
diff --git a/sysdeps/nptl/futex-internal.h b/sysdeps/nptl/futex-internal.h
index 532d47d6a3..be7a33f460 100644
--- a/sysdeps/nptl/futex-internal.h
+++ b/sysdeps/nptl/futex-internal.h
@@ -23,7 +23,7 @@
 #include <sys/time.h>
 #include <stdio.h>
 #include <stdbool.h>
-#include <libc-internal.h>
+#include <libc-diag.h>
 
 /* This file defines futex operations used internally in glibc.  A futex
    consists of the so-called futex word in userspace, which is of type
diff --git a/sysdeps/unix/clock_settime.c b/sysdeps/unix/clock_settime.c
index 957a4b1599..e744cae6a9 100644
--- a/sysdeps/unix/clock_settime.c
+++ b/sysdeps/unix/clock_settime.c
@@ -18,7 +18,6 @@
 #include <errno.h>
 #include <time.h>
 #include <sys/time.h>
-#include <libc-internal.h>
 #include <ldsodefs.h>
 
 
diff --git a/sysdeps/unix/sysv/linux/i386/get_clockfreq.c b/sysdeps/unix/sysv/linux/i386/get_clockfreq.c
index bee3fe84e5..88e14b5f04 100644
--- a/sysdeps/unix/sysv/linux/i386/get_clockfreq.c
+++ b/sysdeps/unix/sysv/linux/i386/get_clockfreq.c
@@ -20,8 +20,6 @@
 #include <fcntl.h>
 #include <string.h>
 #include <unistd.h>
-#include <libc-internal.h>
-
 
 hp_timing_t
 __get_clockfreq (void)
diff --git a/sysdeps/unix/sysv/linux/ia64/get_clockfreq.c b/sysdeps/unix/sysv/linux/ia64/get_clockfreq.c
index 5dd9c01261..603c7d516e 100644
--- a/sysdeps/unix/sysv/linux/ia64/get_clockfreq.c
+++ b/sysdeps/unix/sysv/linux/ia64/get_clockfreq.c
@@ -20,7 +20,6 @@
 #include <fcntl.h>
 #include <string.h>
 #include <unistd.h>
-#include <libc-internal.h>
 
 
 hp_timing_t
diff --git a/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c b/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c
index ad1622d601..b8d01d8ca6 100644
--- a/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c
+++ b/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c
@@ -21,7 +21,6 @@
 #include <stdint.h>
 #include <string.h>
 #include <unistd.h>
-#include <libc-internal.h>
 #include <sysdep.h>
 #include <libc-vdso.h>
 #include <not-cancel.h>
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/get_clockfreq.c b/sysdeps/unix/sysv/linux/sparc/sparc64/get_clockfreq.c
index dc9ba695bb..a0349790dc 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/get_clockfreq.c
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/get_clockfreq.c
@@ -24,7 +24,6 @@
 #include <stdlib.h>
 #include <inttypes.h>
 #include <sys/ioctl.h>
-#include <libc-internal.h>
 #include <asm/openpromio.h>
 
 static hp_timing_t
diff --git a/sysdeps/unix/sysv/linux/spawni.c b/sysdeps/unix/sysv/linux/spawni.c
index 2daf0c5ef0..24f75dbd9c 100644
--- a/sysdeps/unix/sysv/linux/spawni.c
+++ b/sysdeps/unix/sysv/linux/spawni.c
@@ -30,8 +30,8 @@
 #include <shlib-compat.h>
 #include <nptl/pthreadP.h>
 #include <dl-sysdep.h>
+#include <libc-pointer-arith.h>
 #include <ldsodefs.h>
-#include <libc-internal.h>
 #include "spawn_int.h"
 
 /* The Linux implementation of posix_spawn{p} uses the clone syscall directly
diff --git a/sysdeps/x86_64/atomic-machine.h b/sysdeps/x86_64/atomic-machine.h
index 672a7eb025..2e8a9aad04 100644
--- a/sysdeps/x86_64/atomic-machine.h
+++ b/sysdeps/x86_64/atomic-machine.h
@@ -16,10 +16,12 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <stdint.h>
-#include <tls.h>	/* For tcbhead_t.  */
-#include <libc-internal.h>
+#ifndef _X86_64_ATOMIC_MACHINE_H
+#define _X86_64_ATOMIC_MACHINE_H 1
 
+#include <stdint.h>
+#include <tls.h>                   /* For tcbhead_t.  */
+#include <libc-pointer-arith.h>    /* For cast_to_integer.  */
 
 typedef int8_t atomic8_t;
 typedef uint8_t uatomic8_t;
@@ -475,3 +477,5 @@ typedef uintmax_t uatomic_max_t;
     __asm __volatile (LOCK_PREFIX "orl $0, (%%rsp)" ::: "memory")
 #define atomic_read_barrier() __asm ("" ::: "memory")
 #define atomic_write_barrier() __asm ("" ::: "memory")
+
+#endif /* atomic-machine.h */
diff --git a/sysdeps/x86_64/nptl/tls.h b/sysdeps/x86_64/nptl/tls.h
index f2afe85602..53b41bc84f 100644
--- a/sysdeps/x86_64/nptl/tls.h
+++ b/sysdeps/x86_64/nptl/tls.h
@@ -26,7 +26,7 @@
 # include <stdint.h>
 # include <stdlib.h>
 # include <sysdep.h>
-# include <libc-internal.h>
+# include <libc-pointer-arith.h> /* For cast_to_integer.  */
 # include <kernel-features.h>
 # include <dl-dtv.h>
 
