about summary refs log tree commit diff
diff options
context:
space:
mode:
authorZack Weinberg <zackw@panix.com>2018-02-02 19:36:42 -0500
committerZack Weinberg <zackw@panix.com>2018-02-07 10:07:31 -0500
commita4fea3f2c3253b9ae6ffacd3747034ccbe56bc60 (patch)
tree8700a2647ffc3108fbdada0ebb0be1b437b99166
parent8b4a118222c7ed41bc653943b542915946dff1dd (diff)
downloadglibc-a4fea3f2c3253b9ae6ffacd3747034ccbe56bc60.tar.gz
glibc-a4fea3f2c3253b9ae6ffacd3747034ccbe56bc60.tar.xz
glibc-a4fea3f2c3253b9ae6ffacd3747034ccbe56bc60.zip
Don't install libio.h or _G_config.h.
We shipped 2.27 with libio.h and _G_config.h still installed but
issuing warnings when used.  Let's stop installing them early in 2.28
so that we have plenty of time to think of another plan if there are
problems.

The public stdio.h had a genuine dependency on libio.h for the
complete definitions of FILE and cookie_io_functions_t, and a genuine
dependency on _G_config.h for the complete definitions of fpos_t and
fpos64_t; these are moved to single-type headers.
bits/types/struct_FILE.h also provides a handful of accessor and
bitflags macros so that code is not duplicated between bits/stdio.h
and libio.h.  All the other _IO_ and _G_ names used by the public
stdio.h can be replaced with either public names or __-names.

In order to minimize the risk of breaking our own compatibility code,
bits/types/struct_FILE.h preserves the _IO_USE_OLD_IO_FILE mechanism
exactly as it was in libio.h, but you have to define _LIBC to use it,
or it'll error out.  Similarly, _IO_lock_t_defined is preserved
exactly, but will error out if used without defining _LIBC.

Internally, include/stdio.h continues to include libio.h, and libio.h
scrupulously provides every _IO_* and _G_* name that it always did,
perhaps now defined in terms of the public names.  This is how this
patch avoids touching dozens of files throughout glibc and becoming
entangled with the _IO_MTSAFE_IO mess.  The remaining patches in this
series eliminate most of the _G_ names.

Tested on x86_64-linux; in addition to the test suite, I installed the
library in a sysroot and verified that a simple program that uses
stdio.h could be compiled against the installed library, and I also
verified that installed stripped libraries are unchanged.

	* libio/bits/types/__fpos_t.h, libio/bits/types/__fpos64_t.h:
	New single-type headers split from _G_config.h.
	* libio/bits/types/cookie_io_functions_t.h
	* libio/bits/types/struct_FILE.h
	New single-type headers split from libio.h.

	* libio/Makefile: Install the above new headers.  Don't install
	libio.h, _G_config.h, bits/libio.h, bits/_G_config.h, or
	bits/libio-ldbl.h.
	* libio/_G_config.h, libio/libio.h: Delete file.

	* libio/bits/libio.h: Remove improper-inclusion guard.
	Include stdio.h and don't repeat anything that it does.
	Define _IO_fpos_t as __fpos_t, _IO_fpos64_t as __fpos64_t,
	_IO_BUFSIZ as BUFSIZ, _IO_va_list as __gnuc_va_list,
	__io_read_fn as cookie_read_function_t,
	__io_write_fn as cookie_write_function_t,
	__io_seek_fn as cookie_seek_function_t,
	__io_close_fn as cookie_close_function_t,
	and _IO_cookie_io_functions_t as cookie_io_functions_t.
	Define _STDIO_USES_IOSTREAM, __HAVE_COLUMN, and _IO_file_flags
	here, in the "compatibility defines" section.  Remove an #if 0
	block.  Use the "body" macros from bits/types/struct_FILE.h to
	define _IO_getc_unlocked, _IO_putc_unlocked, _IO_feof_unlocked,
	and _IO_ferror_unlocked.
	Move prototypes of __uflow and __overflow...

	* libio/stdio.h: ...here.  Don't include bits/libio.h.
	Don't define _STDIO_USES_IOSTREAM.  Get __gnuc_va_list
	directly from stdarg.h.  Include bits/types/__fpos_t.h,
	bits/types/__fpos64_t.h, bits/types/struct_FILE.h,
	and, when __USE_GNU, bits/types/cookie_io_functions_t.h.
	Use __gnuc_va_list, not _G_va_list; __fpos_t, not _G_fpos_t;
	__fpos64_t, not _G_fpos64_t; FILE, not struct _IO_FILE;
	cookie_io_functions_t, not _IO_cookie_io_functions_t;
	__ssize_t, not _IO_ssize_t.  Unconditionally define
	BUFSIZ as 8192 and EOF as (-1).

	* libio/bits/stdio.h: Add multiple-include guard.  Use the "body"
	macros from bits/types/struct_FILE.h instead of _IO_* macros
	from libio.h; use __gnuc_va_list instead of va_list and __ssize_t
	instead of _IO_ssize_t.
	* libio/bits/stdio2.h: Similarly.

	* libio/iolibio.h: Add multiple-include guard.
	Include bits/libio.h after stdio.h.
	* libio/libioP.h: Add multiple-include guard.
	Include stdio.h and bits/libio.h before iolibio.h.

        * include/bits/types/__fpos_t.h, include/bits/types/__fpos64_t.h
	* include/bits/types/cookie_io_functions_t.h
	* include/bits/types/struct_FILE.h: New wrappers.

	* bits/_G_config.h, sysdeps/unix/sysv/linux/_G_config.h:
        Get definitions of _G_fpos_t and _G_fpos64_t from
        bits/types/__fpos_t.h and bits/types/__fpos64_t.h
        respectively.  Remove improper-inclusion guards.

        * conform/data/stdio.h-data: Update expectations of va_list.
	* scripts/check-installed-headers.sh: Remove special case for
        libio.h and _G_config.h.
-rw-r--r--ChangeLog65
-rw-r--r--NEWS4
-rw-r--r--bits/_G_config.h20
-rw-r--r--conform/data/stdio.h-data2
-rw-r--r--include/bits/types/__fpos64_t.h1
-rw-r--r--include/bits/types/__fpos_t.h1
-rw-r--r--include/bits/types/cookie_io_functions_t.h1
-rw-r--r--include/bits/types/struct_FILE.h1
-rw-r--r--include/stdio.h5
-rw-r--r--libio/Makefile9
-rw-r--r--libio/_G_config.h25
-rw-r--r--libio/bits/libio.h194
-rw-r--r--libio/bits/stdio.h29
-rw-r--r--libio/bits/stdio2.h35
-rw-r--r--libio/bits/types/__fpos64_t.h16
-rw-r--r--libio/bits/types/__fpos_t.h16
-rw-r--r--libio/bits/types/cookie_io_functions_t.h63
-rw-r--r--libio/bits/types/struct_FILE.h120
-rw-r--r--libio/iolibio.h6
-rw-r--r--libio/libio.h25
-rw-r--r--libio/libioP.h7
-rw-r--r--libio/stdio.h95
-rw-r--r--scripts/check-installed-headers.sh5
-rw-r--r--sysdeps/unix/sysv/linux/bits/_G_config.h20
24 files changed, 433 insertions, 332 deletions
diff --git a/ChangeLog b/ChangeLog
index 66fda89745..d80e9c366e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,68 @@
+2018-02-07  Zack Weinberg  <zackw@panix.com>
+
+	* libio/bits/types/__fpos_t.h, libio/bits/types/__fpos64_t.h:
+	New single-type headers split from _G_config.h.
+	* libio/bits/types/cookie_io_functions_t.h
+	* libio/bits/types/struct_FILE.h
+	New single-type headers split from libio.h.
+
+	* libio/Makefile: Install the above new headers.  Don't install
+	libio.h, _G_config.h, bits/libio.h, bits/_G_config.h, or
+	bits/libio-ldbl.h.
+	* libio/_G_config.h, libio/libio.h: Delete file.
+
+	* libio/bits/libio.h: Remove improper-inclusion guard.
+	Include stdio.h and don't repeat anything that it does.
+	Define _IO_fpos_t as __fpos_t, _IO_fpos64_t as __fpos64_t,
+	_IO_BUFSIZ as BUFSIZ, _IO_va_list as __gnuc_va_list,
+	__io_read_fn as cookie_read_function_t,
+	__io_write_fn as cookie_write_function_t,
+	__io_seek_fn as cookie_seek_function_t,
+	__io_close_fn as cookie_close_function_t,
+	and _IO_cookie_io_functions_t as cookie_io_functions_t.
+	Define _STDIO_USES_IOSTREAM, __HAVE_COLUMN, and _IO_file_flags
+	here, in the "compatibility defines" section.  Remove an #if 0
+	block.  Use the "body" macros from bits/types/struct_FILE.h to
+	define _IO_getc_unlocked, _IO_putc_unlocked, _IO_feof_unlocked,
+	and _IO_ferror_unlocked.
+	Move prototypes of __uflow and __overflow...
+
+	* libio/stdio.h: ...here.  Don't include bits/libio.h.
+	Don't define _STDIO_USES_IOSTREAM.  Get __gnuc_va_list
+	directly from stdarg.h.  Include bits/types/__fpos_t.h,
+	bits/types/__fpos64_t.h, bits/types/struct_FILE.h,
+	and, when __USE_GNU, bits/types/cookie_io_functions_t.h.
+	Use __gnuc_va_list, not _G_va_list; __fpos_t, not _G_fpos_t;
+	__fpos64_t, not _G_fpos64_t; FILE, not struct _IO_FILE;
+	cookie_io_functions_t, not _IO_cookie_io_functions_t;
+	__ssize_t, not _IO_ssize_t.  Unconditionally define
+	BUFSIZ as 8192 and EOF as (-1).
+
+	* libio/bits/stdio.h: Add multiple-include guard.  Use the "body"
+	macros from bits/types/struct_FILE.h instead of _IO_* macros
+	from libio.h; use __gnuc_va_list instead of va_list and __ssize_t
+	instead of _IO_ssize_t.
+	* libio/bits/stdio2.h: Similarly.
+
+	* libio/iolibio.h: Add multiple-include guard.
+	Include bits/libio.h after stdio.h.
+	* libio/libioP.h: Add multiple-include guard.
+	Include stdio.h and bits/libio.h before iolibio.h.
+
+        * include/bits/types/__fpos_t.h, include/bits/types/__fpos64_t.h
+	* include/bits/types/cookie_io_functions_t.h
+	* include/bits/types/struct_FILE.h: New wrappers.
+
+	* bits/_G_config.h, sysdeps/unix/sysv/linux/_G_config.h:
+        Get definitions of _G_fpos_t and _G_fpos64_t from
+        bits/types/__fpos_t.h and bits/types/__fpos64_t.h
+        respectively.  Remove improper-inclusion guards.
+
+        * conform/data/stdio.h-data: Update expectations of va_list.
+	* scripts/check-installed-headers.sh: Remove special case for
+        libio.h and _G_config.h.
+
+
 2018-02-07  Joseph Myers  <joseph@codesourcery.com>
 
 	[BZ #15105]
diff --git a/NEWS b/NEWS
index 3629944946..06c92519a3 100644
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,10 @@ Major new features:
 
 Deprecated and removed features, and other changes affecting compatibility:
 
+ * The nonstandard header files <libio.h> and <_G_config.h> are no longer
+   installed.  Software that was using either header should be updated to
+   use standard <stdio.h> interfaces instead.
+
  * The stdio.h functions 'getc' and 'putc' are no longer defined as macros.
    This was never required by the C standard, and the macros just expanded
    to call alternative names for the same functions.  If you hoped getc and
diff --git a/bits/_G_config.h b/bits/_G_config.h
index 2b60d29f5f..8c81bc4278 100644
--- a/bits/_G_config.h
+++ b/bits/_G_config.h
@@ -4,10 +4,6 @@
 #ifndef _BITS_G_CONFIG_H
 #define _BITS_G_CONFIG_H 1
 
-#if !defined _BITS_LIBIO_H && !defined _G_CONFIG_H
-# error "Never include <bits/_G_config.h> directly; use <stdio.h> instead."
-#endif
-
 /* Define types for libio in terms of the standard internal type names.  */
 
 #include <bits/types.h>
@@ -19,20 +15,16 @@
 #include <stddef.h>
 
 #include <bits/types/__mbstate_t.h>
+#include <bits/types/__fpos_t.h>
+#include <bits/types/__fpos64_t.h>
+
+#define _G_fpos_t __fpos_t
+#define _G_fpos64_t __fpos64_t
+
 #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
 # include <bits/types/wint_t.h>
 #endif
 
-typedef struct
-{
-  __off_t __pos;
-  __mbstate_t __state;
-} _G_fpos_t;
-typedef struct
-{
-  __off64_t __pos;
-  __mbstate_t __state;
-} _G_fpos64_t;
 #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
 # include <gconv.h>
 typedef union
diff --git a/conform/data/stdio.h-data b/conform/data/stdio.h-data
index f69802cc70..3ef2460661 100644
--- a/conform/data/stdio.h-data
+++ b/conform/data/stdio.h-data
@@ -41,7 +41,7 @@ type fpos_t
 #if !defined ISO && !defined ISO99 && !defined ISO11 && !defined POSIX
 type va_list
 #else
-#define va_list _G_va_list
+#define va_list __gnuc_va_list
 #endif
 type size_t
 #if defined XOPEN2K8 || defined POSIX2008
diff --git a/include/bits/types/__fpos64_t.h b/include/bits/types/__fpos64_t.h
new file mode 100644
index 0000000000..68cc4e8b66
--- /dev/null
+++ b/include/bits/types/__fpos64_t.h
@@ -0,0 +1 @@
+#include <libio/bits/types/__fpos64_t.h>
diff --git a/include/bits/types/__fpos_t.h b/include/bits/types/__fpos_t.h
new file mode 100644
index 0000000000..2dcdc98d75
--- /dev/null
+++ b/include/bits/types/__fpos_t.h
@@ -0,0 +1 @@
+#include <libio/bits/types/__fpos_t.h>
diff --git a/include/bits/types/cookie_io_functions_t.h b/include/bits/types/cookie_io_functions_t.h
new file mode 100644
index 0000000000..87f7930c6e
--- /dev/null
+++ b/include/bits/types/cookie_io_functions_t.h
@@ -0,0 +1 @@
+#include <libio/bits/types/cookie_io_functions_t.h>
diff --git a/include/bits/types/struct_FILE.h b/include/bits/types/struct_FILE.h
new file mode 100644
index 0000000000..971407292b
--- /dev/null
+++ b/include/bits/types/struct_FILE.h
@@ -0,0 +1 @@
+#include <libio/bits/types/struct_FILE.h>
diff --git a/include/stdio.h b/include/stdio.h
index f1e987ae5e..3b6da17d82 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -1,6 +1,11 @@
 #ifndef _STDIO_H
+# if !defined _ISOMAC && defined _IO_MTSAFE_IO
+#  include <stdio-lock.h>
+# endif
 # include <libio/stdio.h>
 # ifndef _ISOMAC
+#  define _LIBC_STDIO_H 1
+#  include <bits/libio.h>
 
 /* Now define the internal interfaces.  */
 
diff --git a/libio/Makefile b/libio/Makefile
index 918a86bb74..3e08ed0eeb 100644
--- a/libio/Makefile
+++ b/libio/Makefile
@@ -22,10 +22,11 @@ subdir	:= libio
 
 include ../Makeconfig
 
-headers	:= stdio.h libio.h _G_config.h \
-	   bits/stdio.h bits/libio.h bits/_G_config.h \
-	   bits/sys_errlist.h bits/stdio2.h bits/stdio-ldbl.h bits/libio-ldbl.h \
-	   bits/types/FILE.h bits/types/__FILE.h
+headers	:= stdio.h \
+	   bits/stdio.h bits/stdio2.h bits/sys_errlist.h bits/stdio-ldbl.h \
+	   bits/types/FILE.h bits/types/__FILE.h bits/types/struct_FILE.h \
+	   bits/types/__fpos_t.h bits/types/__fpos64_t.h \
+	   bits/types/cookie_io_functions_t.h
 
 routines	:=							      \
 	filedoalloc iofclose iofdopen iofflush iofgetpos iofgets iofopen      \
diff --git a/libio/_G_config.h b/libio/_G_config.h
deleted file mode 100644
index 68de2fcaa0..0000000000
--- a/libio/_G_config.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright (C) 2017-2018 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 _G_CONFIG_H
-#define _G_CONFIG_H 1
-
-#warning "<_G_config.h> is deprecated; use <stdio.h> instead."
-
-#include <bits/_G_config.h>
-
-#endif
diff --git a/libio/bits/libio.h b/libio/bits/libio.h
index fae5b932a1..cefc2c855b 100644
--- a/libio/bits/libio.h
+++ b/libio/bits/libio.h
@@ -28,14 +28,12 @@
 #ifndef _BITS_LIBIO_H
 #define _BITS_LIBIO_H 1
 
-#if !defined _STDIO_H && !defined _LIBIO_H
-# error "Never include <bits/libio.h> directly; use <stdio.h> instead."
-#endif
+#include <stdio.h>
 
 #include <bits/_G_config.h>
 /* ALL of these should be defined in _G_config.h */
-#define _IO_fpos_t _G_fpos_t
-#define _IO_fpos64_t _G_fpos64_t
+#define _IO_fpos_t __fpos_t
+#define _IO_fpos64_t __fpos64_t
 #define _IO_size_t size_t
 #define _IO_ssize_t __ssize_t
 #define _IO_off_t __off_t
@@ -44,40 +42,17 @@
 #define _IO_uid_t __uid_t
 #define _IO_iconv_t _G_iconv_t
 #define _IO_HAVE_ST_BLKSIZE _G_HAVE_ST_BLKSIZE
-#define _IO_BUFSIZ _G_BUFSIZ
-#define _IO_va_list _G_va_list
+#define _IO_BUFSIZ BUFSIZ
 #define _IO_wint_t wint_t
+#define _IO_va_list __gnuc_va_list
 
-/* This define avoids name pollution if we're using GNU stdarg.h */
-#define __need___va_list
-#include <stdarg.h>
-#ifdef __GNUC_VA_LIST
-# undef _IO_va_list
-# define _IO_va_list __gnuc_va_list
-#endif /* __GNUC_VA_LIST */
-
-#ifndef __P
-# include <sys/cdefs.h>
-#endif /*!__P*/
-
+/* compatibility defines */
+#define _STDIO_USES_IOSTREAM
 #define _IO_UNIFIED_JUMPTABLES 1
+#define __HAVE_COLUMN
+#define _IO_file_flags _flags
 
-#ifndef EOF
-# define EOF (-1)
-#endif
-#ifndef NULL
-# if defined __GNUG__ && \
-    (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
-#  define NULL (__null)
-# else
-#  if !defined(__cplusplus)
-#   define NULL ((void*)0)
-#  else
-#   define NULL (0)
-#  endif
-# endif
-#endif
-
+/* open modes */
 #define _IOS_INPUT	1
 #define _IOS_OUTPUT	2
 #define _IOS_ATEND	4
@@ -146,14 +121,7 @@
 #define _IO_BOOLALPHA 0200000
 
 
-struct _IO_jump_t;  struct _IO_FILE;
-
-/* During the build of glibc itself, _IO_lock_t will already have been
-   defined by internal headers.  */
-#ifndef _IO_lock_t_defined
-typedef void _IO_lock_t;
-#endif
-
+struct _IO_jump_t;
 
 /* A streammarker remembers a position in a buffer. */
 
@@ -164,16 +132,6 @@ struct _IO_marker {
  it points to _buf->Gbase()+_pos. FIXME comment */
   /* if _pos < 0, it points to _buf->eBptr()+_pos. FIXME comment */
   int _pos;
-#if 0
-    void set_streampos(streampos sp) { _spos = sp; }
-    void set_offset(int offset) { _pos = offset; _spos = (streampos)(-2); }
-  public:
-    streammarker(streambuf *sb);
-    ~streammarker();
-    int saving() { return  _spos == -2; }
-    int delta(streammarker&);
-    int delta();
-#endif
 };
 
 /* This is the structure from the libstdc++ codecvt class.  */
@@ -242,73 +200,6 @@ struct _IO_wide_data
 };
 #endif
 
-struct _IO_FILE {
-  int _flags;		/* High-order word is _IO_MAGIC; rest is flags. */
-#define _IO_file_flags _flags
-
-  /* The following pointers correspond to the C++ streambuf protocol. */
-  /* Note:  Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
-  char* _IO_read_ptr;	/* Current read pointer */
-  char* _IO_read_end;	/* End of get area. */
-  char* _IO_read_base;	/* Start of putback+get area. */
-  char* _IO_write_base;	/* Start of put area. */
-  char* _IO_write_ptr;	/* Current put pointer. */
-  char* _IO_write_end;	/* End of put area. */
-  char* _IO_buf_base;	/* Start of reserve area. */
-  char* _IO_buf_end;	/* End of reserve area. */
-  /* The following fields are used to support backing up and undo. */
-  char *_IO_save_base; /* Pointer to start of non-current get area. */
-  char *_IO_backup_base;  /* Pointer to first valid character of backup area */
-  char *_IO_save_end; /* Pointer to end of non-current get area. */
-
-  struct _IO_marker *_markers;
-
-  struct _IO_FILE *_chain;
-
-  int _fileno;
-#if 0
-  int _blksize;
-#else
-  int _flags2;
-#endif
-  _IO_off_t _old_offset; /* This used to be _offset but it's too small.  */
-
-#define __HAVE_COLUMN /* temporary */
-  /* 1+column number of pbase(); 0 is unknown. */
-  unsigned short _cur_column;
-  signed char _vtable_offset;
-  char _shortbuf[1];
-
-  /*  char* _save_gptr;  char* _save_egptr; */
-
-  _IO_lock_t *_lock;
-#ifdef _IO_USE_OLD_IO_FILE
-};
-
-struct _IO_FILE_complete
-{
-  struct _IO_FILE _file;
-#endif
-#if defined _G_IO_IO_FILE_VERSION && _G_IO_IO_FILE_VERSION == 0x20001
-  _IO_off64_t _offset;
-# if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-  /* Wide character stream stuff.  */
-  struct _IO_codecvt *_codecvt;
-  struct _IO_wide_data *_wide_data;
-  struct _IO_FILE *_freeres_list;
-  void *_freeres_buf;
-# else
-  void *__pad1;
-  void *__pad2;
-  void *__pad3;
-  void *__pad4;
-# endif
-  size_t __pad5;
-  int _mode;
-  /* Make sure we don't get into trouble again.  */
-  char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];
-#endif
-};
 
 #ifndef __cplusplus
 typedef struct _IO_FILE _IO_FILE;
@@ -330,49 +221,13 @@ extern _IO_FILE *_IO_stderr attribute_hidden;
 #endif
 
 
-/* Functions to do I/O and file management for a stream.  */
-
-/* Read NBYTES bytes from COOKIE into a buffer pointed to by BUF.
-   Return number of bytes read.  */
-typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes);
-
-/* Write N bytes pointed to by BUF to COOKIE.  Write all N bytes
-   unless there is an error.  Return number of bytes written.  If
-   there is an error, return 0 and do not write anything.  If the file
-   has been opened for append (__mode.__append set), then set the file
-   pointer to the end of the file and then do the write; if not, just
-   write at the current file pointer.  */
-typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf,
-				 size_t __n);
-
-/* Move COOKIE's file position to *POS bytes from the
-   beginning of the file (if W is SEEK_SET),
-   the current position (if W is SEEK_CUR),
-   or the end of the file (if W is SEEK_END).
-   Set *POS to the new file position.
-   Returns zero if successful, nonzero if not.  */
-typedef int __io_seek_fn (void *__cookie, _IO_off64_t *__pos, int __w);
-
-/* Close COOKIE.  */
-typedef int __io_close_fn (void *__cookie);
-
-
+/* Compatibility names for cookie I/O functions.  */
 #ifdef __USE_GNU
-/* User-visible names for the above.  */
-typedef __io_read_fn cookie_read_function_t;
-typedef __io_write_fn cookie_write_function_t;
-typedef __io_seek_fn cookie_seek_function_t;
-typedef __io_close_fn cookie_close_function_t;
-
-/* The structure with the cookie function pointers.  */
-typedef struct
-{
-  __io_read_fn *read;		/* Read bytes.  */
-  __io_write_fn *write;		/* Write bytes.  */
-  __io_seek_fn *seek;		/* Seek/tell file position.  */
-  __io_close_fn *close;		/* Close file.  */
-} _IO_cookie_io_functions_t;
-typedef _IO_cookie_io_functions_t cookie_io_functions_t;
+typedef cookie_read_function_t __io_read_fn;
+typedef cookie_write_function_t __io_write_fn;
+typedef cookie_seek_function_t __io_seek_fn;
+typedef cookie_close_function_t __io_close_fn;
+typedef cookie_io_functions_t _IO_cookie_io_functions_t;
 
 struct _IO_cookie_file;
 
@@ -387,8 +242,6 @@ extern "C" {
 #endif
 
 extern int __underflow (_IO_FILE *);
-extern int __uflow (_IO_FILE *);
-extern int __overflow (_IO_FILE *, int);
 #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
 extern _IO_wint_t __wunderflow (_IO_FILE *);
 extern _IO_wint_t __wuflow (_IO_FILE *);
@@ -401,17 +254,12 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t);
 # define _IO_BE(expr, res) (expr)
 #endif
 
-#define _IO_getc_unlocked(_fp) \
-       (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
-	? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)
+#define _IO_getc_unlocked(_fp) __getc_unlocked_body (_fp)
 #define _IO_peekc_unlocked(_fp) \
        (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
 	  && __underflow (_fp) == EOF ? EOF \
 	: *(unsigned char *) (_fp)->_IO_read_ptr)
-#define _IO_putc_unlocked(_ch, _fp) \
-   (_IO_BE ((_fp)->_IO_write_ptr >= (_fp)->_IO_write_end, 0) \
-    ? __overflow (_fp, (unsigned char) (_ch)) \
-    : (unsigned char) (*(_fp)->_IO_write_ptr++ = (_ch)))
+#define _IO_putc_unlocked(_ch, _fp) __putc_unlocked_body (_ch, _fp)
 
 #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
 # define _IO_getwc_unlocked(_fp) \
@@ -427,8 +275,8 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t);
    : (_IO_wint_t) (*(_fp)->_wide_data->_IO_write_ptr++ = (_wch)))
 #endif
 
-#define _IO_feof_unlocked(__fp) (((__fp)->_flags & _IO_EOF_SEEN) != 0)
-#define _IO_ferror_unlocked(__fp) (((__fp)->_flags & _IO_ERR_SEEN) != 0)
+#define _IO_feof_unlocked(_fp) __feof_unlocked_body (_fp)
+#define _IO_ferror_unlocked(_fp) __ferror_unlocked_body (_fp)
 
 extern int _IO_getc (_IO_FILE *__fp);
 extern int _IO_putc (int __c, _IO_FILE *__fp);
diff --git a/libio/bits/stdio.h b/libio/bits/stdio.h
index eb42b22153..4ab919031f 100644
--- a/libio/bits/stdio.h
+++ b/libio/bits/stdio.h
@@ -16,6 +16,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_STDIO_H
+#define _BITS_STDIO_H 1
+
 #ifndef _STDIO_H
 # error "Never include <bits/stdio.h> directly; use <stdio.h> instead."
 #endif
@@ -33,7 +36,7 @@
 # if !(__USE_FORTIFY_LEVEL > 0 && defined __fortify_function)
 /* Write formatted output to stdout from argument list ARG.  */
 __STDIO_INLINE int
-vprintf (const char *__restrict __fmt, _G_va_list __arg)
+vprintf (const char *__restrict __fmt, __gnuc_va_list __arg)
 {
   return vfprintf (stdout, __fmt, __arg);
 }
@@ -52,7 +55,7 @@ getchar (void)
 __STDIO_INLINE int
 fgetc_unlocked (FILE *__fp)
 {
-  return _IO_getc_unlocked (__fp);
+  return __getc_unlocked_body (__fp);
 }
 # endif /* misc */
 
@@ -62,14 +65,14 @@ fgetc_unlocked (FILE *__fp)
 __STDIO_INLINE int
 getc_unlocked (FILE *__fp)
 {
-  return _IO_getc_unlocked (__fp);
+  return __getc_unlocked_body (__fp);
 }
 
 /* This is defined in POSIX.1:1996.  */
 __STDIO_INLINE int
 getchar_unlocked (void)
 {
-  return _IO_getc_unlocked (stdin);
+  return __getc_unlocked_body (stdin);
 }
 # endif	/* POSIX */
 
@@ -87,7 +90,7 @@ putchar (int __c)
 __STDIO_INLINE int
 fputc_unlocked (int __c, FILE *__stream)
 {
-  return _IO_putc_unlocked (__c, __stream);
+  return __putc_unlocked_body (__c, __stream);
 }
 # endif /* misc */
 
@@ -97,21 +100,21 @@ fputc_unlocked (int __c, FILE *__stream)
 __STDIO_INLINE int
 putc_unlocked (int __c, FILE *__stream)
 {
-  return _IO_putc_unlocked (__c, __stream);
+  return __putc_unlocked_body (__c, __stream);
 }
 
 /* This is defined in POSIX.1:1996.  */
 __STDIO_INLINE int
 putchar_unlocked (int __c)
 {
-  return _IO_putc_unlocked (__c, stdout);
+  return __putc_unlocked_body (__c, stdout);
 }
 # endif	/* POSIX */
 
 
 # ifdef	__USE_GNU
 /* Like `getdelim', but reads up to a newline.  */
-__STDIO_INLINE _IO_ssize_t
+__STDIO_INLINE __ssize_t
 getline (char **__lineptr, size_t *__n, FILE *__stream)
 {
   return __getdelim (__lineptr, __n, '\n', __stream);
@@ -124,14 +127,14 @@ getline (char **__lineptr, size_t *__n, FILE *__stream)
 __STDIO_INLINE int
 __NTH (feof_unlocked (FILE *__stream))
 {
-  return _IO_feof_unlocked (__stream);
+  return __feof_unlocked_body (__stream);
 }
 
 /* Faster versions when locking is not required.  */
 __STDIO_INLINE int
 __NTH (ferror_unlocked (FILE *__stream))
 {
-  return _IO_ferror_unlocked (__stream);
+  return __ferror_unlocked_body (__stream);
 }
 # endif /* misc */
 
@@ -151,7 +154,7 @@ __NTH (ferror_unlocked (FILE *__stream))
 		       for (__cnt = (size_t) (size) * (size_t) (n);	      \
 			    __cnt > 0; --__cnt)				      \
 			 {						      \
-			   int __c = _IO_getc_unlocked (__stream);	      \
+			   int __c = getc_unlocked (__stream);		      \
 			   if (__c == EOF)				      \
 			     break;					      \
 			   *__ptr++ = __c;				      \
@@ -174,7 +177,7 @@ __NTH (ferror_unlocked (FILE *__stream))
 		       size_t __cnt;					      \
 		       for (__cnt = (size_t) (size) * (size_t) (n);	      \
 			    __cnt > 0; --__cnt)				      \
-			 if (_IO_putc_unlocked (*__ptr++, __stream) == EOF)   \
+			 if (putc_unlocked (*__ptr++, __stream) == EOF)	      \
 			   break;					      \
 		       ((size_t) (size) * (size_t) (n) - __cnt)		      \
 			/ (size_t) (size); })				      \
@@ -188,3 +191,5 @@ __NTH (ferror_unlocked (FILE *__stream))
 
 /* Define helper macro.  */
 #undef __STDIO_INLINE
+
+#endif /* bits/stdio.h.  */
diff --git a/libio/bits/stdio2.h b/libio/bits/stdio2.h
index 55302e91d0..11651506a6 100644
--- a/libio/bits/stdio2.h
+++ b/libio/bits/stdio2.h
@@ -16,6 +16,9 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _BITS_STDIO2_H
+#define _BITS_STDIO2_H 1
+
 #ifndef _STDIO_H
 # error "Never include <bits/stdio2.h> directly; use <stdio.h> instead."
 #endif
@@ -24,7 +27,7 @@ extern int __sprintf_chk (char *__restrict __s, int __flag, size_t __slen,
 			  const char *__restrict __format, ...) __THROW;
 extern int __vsprintf_chk (char *__restrict __s, int __flag, size_t __slen,
 			   const char *__restrict __format,
-			   _G_va_list __ap) __THROW;
+			   __gnuc_va_list __ap) __THROW;
 
 #ifdef __va_arg_pack
 __fortify_function int
@@ -41,7 +44,7 @@ __NTH (sprintf (char *__restrict __s, const char *__restrict __fmt, ...))
 
 __fortify_function int
 __NTH (vsprintf (char *__restrict __s, const char *__restrict __fmt,
-		 _G_va_list __ap))
+		 __gnuc_va_list __ap))
 {
   return __builtin___vsprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
 				   __bos (__s), __fmt, __ap);
@@ -54,7 +57,7 @@ extern int __snprintf_chk (char *__restrict __s, size_t __n, int __flag,
 			   ...) __THROW;
 extern int __vsnprintf_chk (char *__restrict __s, size_t __n, int __flag,
 			    size_t __slen, const char *__restrict __format,
-			    _G_va_list __ap) __THROW;
+			    __gnuc_va_list __ap) __THROW;
 
 # ifdef __va_arg_pack
 __fortify_function int
@@ -72,7 +75,7 @@ __NTH (snprintf (char *__restrict __s, size_t __n,
 
 __fortify_function int
 __NTH (vsnprintf (char *__restrict __s, size_t __n,
-		  const char *__restrict __fmt, _G_va_list __ap))
+		  const char *__restrict __fmt, __gnuc_va_list __ap))
 {
   return __builtin___vsnprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
 				    __bos (__s), __fmt, __ap);
@@ -86,9 +89,9 @@ extern int __fprintf_chk (FILE *__restrict __stream, int __flag,
 			  const char *__restrict __format, ...);
 extern int __printf_chk (int __flag, const char *__restrict __format, ...);
 extern int __vfprintf_chk (FILE *__restrict __stream, int __flag,
-			   const char *__restrict __format, _G_va_list __ap);
+			   const char *__restrict __format, __gnuc_va_list __ap);
 extern int __vprintf_chk (int __flag, const char *__restrict __format,
-			  _G_va_list __ap);
+			  __gnuc_va_list __ap);
 
 # ifdef __va_arg_pack
 __fortify_function int
@@ -111,7 +114,7 @@ printf (const char *__restrict __fmt, ...)
 # endif
 
 __fortify_function int
-vprintf (const char *__restrict __fmt, _G_va_list __ap)
+vprintf (const char *__restrict __fmt, __gnuc_va_list __ap)
 {
 #ifdef __USE_EXTERN_INLINES
   return __vfprintf_chk (stdout, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
@@ -122,7 +125,7 @@ vprintf (const char *__restrict __fmt, _G_va_list __ap)
 
 __fortify_function int
 vfprintf (FILE *__restrict __stream,
-	  const char *__restrict __fmt, _G_va_list __ap)
+	  const char *__restrict __fmt, __gnuc_va_list __ap)
 {
   return __vfprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
 }
@@ -131,7 +134,7 @@ vfprintf (FILE *__restrict __stream,
 extern int __dprintf_chk (int __fd, int __flag, const char *__restrict __fmt,
 			  ...) __attribute__ ((__format__ (__printf__, 3, 4)));
 extern int __vdprintf_chk (int __fd, int __flag,
-			   const char *__restrict __fmt, _G_va_list __arg)
+			   const char *__restrict __fmt, __gnuc_va_list __arg)
      __attribute__ ((__format__ (__printf__, 3, 0)));
 
 #  ifdef __va_arg_pack
@@ -147,7 +150,7 @@ dprintf (int __fd, const char *__restrict __fmt, ...)
 #  endif
 
 __fortify_function int
-vdprintf (int __fd, const char *__restrict __fmt, _G_va_list __ap)
+vdprintf (int __fd, const char *__restrict __fmt, __gnuc_va_list __ap)
 {
   return __vdprintf_chk (__fd, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
 }
@@ -159,7 +162,7 @@ extern int __asprintf_chk (char **__restrict __ptr, int __flag,
 			   const char *__restrict __fmt, ...)
      __THROW __attribute__ ((__format__ (__printf__, 3, 4))) __wur;
 extern int __vasprintf_chk (char **__restrict __ptr, int __flag,
-			    const char *__restrict __fmt, _G_va_list __arg)
+			    const char *__restrict __fmt, __gnuc_va_list __arg)
      __THROW __attribute__ ((__format__ (__printf__, 3, 0))) __wur;
 extern int __obstack_printf_chk (struct obstack *__restrict __obstack,
 				 int __flag, const char *__restrict __format,
@@ -168,7 +171,7 @@ extern int __obstack_printf_chk (struct obstack *__restrict __obstack,
 extern int __obstack_vprintf_chk (struct obstack *__restrict __obstack,
 				  int __flag,
 				  const char *__restrict __format,
-				  _G_va_list __args)
+				  __gnuc_va_list __args)
      __THROW __attribute__ ((__format__ (__printf__, 3, 0)));
 
 #  ifdef __va_arg_pack
@@ -205,14 +208,14 @@ __NTH (obstack_printf (struct obstack *__restrict __obstack,
 
 __fortify_function int
 __NTH (vasprintf (char **__restrict __ptr, const char *__restrict __fmt,
-		  _G_va_list __ap))
+		  __gnuc_va_list __ap))
 {
   return __vasprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
 }
 
 __fortify_function int
 __NTH (obstack_vprintf (struct obstack *__restrict __obstack,
-			const char *__restrict __fmt, _G_va_list __ap))
+			const char *__restrict __fmt, __gnuc_va_list __ap))
 {
   return __obstack_vprintf_chk (__obstack, __USE_FORTIFY_LEVEL - 1, __fmt,
 				__ap);
@@ -368,7 +371,7 @@ fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n,
 
       for (; __cnt > 0; --__cnt)
 	{
-	  int __c = _IO_getc_unlocked (__stream);
+	  int __c = getc_unlocked (__stream);
 	  if (__c == EOF)
 	    break;
 	  *__cptr++ = __c;
@@ -379,3 +382,5 @@ fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n,
   return __fread_unlocked_alias (__ptr, __size, __n, __stream);
 }
 #endif
+
+#endif /* bits/stdio2.h.  */
diff --git a/libio/bits/types/__fpos64_t.h b/libio/bits/types/__fpos64_t.h
new file mode 100644
index 0000000000..06a6891154
--- /dev/null
+++ b/libio/bits/types/__fpos64_t.h
@@ -0,0 +1,16 @@
+#ifndef _____fpos64_t_defined
+#define _____fpos64_t_defined 1
+
+#include <bits/types.h>
+#include <bits/types/__mbstate_t.h>
+
+/* The tag name of this struct is _G_fpos64_t to preserve historic
+   C++ mangled names for functions taking fpos_t and/or fpos64_t
+   arguments.  That name should not be used in new code.  */
+typedef struct _G_fpos64_t
+{
+  __off64_t __pos;
+  __mbstate_t __state;
+} __fpos64_t;
+
+#endif
diff --git a/libio/bits/types/__fpos_t.h b/libio/bits/types/__fpos_t.h
new file mode 100644
index 0000000000..bb04576651
--- /dev/null
+++ b/libio/bits/types/__fpos_t.h
@@ -0,0 +1,16 @@
+#ifndef _____fpos_t_defined
+#define _____fpos_t_defined 1
+
+#include <bits/types.h>
+#include <bits/types/__mbstate_t.h>
+
+/* The tag name of this struct is _G_fpos_t to preserve historic
+   C++ mangled names for functions taking fpos_t arguments.
+   That name should not be used in new code.  */
+typedef struct _G_fpos_t
+{
+  __off_t __pos;
+  __mbstate_t __state;
+} __fpos_t;
+
+#endif
diff --git a/libio/bits/types/cookie_io_functions_t.h b/libio/bits/types/cookie_io_functions_t.h
new file mode 100644
index 0000000000..a6d9d39a47
--- /dev/null
+++ b/libio/bits/types/cookie_io_functions_t.h
@@ -0,0 +1,63 @@
+/* Copyright (C) 1991-2018 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 __cookie_io_functions_t_defined
+#define __cookie_io_functions_t_defined 1
+
+#include <bits/types.h>
+
+/* Functions to do I/O and file management for a stream.  */
+
+/* Read NBYTES bytes from COOKIE into a buffer pointed to by BUF.
+   Return number of bytes read.  */
+typedef __ssize_t cookie_read_function_t (void *__cookie, char *__buf,
+                                          size_t __nbytes);
+
+/* Write NBYTES bytes pointed to by BUF to COOKIE.  Write all NBYTES bytes
+   unless there is an error.  Return number of bytes written.  If
+   there is an error, return 0 and do not write anything.  If the file
+   has been opened for append (__mode.__append set), then set the file
+   pointer to the end of the file and then do the write; if not, just
+   write at the current file pointer.  */
+typedef __ssize_t cookie_write_function_t (void *__cookie, const char *__buf,
+                                           size_t __nbytes);
+
+/* Move COOKIE's file position to *POS bytes from the
+   beginning of the file (if W is SEEK_SET),
+   the current position (if W is SEEK_CUR),
+   or the end of the file (if W is SEEK_END).
+   Set *POS to the new file position.
+   Returns zero if successful, nonzero if not.  */
+typedef int cookie_seek_function_t (void *__cookie, __off64_t *__pos, int __w);
+
+/* Close COOKIE.  */
+typedef int cookie_close_function_t (void *__cookie);
+
+/* The structure with the cookie function pointers.
+   The tag name of this struct is _IO_cookie_io_functions_t to
+   preserve historic C++ mangled names for functions taking
+   cookie_io_functions_t arguments.  That name should not be used in
+   new code.  */
+typedef struct _IO_cookie_io_functions_t
+{
+  cookie_read_function_t *read;		/* Read bytes.  */
+  cookie_write_function_t *write;	/* Write bytes.  */
+  cookie_seek_function_t *seek;		/* Seek/tell file position.  */
+  cookie_close_function_t *close;	/* Close file.  */
+} cookie_io_functions_t;
+
+#endif
diff --git a/libio/bits/types/struct_FILE.h b/libio/bits/types/struct_FILE.h
new file mode 100644
index 0000000000..a120c76268
--- /dev/null
+++ b/libio/bits/types/struct_FILE.h
@@ -0,0 +1,120 @@
+/* Copyright (C) 1991-2018 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 __struct_FILE_defined
+#define __struct_FILE_defined 1
+
+/* Caution: The contents of this file are not part of the official
+   stdio.h API.  However, much of it is part of the official *binary*
+   interface, and therefore cannot be changed.  */
+
+#if defined _IO_USE_OLD_IO_FILE && !defined _LIBC
+# error "_IO_USE_OLD_IO_FILE should only be defined when building libc itself"
+#endif
+
+#if defined _IO_lock_t_defined && !defined _LIBC
+# error "_IO_lock_t_defined should only be defined when building libc itself"
+#endif
+
+#include <bits/types.h>
+
+struct _IO_FILE;
+struct _IO_marker;
+struct _IO_codecvt;
+struct _IO_wide_data;
+
+/* During the build of glibc itself, _IO_lock_t will already have been
+   defined by internal headers.  */
+#ifndef _IO_lock_t_defined
+typedef void _IO_lock_t;
+#endif
+
+/* The tag name of this struct is _IO_FILE to preserve historic
+   C++ mangled names for functions taking FILE* arguments.
+   That name should not be used in new code.  */
+struct _IO_FILE
+{
+  int _flags;		/* High-order word is _IO_MAGIC; rest is flags. */
+
+  /* The following pointers correspond to the C++ streambuf protocol. */
+  char *_IO_read_ptr;	/* Current read pointer */
+  char *_IO_read_end;	/* End of get area. */
+  char *_IO_read_base;	/* Start of putback+get area. */
+  char *_IO_write_base;	/* Start of put area. */
+  char *_IO_write_ptr;	/* Current put pointer. */
+  char *_IO_write_end;	/* End of put area. */
+  char *_IO_buf_base;	/* Start of reserve area. */
+  char *_IO_buf_end;	/* End of reserve area. */
+
+  /* The following fields are used to support backing up and undo. */
+  char *_IO_save_base; /* Pointer to start of non-current get area. */
+  char *_IO_backup_base;  /* Pointer to first valid character of backup area */
+  char *_IO_save_end; /* Pointer to end of non-current get area. */
+
+  struct _IO_marker *_markers;
+
+  struct _IO_FILE *_chain;
+
+  int _fileno;
+  int _flags2;
+  __off_t _old_offset; /* This used to be _offset but it's too small.  */
+
+  /* 1+column number of pbase(); 0 is unknown. */
+  unsigned short _cur_column;
+  signed char _vtable_offset;
+  char _shortbuf[1];
+
+  _IO_lock_t *_lock;
+#ifdef _IO_USE_OLD_IO_FILE
+};
+
+struct _IO_FILE_complete
+{
+  struct _IO_FILE _file;
+#endif
+  __off64_t _offset;
+  /* Wide character stream stuff.  */
+  struct _IO_codecvt *_codecvt;
+  struct _IO_wide_data *_wide_data;
+  struct _IO_FILE *_freeres_list;
+  void *_freeres_buf;
+  size_t __pad5;
+  int _mode;
+  /* Make sure we don't get into trouble again.  */
+  char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];
+};
+
+/* These macros are used by bits/stdio.h and internal headers.  */
+#define __getc_unlocked_body(_fp)					\
+  (__glibc_unlikely ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end)	\
+   ? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)
+
+#define __putc_unlocked_body(_ch, _fp)					\
+  (__glibc_unlikely ((_fp)->_IO_write_ptr >= (_fp)->_IO_write_end)	\
+   ? __overflow (_fp, (unsigned char) (_ch))				\
+   : (unsigned char) (*(_fp)->_IO_write_ptr++ = (_ch)))
+
+#define _IO_EOF_SEEN 0x10
+#define __feof_unlocked_body(_fp) (((_fp)->_flags & _IO_EOF_SEEN) != 0)
+
+#define _IO_ERR_SEEN 0x20
+#define __ferror_unlocked_body(_fp) (((_fp)->_flags & _IO_ERR_SEEN) != 0)
+
+#define _IO_USER_LOCK 0x8000
+/* Many more flag bits are defined internally.  */
+
+#endif
diff --git a/libio/iolibio.h b/libio/iolibio.h
index 621b31cff1..7814b1d4e5 100644
--- a/libio/iolibio.h
+++ b/libio/iolibio.h
@@ -1,4 +1,8 @@
+#ifndef _IOLIBIO_H
+#define _IOLIBIO_H 1
+
 #include <stdio.h>
+#include <bits/libio.h>
 
 /* These emulate stdio functionality, but with a different name
    (_IO_ungetc instead of ungetc), and using _IO_FILE instead of FILE. */
@@ -94,3 +98,5 @@ _IO_FILE *__old_freopen (const char *, const char *, _IO_FILE *) __THROW;
 #ifdef __cplusplus
 }
 #endif
+
+#endif /* iolibio.h.  */
diff --git a/libio/libio.h b/libio/libio.h
deleted file mode 100644
index 47a25083ce..0000000000
--- a/libio/libio.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright (C) 2017-2018 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 _LIBIO_H
-#define _LIBIO_H 1
-
-#warning "<libio.h> is deprecated; use <stdio.h> instead."
-
-#include <bits/libio.h>
-
-#endif
diff --git a/libio/libioP.h b/libio/libioP.h
index 068ceb2615..ac66f95f8d 100644
--- a/libio/libioP.h
+++ b/libio/libioP.h
@@ -32,6 +32,9 @@
 
    FIXME: All of the C++ cruft eventually needs to go away.  */
 
+#ifndef _LIBIOP_H
+#define _LIBIOP_H 1
+
 #include <stddef.h>
 
 #include <errno.h>
@@ -39,6 +42,8 @@
 
 #include <math_ldbl_opt.h>
 
+#include <stdio.h>
+#include <bits/libio.h>
 #include "iolibio.h"
 
 #ifdef __cplusplus
@@ -876,3 +881,5 @@ IO_validate_vtable (const struct _IO_jump_t *vtable)
     _IO_vtable_check ();
   return vtable;
 }
+
+#endif /* libioP.h.  */
diff --git a/libio/stdio.h b/libio/stdio.h
index 33de3813bb..731f8e56f4 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -32,18 +32,24 @@ __BEGIN_DECLS
 #define __need_NULL
 #include <stddef.h>
 
+#define __need___va_list
+#include <stdarg.h>
+
 #include <bits/types.h>
+#include <bits/types/__fpos_t.h>
+#include <bits/types/__fpos64_t.h>
 #include <bits/types/__FILE.h>
 #include <bits/types/FILE.h>
+#include <bits/types/struct_FILE.h>
 
-#define _STDIO_USES_IOSTREAM
-
-#include <bits/libio.h>
+#ifdef __USE_GNU
+# include <bits/types/cookie_io_functions_t.h>
+#endif
 
 #if defined __USE_XOPEN || defined __USE_XOPEN2K8
 # ifdef __GNUC__
 #  ifndef _VA_LIST_DEFINED
-typedef _G_va_list va_list;
+typedef __gnuc_va_list va_list;
 #   define _VA_LIST_DEFINED
 #  endif
 # else
@@ -75,12 +81,12 @@ typedef __ssize_t ssize_t;
 
 /* The type of the second argument to `fgetpos' and `fsetpos'.  */
 #ifndef __USE_FILE_OFFSET64
-typedef _G_fpos_t fpos_t;
+typedef __fpos_t fpos_t;
 #else
-typedef _G_fpos64_t fpos_t;
+typedef __fpos64_t fpos_t;
 #endif
 #ifdef __USE_LARGEFILE64
-typedef _G_fpos64_t fpos64_t;
+typedef __fpos64_t fpos64_t;
 #endif
 
 /* The possibilities for the third argument to `setvbuf'.  */
@@ -90,16 +96,12 @@ typedef _G_fpos64_t fpos64_t;
 
 
 /* Default buffer size.  */
-#ifndef BUFSIZ
-# define BUFSIZ _IO_BUFSIZ
-#endif
+#define BUFSIZ 8192
 
 
-/* End of file character.
-   Some things throughout the library rely on this being -1.  */
-#ifndef EOF
-# define EOF (-1)
-#endif
+/* The value returned by fgetc and similar functions to indicate the
+   end of the file.  */
+#define EOF (-1)
 
 
 /* The possibilities for the third argument to `fseek'.
@@ -132,9 +134,9 @@ typedef _G_fpos64_t fpos64_t;
 
 
 /* Standard streams.  */
-extern struct _IO_FILE *stdin;		/* Standard input stream.  */
-extern struct _IO_FILE *stdout;		/* Standard output stream.  */
-extern struct _IO_FILE *stderr;		/* Standard error output stream.  */
+extern FILE *stdin;		/* Standard input stream.  */
+extern FILE *stdout;		/* Standard output stream.  */
+extern FILE *stderr;		/* Standard error output stream.  */
 /* C89/C99 say they're macros.  Make them happy.  */
 #define stdin stdin
 #define stdout stdout
@@ -270,7 +272,7 @@ extern FILE *fdopen (int __fd, const char *__modes) __THROW __wur;
    and uses the given functions for input and output.  */
 extern FILE *fopencookie (void *__restrict __magic_cookie,
 			  const char *__restrict __modes,
-			  _IO_cookie_io_functions_t __io_funcs) __THROW __wur;
+			  cookie_io_functions_t __io_funcs) __THROW __wur;
 #endif
 
 #if defined __USE_XOPEN2K8 || __GLIBC_USE (LIB_EXT2)
@@ -325,15 +327,15 @@ extern int sprintf (char *__restrict __s,
    This function is a possible cancellation point and therefore not
    marked with __THROW.  */
 extern int vfprintf (FILE *__restrict __s, const char *__restrict __format,
-		     _G_va_list __arg);
+		     __gnuc_va_list __arg);
 /* Write formatted output to stdout from argument list ARG.
 
    This function is a possible cancellation point and therefore not
    marked with __THROW.  */
-extern int vprintf (const char *__restrict __format, _G_va_list __arg);
+extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg);
 /* Write formatted output to S from argument list ARG.  */
 extern int vsprintf (char *__restrict __s, const char *__restrict __format,
-		     _G_va_list __arg) __THROWNL;
+		     __gnuc_va_list __arg) __THROWNL;
 
 #if defined __USE_ISOC99 || defined __USE_UNIX98
 /* Maximum chars of output to write in MAXLEN.  */
@@ -342,7 +344,7 @@ extern int snprintf (char *__restrict __s, size_t __maxlen,
      __THROWNL __attribute__ ((__format__ (__printf__, 3, 4)));
 
 extern int vsnprintf (char *__restrict __s, size_t __maxlen,
-		      const char *__restrict __format, _G_va_list __arg)
+		      const char *__restrict __format, __gnuc_va_list __arg)
      __THROWNL __attribute__ ((__format__ (__printf__, 3, 0)));
 #endif
 
@@ -350,7 +352,7 @@ extern int vsnprintf (char *__restrict __s, size_t __maxlen,
 /* Write formatted output to a string dynamically allocated with `malloc'.
    Store the address of the string in *PTR.  */
 extern int vasprintf (char **__restrict __ptr, const char *__restrict __f,
-		      _G_va_list __arg)
+		      __gnuc_va_list __arg)
      __THROWNL __attribute__ ((__format__ (__printf__, 2, 0))) __wur;
 extern int __asprintf (char **__restrict __ptr,
 		       const char *__restrict __fmt, ...)
@@ -363,7 +365,7 @@ extern int asprintf (char **__restrict __ptr,
 #ifdef __USE_XOPEN2K8
 /* Write formatted output to a file descriptor.  */
 extern int vdprintf (int __fd, const char *__restrict __fmt,
-		     _G_va_list __arg)
+		     __gnuc_va_list __arg)
      __attribute__ ((__format__ (__printf__, 2, 0)));
 extern int dprintf (int __fd, const char *__restrict __fmt, ...)
      __attribute__ ((__format__ (__printf__, 2, 3)));
@@ -418,19 +420,19 @@ extern int __isoc99_sscanf (const char *__restrict __s,
    This function is a possible cancellation point and therefore not
    marked with __THROW.  */
 extern int vfscanf (FILE *__restrict __s, const char *__restrict __format,
-		    _G_va_list __arg)
+		    __gnuc_va_list __arg)
      __attribute__ ((__format__ (__scanf__, 2, 0))) __wur;
 
 /* Read formatted input from stdin into argument list ARG.
 
    This function is a possible cancellation point and therefore not
    marked with __THROW.  */
-extern int vscanf (const char *__restrict __format, _G_va_list __arg)
+extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg)
      __attribute__ ((__format__ (__scanf__, 1, 0))) __wur;
 
 /* Read formatted input from S into argument list ARG.  */
 extern int vsscanf (const char *__restrict __s,
-		    const char *__restrict __format, _G_va_list __arg)
+		    const char *__restrict __format, __gnuc_va_list __arg)
      __THROW __attribute__ ((__format__ (__scanf__, 2, 0)));
 
 # if !defined __USE_GNU \
@@ -442,26 +444,26 @@ extern int vsscanf (const char *__restrict __s,
    s, S or [.  */
 extern int __REDIRECT (vfscanf,
 		       (FILE *__restrict __s,
-			const char *__restrict __format, _G_va_list __arg),
+			const char *__restrict __format, __gnuc_va_list __arg),
 		       __isoc99_vfscanf)
      __attribute__ ((__format__ (__scanf__, 2, 0))) __wur;
 extern int __REDIRECT (vscanf, (const char *__restrict __format,
-				_G_va_list __arg), __isoc99_vscanf)
+				__gnuc_va_list __arg), __isoc99_vscanf)
      __attribute__ ((__format__ (__scanf__, 1, 0))) __wur;
 extern int __REDIRECT_NTH (vsscanf,
 			   (const char *__restrict __s,
 			    const char *__restrict __format,
-			    _G_va_list __arg), __isoc99_vsscanf)
+			    __gnuc_va_list __arg), __isoc99_vsscanf)
      __attribute__ ((__format__ (__scanf__, 2, 0)));
 #  else
 extern int __isoc99_vfscanf (FILE *__restrict __s,
 			     const char *__restrict __format,
-			     _G_va_list __arg) __wur;
+			     __gnuc_va_list __arg) __wur;
 extern int __isoc99_vscanf (const char *__restrict __format,
-			    _G_va_list __arg) __wur;
+			    __gnuc_va_list __arg) __wur;
 extern int __isoc99_vsscanf (const char *__restrict __s,
 			     const char *__restrict __format,
-			     _G_va_list __arg) __THROW;
+			     __gnuc_va_list __arg) __THROW;
 #   define vfscanf __isoc99_vfscanf
 #   define vscanf __isoc99_vscanf
 #   define vsscanf __isoc99_vsscanf
@@ -592,12 +594,12 @@ extern char *fgets_unlocked (char *__restrict __s, int __n,
    cancellation point.  But due to similarity with an POSIX interface
    or due to the implementation they are cancellation points and
    therefore not marked with __THROW.  */
-extern _IO_ssize_t __getdelim (char **__restrict __lineptr,
-			       size_t *__restrict __n, int __delimiter,
-			       FILE *__restrict __stream) __wur;
-extern _IO_ssize_t getdelim (char **__restrict __lineptr,
-			     size_t *__restrict __n, int __delimiter,
-			     FILE *__restrict __stream) __wur;
+extern __ssize_t __getdelim (char **__restrict __lineptr,
+                             size_t *__restrict __n, int __delimiter,
+                             FILE *__restrict __stream) __wur;
+extern __ssize_t getdelim (char **__restrict __lineptr,
+                           size_t *__restrict __n, int __delimiter,
+                           FILE *__restrict __stream) __wur;
 
 /* Like `getdelim', but reads up to a newline.
 
@@ -605,9 +607,9 @@ extern _IO_ssize_t getdelim (char **__restrict __lineptr,
    cancellation point.  But due to similarity with an POSIX interface
    or due to the implementation it is a cancellation point and
    therefore not marked with __THROW.  */
-extern _IO_ssize_t getline (char **__restrict __lineptr,
-			    size_t *__restrict __n,
-			    FILE *__restrict __stream) __wur;
+extern __ssize_t getline (char **__restrict __lineptr,
+                          size_t *__restrict __n,
+                          FILE *__restrict __stream) __wur;
 #endif
 
 
@@ -820,7 +822,7 @@ extern int obstack_printf (struct obstack *__restrict __obstack,
      __THROWNL __attribute__ ((__format__ (__printf__, 2, 3)));
 extern int obstack_vprintf (struct obstack *__restrict __obstack,
 			    const char *__restrict __format,
-			    _G_va_list __args)
+			    __gnuc_va_list __args)
      __THROWNL __attribute__ ((__format__ (__printf__, 2, 0)));
 #endif /* Use GNU.  */
 
@@ -845,6 +847,11 @@ extern void funlockfile (FILE *__stream) __THROW;
 # include <bits/getopt_posix.h>
 #endif
 
+/* Slow-path routines used by the optimized inline functions in
+   bits/stdio.h.  */
+extern int __uflow (FILE *);
+extern int __overflow (FILE *, int);
+
 /* If we are compiling with optimizing read this file.  It contains
    several optimizing inline functions and macros.  */
 #ifdef __USE_EXTERN_INLINES
diff --git a/scripts/check-installed-headers.sh b/scripts/check-installed-headers.sh
index 3384e1c3e7..7ffd2b8e74 100644
--- a/scripts/check-installed-headers.sh
+++ b/scripts/check-installed-headers.sh
@@ -84,11 +84,6 @@ for header in "$@"; do
         (sys/elf.h)
             continue;;
 
-        # libio.h and _G_config.h are deprecation stubs containing #warnings
-        # to use stdio.h instead.
-        (libio.h | _G_config.h)
-            continue;;
-
 	# sys/sysctl.h is unsupported for x32.
 	(sys/sysctl.h)
             case "$is_x32" in
diff --git a/sysdeps/unix/sysv/linux/bits/_G_config.h b/sysdeps/unix/sysv/linux/bits/_G_config.h
index 9994869098..05a64acb2c 100644
--- a/sysdeps/unix/sysv/linux/bits/_G_config.h
+++ b/sysdeps/unix/sysv/linux/bits/_G_config.h
@@ -4,10 +4,6 @@
 #ifndef _BITS_G_CONFIG_H
 #define _BITS_G_CONFIG_H 1
 
-#if !defined _BITS_LIBIO_H && !defined _G_CONFIG_H
-# error "Never include <bits/_G_config.h> directly; use <stdio.h> instead."
-#endif
-
 /* Define types for libio in terms of the standard internal type names.  */
 
 #include <bits/types.h>
@@ -19,20 +15,16 @@
 #include <stddef.h>
 
 #include <bits/types/__mbstate_t.h>
+#include <bits/types/__fpos_t.h>
+#include <bits/types/__fpos64_t.h>
+
+#define _G_fpos_t __fpos_t
+#define _G_fpos64_t __fpos64_t
+
 #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
 # include <bits/types/wint_t.h>
 #endif
 
-typedef struct
-{
-  __off_t __pos;
-  __mbstate_t __state;
-} _G_fpos_t;
-typedef struct
-{
-  __off64_t __pos;
-  __mbstate_t __state;
-} _G_fpos64_t;
 #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
 # include <gconv.h>
 typedef union