unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2 0/5] Don't install libio.h or _G_config.h.
@ 2018-02-05 23:34 Zack Weinberg
  2018-02-05 23:34 ` [PATCH v2 1/5] Pre-cleanup: Remove unnecessary redefinitions of std symbols Zack Weinberg
                   ` (4 more replies)
  0 siblings, 5 replies; 21+ messages in thread
From: Zack Weinberg @ 2018-02-05 23:34 UTC (permalink / raw
  To: libc-alpha; +Cc: fweimer, joseph

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.

This patch series consists of one pre-cleanup, two changes with
user-visible effects, and two post-cleanups.  The pre-cleanup and the
first user-visible change affect the contents of installed shipped
libraries, in ways described clearly in those patches' commit
messages; the latter three patches leave installed stripped libraries
on x86_64-linux-gnu unchanged.

The post-cleanups are not very ambitious.  We can't go very far with
libio cleanups as long as we still have _IO_MTSAFE_IO, and I am not
tackling that in this patch series, but we can at least make the maze
of stdio-related headers a little less complicated.  I'm not going to
have time to work on this anymore in the near future.  If anyone else
feels like following up, but not tackling _IO_MTSAFE_IO, a good next
step would be to remove _IO_ symbols that are not used at all anymore,
or whose uses can trivially be replaced with public or __ symbols.

All patches have been individually test-compiled on x86_64-linux-gnu
and test-installed.  The complete test suite has been run for the
patchset as a whole.  In addition, for the patchset as a whole, I
verified that a simple program that uses stdio.h could be compiled and
run against the installation tree.

zw

Zack Weinberg (5):
  Pre-cleanup: Remove unnecessary redefinitions of std symbols.
  Remove getc and putc macros from the public stdio.h.
  Don't install libio.h or _G_config.h.
  Post-cleanup 1: move libio.h back out of bits/.
  Post-cleanup 2: minimize _G_config.h.

 NEWS                                       |  11 +-
 bits/_G_config.h                           |  62 ----
 conform/data/stdio.h-data                  |   2 +-
 csu/init.c                                 |  13 +-
 include/bits/libio.h                       |  45 ---
 include/bits/types/__fpos64_t.h            |   1 +
 include/bits/types/__fpos_t.h              |   1 +
 include/bits/types/cookie_io_functions_t.h |   1 +
 include/bits/types/struct_FILE.h           |   1 +
 include/stdio.h                            |  33 +-
 libio/Makefile                             |   9 +-
 libio/_G_config.h                          |  25 --
 libio/bits/libio-ldbl.h                    |  29 --
 libio/bits/libio.h                         | 527 -----------------------------
 libio/bits/stdio.h                         |  33 +-
 libio/bits/stdio2.h                        |  35 +-
 libio/bits/types/__fpos64_t.h              |  16 +
 libio/bits/types/__fpos_t.h                |  16 +
 libio/bits/types/cookie_io_functions_t.h   |  46 +++
 libio/bits/types/struct_FILE.h             | 120 +++++++
 libio/filedoalloc.c                        |   2 +-
 libio/fileops.c                            |   2 +-
 libio/iofdopen.c                           |   4 +-
 libio/iofopen.c                            |   2 +-
 libio/iolibio.h                            |   6 +
 libio/libio.h                              | 404 +++++++++++++++++++++-
 libio/libioP.h                             |  27 +-
 libio/stdio.h                              | 103 +++---
 scripts/check-installed-headers.sh         |   5 -
 stdio-common/tstgetln.c                    |   2 -
 stdio-common/vfprintf.c                    |   7 +-
 sysdeps/generic/_G_config.h                |  15 +
 sysdeps/ieee754/ldbl-opt/nldbl-compat.h    |  13 +-
 sysdeps/unix/sysv/linux/_G_config.h        |  15 +
 sysdeps/unix/sysv/linux/bits/_G_config.h   |  63 ----
 35 files changed, 798 insertions(+), 898 deletions(-)
 delete mode 100644 bits/_G_config.h
 delete mode 100644 include/bits/libio.h
 create mode 100644 include/bits/types/__fpos64_t.h
 create mode 100644 include/bits/types/__fpos_t.h
 create mode 100644 include/bits/types/cookie_io_functions_t.h
 create mode 100644 include/bits/types/struct_FILE.h
 delete mode 100644 libio/_G_config.h
 delete mode 100644 libio/bits/libio-ldbl.h
 delete mode 100644 libio/bits/libio.h
 create mode 100644 libio/bits/types/__fpos64_t.h
 create mode 100644 libio/bits/types/__fpos_t.h
 create mode 100644 libio/bits/types/cookie_io_functions_t.h
 create mode 100644 libio/bits/types/struct_FILE.h
 create mode 100644 sysdeps/generic/_G_config.h
 create mode 100644 sysdeps/unix/sysv/linux/_G_config.h
 delete mode 100644 sysdeps/unix/sysv/linux/bits/_G_config.h

-- 
2.15.1



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

* [PATCH v2 1/5] Pre-cleanup: Remove unnecessary redefinitions of std symbols.
  2018-02-05 23:34 [PATCH v2 0/5] Don't install libio.h or _G_config.h Zack Weinberg
@ 2018-02-05 23:34 ` Zack Weinberg
  2018-02-05 23:50   ` Joseph Myers
  2018-02-05 23:34 ` [PATCH v2 2/5] Remove getc and putc macros from the public stdio.h Zack Weinberg
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 21+ messages in thread
From: Zack Weinberg @ 2018-02-05 23:34 UTC (permalink / raw
  To: libc-alpha; +Cc: fweimer, joseph

Two files in stdio-common were unnecessarily redefining some standard
symbols as their _IO_ aliases, which causes problems for a build with
the visibility of libio.h reduced.

This changes installed stripped libraries, because the line numbering
changes in vfprintf.c, which changes the messages associated with a
bunch of assertions.  However, if it weren't entangled with a scary
change I wouldn't be hesitating to call it an obvious cleanup.

	* stdio-common/vfprintf.c: Don't redefine FILE, va_list, or BUFSIZ.
        * stdio-common/tstgetln.c: Don't redefine ssize_t.
---
 stdio-common/tstgetln.c | 2 --
 stdio-common/vfprintf.c | 7 +------
 2 files changed, 1 insertion(+), 8 deletions(-)

diff --git a/stdio-common/tstgetln.c b/stdio-common/tstgetln.c
index a18f754e354..6960e686200 100644
--- a/stdio-common/tstgetln.c
+++ b/stdio-common/tstgetln.c
@@ -16,8 +16,6 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <stdio.h>
-#undef ssize_t
-#define ssize_t _IO_ssize_t
 
 int
 main (int argc, char *argv[])
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
index 3b87740dd99..a2cab306855 100644
--- a/stdio-common/vfprintf.c
+++ b/stdio-common/vfprintf.c
@@ -39,13 +39,8 @@
    Beside this it is also shared between the normal and wide character
    implementation as defined in ISO/IEC 9899:1990/Amendment 1:1995.  */
 
-
 #include <libioP.h>
-#define FILE		_IO_FILE
-#undef va_list
-#define va_list	_IO_va_list
-#undef BUFSIZ
-#define BUFSIZ		_IO_BUFSIZ
+
 /* In some cases we need extra space for all the output which is not
    counted in the width of the string. We assume 32 characters is
    enough.  */
-- 
2.15.1



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

* [PATCH v2 2/5] Remove getc and putc macros from the public stdio.h.
  2018-02-05 23:34 [PATCH v2 0/5] Don't install libio.h or _G_config.h Zack Weinberg
  2018-02-05 23:34 ` [PATCH v2 1/5] Pre-cleanup: Remove unnecessary redefinitions of std symbols Zack Weinberg
@ 2018-02-05 23:34 ` Zack Weinberg
  2018-02-06  0:01   ` Joseph Myers
  2018-02-05 23:34 ` [PATCH v2 3/5] Don't install libio.h or _G_config.h Zack Weinberg
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 21+ messages in thread
From: Zack Weinberg @ 2018-02-05 23:34 UTC (permalink / raw
  To: libc-alpha; +Cc: fweimer, joseph

The getc and putc macros in the public stdio.h expand to call _IO_getc
and _IO_putc respectively.  As _IO_getc, fgetc, and getc are all aliases
for the same function, and _IO_putc, fputc, and putc are also all aliases
for the same function, the macros are pointless.  The C standard does
not require getc and putc to be macros, so let's just not have macros.
All four symbols are exported from libc.so at the same, ancient symbol
version, so there should be no risks for binary compatibility.  Similarly,
the getchar and putchar inlines in bits/stdio.h forward to getc and putc
instead of their _IO_ aliases.

As a change from longstanding historical practice, this does seem
like it might break _something_, so there is a note in NEWS, which
is also a convenient place to advise people that if they thought getc
and putc had reduced per-character overhead they should consider using
getc_unlocked and putc_unlocked instead.  (These are also not macros,
but when optimizing, they are inlines.)

This patch changes installed stripped libraries, since several of the
ancillary libraries and programs use getc and/or putc, so they
formerly referenced _IO_getc / _IO_putc.

	* libio/stdio.h: Don't define getc or putc as macros.
	* libio/bits/stdio.h (getchar, putchar): Use getc and putc,
	not _IO_getc and _IO_putc.
---
 NEWS               | 7 +++++++
 libio/bits/stdio.h | 4 ++--
 libio/stdio.h      | 8 --------
 3 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/NEWS b/NEWS
index 3ac57eca4ee..eceab2b2be2 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,13 @@ Deprecated and removed features, and other changes affecting compatibility:
 
   [Add deprecations, removals and changes affecting compatibility here]
 
+ * 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
+   putc would provide performance improvements over fgetc and fputc, instead
+   investigate using (f)getc_unlocked and (f)putc_unlocked, and, if
+   necessary, flockfile and funlockfile.
+
 Changes to build and runtime requirements:
 
   [Add changes to build and runtime requirements here]
diff --git a/libio/bits/stdio.h b/libio/bits/stdio.h
index d287083de16..eb42b22153c 100644
--- a/libio/bits/stdio.h
+++ b/libio/bits/stdio.h
@@ -43,7 +43,7 @@ vprintf (const char *__restrict __fmt, _G_va_list __arg)
 __STDIO_INLINE int
 getchar (void)
 {
-  return _IO_getc (stdin);
+  return getc (stdin);
 }
 
 
@@ -78,7 +78,7 @@ getchar_unlocked (void)
 __STDIO_INLINE int
 putchar (int __c)
 {
-  return _IO_putc (__c, stdout);
+  return putc (__c, stdout);
 }
 
 
diff --git a/libio/stdio.h b/libio/stdio.h
index 95bc902a82c..33de3813bbd 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -483,10 +483,6 @@ extern int getc (FILE *__stream);
    marked with __THROW.  */
 extern int getchar (void);
 
-/* The C standard explicitly says this is a macro, so we always do the
-   optimization for it.  */
-#define getc(_fp) _IO_getc (_fp)
-
 #ifdef __USE_POSIX199506
 /* These are defined in POSIX.1:1996.
 
@@ -523,10 +519,6 @@ extern int putc (int __c, FILE *__stream);
    marked with __THROW.  */
 extern int putchar (int __c);
 
-/* The C standard explicitly says this can be a macro,
-   so we always do the optimization for it.  */
-#define putc(_ch, _fp) _IO_putc (_ch, _fp)
-
 #ifdef __USE_MISC
 /* Faster version when locking is not necessary.
 
-- 
2.15.1



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

* [PATCH v2 3/5] Don't install libio.h or _G_config.h.
  2018-02-05 23:34 [PATCH v2 0/5] Don't install libio.h or _G_config.h Zack Weinberg
  2018-02-05 23:34 ` [PATCH v2 1/5] Pre-cleanup: Remove unnecessary redefinitions of std symbols Zack Weinberg
  2018-02-05 23:34 ` [PATCH v2 2/5] Remove getc and putc macros from the public stdio.h Zack Weinberg
@ 2018-02-05 23:34 ` Zack Weinberg
  2018-02-06 13:50   ` Adhemerval Zanella
  2018-02-05 23:34 ` [PATCH v2 4/5] Post-cleanup 1: move libio.h back out of bits/ Zack Weinberg
  2018-02-05 23:35 ` [PATCH v2 5/5] Post-cleanup 2: minimize _G_config.h Zack Weinberg
  4 siblings, 1 reply; 21+ messages in thread
From: Zack Weinberg @ 2018-02-05 23:34 UTC (permalink / raw
  To: libc-alpha; +Cc: fweimer, joseph

In this patch, we stop installing libio.h and _G_config.h for public
use; necessarily, this means the public stdio.h stops including
libio.h.

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 are 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.

Installed stripped libraries are unchanged by this patch.

	* 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.
---
 NEWS                                       |   4 +-
 bits/_G_config.h                           |  20 +--
 conform/data/stdio.h-data                  |   2 +-
 include/bits/types/__fpos64_t.h            |   1 +
 include/bits/types/__fpos_t.h              |   1 +
 include/bits/types/cookie_io_functions_t.h |   1 +
 include/bits/types/struct_FILE.h           |   1 +
 include/stdio.h                            |   5 +
 libio/Makefile                             |   9 +-
 libio/_G_config.h                          |  25 ----
 libio/bits/libio.h                         | 194 ++++-------------------------
 libio/bits/stdio.h                         |  29 +++--
 libio/bits/stdio2.h                        |  35 +++---
 libio/bits/types/__fpos64_t.h              |  16 +++
 libio/bits/types/__fpos_t.h                |  16 +++
 libio/bits/types/cookie_io_functions_t.h   |  46 +++++++
 libio/bits/types/struct_FILE.h             | 120 ++++++++++++++++++
 libio/iolibio.h                            |   6 +
 libio/libio.h                              |  25 ----
 libio/libioP.h                             |   7 ++
 libio/stdio.h                              |  95 +++++++-------
 scripts/check-installed-headers.sh         |   5 -
 sysdeps/unix/sysv/linux/bits/_G_config.h   |  20 +--
 23 files changed, 350 insertions(+), 333 deletions(-)
 create mode 100644 include/bits/types/__fpos64_t.h
 create mode 100644 include/bits/types/__fpos_t.h
 create mode 100644 include/bits/types/cookie_io_functions_t.h
 create mode 100644 include/bits/types/struct_FILE.h
 delete mode 100644 libio/_G_config.h
 create mode 100644 libio/bits/types/__fpos64_t.h
 create mode 100644 libio/bits/types/__fpos_t.h
 create mode 100644 libio/bits/types/cookie_io_functions_t.h
 create mode 100644 libio/bits/types/struct_FILE.h
 delete mode 100644 libio/libio.h

diff --git a/NEWS b/NEWS
index eceab2b2be2..87a3f1d1cd8 100644
--- a/NEWS
+++ b/NEWS
@@ -13,7 +13,9 @@ Major new features:
 
 Deprecated and removed features, and other changes affecting compatibility:
 
-  [Add deprecations, removals and changes affecting compatibility here]
+ * 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
diff --git a/bits/_G_config.h b/bits/_G_config.h
index 2b60d29f5ff..8c81bc42787 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 f69802cc703..3ef24606610 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 00000000000..68cc4e8b66c
--- /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 00000000000..2dcdc98d750
--- /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 00000000000..87f7930c6ec
--- /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 00000000000..971407292be
--- /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 f1e987ae5e3..3b6da17d82f 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 918a86bb743..3e08ed0eeb0 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 68de2fcaa0d..00000000000
--- 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 fae5b932a1f..cefc2c855b9 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 eb42b22153c..4ab919031f7 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 55302e91d0d..11651506a67 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 00000000000..06a6891154f
--- /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 00000000000..bb04576651b
--- /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 00000000000..cd4c0e19f4c
--- /dev/null
+++ b/libio/bits/types/cookie_io_functions_t.h
@@ -0,0 +1,46 @@
+#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 00000000000..a120c762685
--- /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 621b31cff1f..7814b1d4e56 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 47a25083ce3..00000000000
--- 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 068ceb2615a..ac66f95f8d4 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 33de3813bbd..731f8e56f4c 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 3384e1c3e76..7ffd2b8e749 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 9994869098b..05a64acb2cf 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
-- 
2.15.1



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

* [PATCH v2 4/5] Post-cleanup 1: move libio.h back out of bits/.
  2018-02-05 23:34 [PATCH v2 0/5] Don't install libio.h or _G_config.h Zack Weinberg
                   ` (2 preceding siblings ...)
  2018-02-05 23:34 ` [PATCH v2 3/5] Don't install libio.h or _G_config.h Zack Weinberg
@ 2018-02-05 23:34 ` Zack Weinberg
  2018-02-06 16:57   ` Adhemerval Zanella
  2018-02-05 23:35 ` [PATCH v2 5/5] Post-cleanup 2: minimize _G_config.h Zack Weinberg
  4 siblings, 1 reply; 21+ messages in thread
From: Zack Weinberg @ 2018-02-05 23:34 UTC (permalink / raw
  To: libc-alpha; +Cc: fweimer, joseph

In this patch, libio.h moves back out of bits/ into the top level of
the libio subdirectory, and is merged with libio/bits/libio-ldbl.h
(which also used to be installed) and include/libio.h.  Since almost
no files include libio.h directly, this is quite straightforward.

libio.h is now always used with _LIBC defined, so all of the _LIBC ||
_GLIBCPP_USE_WCHAR_T conditionals are unnecessary.  Similarly, the
ifdef nest surrounding the definition of _IO_fwide_maybe_incompatible
can collapse down to a single SHLIB_COMPAT check.  I also took the
opportunity to add some checks for configuration botches to libio.h.

Installed stripped libraries are unchanged by this patch.

The distinction between libio.h and libioP.h should be preserved as
long as include/stdio.h needs to include libio.h, and that's entangled
with _IO_MTSAFE_IO.  It might be feasible to merge iolibio.h into
libioP.h at this point, but I'm not sure whether it's worth the trouble.

        * libio/bits/libio.h: Move back to libio/libio.h and adjust
        multiple-include guard to match.
        Merge contents of libio/bits/libio-ldbl.h and include/libio.h
        into this file.
        Remove preprocessor conditionals that are always true and/or
        redundant to other preprocessor conditionals in the same nest.
        Include shlib-compat.h unconditionally.
        Error out if _LIBC is not defined, or if _ISOMAC is defined,
        or if _IO_MTSAFE_IO is defined but _IO_lock_t_defined is not
        defined after including stdio.h.
        Use __BEGIN_DECLS/__END_DECLS.

        * libio/bits/libio-ldbl.h, include/bits/libio.h: Delete file.
        * include/stdio.h, libio/iolibio.h, libio/libioP.h: Include
        libio.h as <libio/libio.h> rather than as <bits/libio.h>.
---
 include/bits/libio.h     | 45 -----------------------
 include/stdio.h          |  2 +-
 libio/bits/libio-ldbl.h  | 29 ---------------
 libio/iolibio.h          |  2 +-
 libio/{bits => }/libio.h | 96 ++++++++++++++++++++++++++++++++----------------
 libio/libioP.h           |  2 +-
 6 files changed, 67 insertions(+), 109 deletions(-)
 delete mode 100644 include/bits/libio.h
 delete mode 100644 libio/bits/libio-ldbl.h
 rename libio/{bits => }/libio.h (87%)

diff --git a/include/bits/libio.h b/include/bits/libio.h
deleted file mode 100644
index 572395d5ffb..00000000000
--- a/include/bits/libio.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#if !defined _ISOMAC && defined _IO_MTSAFE_IO
-# include <stdio-lock.h>
-#endif
-#include <libio/bits/libio.h>
-
-#ifndef _ISOMAC
-#ifndef _LIBC_LIBIO_H
-#define _LIBC_LIBIO_H
-
-libc_hidden_proto (__overflow)
-libc_hidden_proto (__underflow)
-libc_hidden_proto (__uflow)
-libc_hidden_proto (__woverflow)
-libc_hidden_proto (__wunderflow)
-libc_hidden_proto (__wuflow)
-libc_hidden_proto (_IO_free_backup_area)
-libc_hidden_proto (_IO_free_wbackup_area)
-libc_hidden_proto (_IO_padn)
-libc_hidden_proto (_IO_putc)
-libc_hidden_proto (_IO_sgetn)
-libc_hidden_proto (_IO_vfprintf)
-libc_hidden_proto (_IO_vfscanf)
-
-#ifdef _IO_MTSAFE_IO
-# undef _IO_peekc
-# undef _IO_flockfile
-# undef _IO_funlockfile
-# undef _IO_ftrylockfile
-
-# define _IO_peekc(_fp) _IO_peekc_locked (_fp)
-# if _IO_lock_inexpensive
-#  define _IO_flockfile(_fp) \
-  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_lock (*(_fp)->_lock)
-#  define _IO_funlockfile(_fp) \
-  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_unlock (*(_fp)->_lock)
-# else
-#  define _IO_flockfile(_fp) \
-  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_flockfile (_fp)
-#  define _IO_funlockfile(_fp) \
-  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_funlockfile (_fp)
-# endif
-#endif /* _IO_MTSAFE_IO */
-
-#endif
-#endif
diff --git a/include/stdio.h b/include/stdio.h
index 3b6da17d82f..f12b281b4d6 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -5,7 +5,7 @@
 # include <libio/stdio.h>
 # ifndef _ISOMAC
 #  define _LIBC_STDIO_H 1
-#  include <bits/libio.h>
+#  include <libio/libio.h>
 
 /* Now define the internal interfaces.  */
 
diff --git a/libio/bits/libio-ldbl.h b/libio/bits/libio-ldbl.h
deleted file mode 100644
index aa39353ca50..00000000000
--- a/libio/bits/libio-ldbl.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* -mlong-double-64 compatibility mode for libio functions.
-   Copyright (C) 2006-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 _BITS_LIBIO_LDBL_H
-#define _BITS_LIBIO_LDBL_H 1
-
-#ifndef _BITS_LIBIO_H
-# error "Never include <bits/libio-ldbl.h> directly; use <libio.h> instead."
-#endif
-
-__LDBL_REDIR_DECL (_IO_vfscanf)
-__LDBL_REDIR_DECL (_IO_vfprintf)
-
-#endif
diff --git a/libio/iolibio.h b/libio/iolibio.h
index 7814b1d4e56..52731b65f91 100644
--- a/libio/iolibio.h
+++ b/libio/iolibio.h
@@ -2,7 +2,7 @@
 #define _IOLIBIO_H 1
 
 #include <stdio.h>
-#include <bits/libio.h>
+#include <libio/libio.h>
 
 /* These emulate stdio functionality, but with a different name
    (_IO_ungetc instead of ungetc), and using _IO_FILE instead of FILE. */
diff --git a/libio/bits/libio.h b/libio/libio.h
similarity index 87%
rename from libio/bits/libio.h
rename to libio/libio.h
index cefc2c855b9..ff67e18c182 100644
--- a/libio/bits/libio.h
+++ b/libio/libio.h
@@ -25,11 +25,22 @@
    This exception applies to code released by its copyright holders
    in files containing the exception.  */
 
-#ifndef _BITS_LIBIO_H
-#define _BITS_LIBIO_H 1
+#ifndef _LIBIO_H
+#define _LIBIO_H 1
+
+#ifndef _LIBC
+# error "libio.h should only be included when building glibc itself"
+#endif
+#ifdef _ISOMAC
+# error "libio.h should not be included under _ISOMAC"
+#endif
 
 #include <stdio.h>
 
+#if defined _IO_MTSAFE_IO && !defined _IO_lock_t_defined
+# error "Someone forgot to include stdio-lock.h"
+#endif
+
 #include <bits/_G_config.h>
 /* ALL of these should be defined in _G_config.h */
 #define _IO_fpos_t __fpos_t
@@ -46,6 +57,10 @@
 #define _IO_wint_t wint_t
 #define _IO_va_list __gnuc_va_list
 
+#include <shlib-compat.h>
+
+__BEGIN_DECLS
+
 /* compatibility defines */
 #define _STDIO_USES_IOSTREAM
 #define _IO_UNIFIED_JUMPTABLES 1
@@ -143,7 +158,6 @@ enum __codecvt_result
   __codecvt_noconv
 };
 
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
 /* The order of the elements in the following struct must match the order
    of the virtual functions in the libstdc++ codecvt class.  */
 struct _IO_codecvt
@@ -198,7 +212,6 @@ struct _IO_wide_data
 
   const struct _IO_jump_t *_wide_vtable;
 };
-#endif
 
 
 #ifndef __cplusplus
@@ -236,17 +249,10 @@ extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write,
 			     void *__cookie, _IO_cookie_io_functions_t __fns);
 #endif
 
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 extern int __underflow (_IO_FILE *);
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
 extern _IO_wint_t __wunderflow (_IO_FILE *);
 extern _IO_wint_t __wuflow (_IO_FILE *);
 extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t);
-#endif
 
 #if  __GNUC__ >= 3
 # define _IO_BE(expr, res) __builtin_expect ((expr), res)
@@ -261,7 +267,6 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t);
 	: *(unsigned char *) (_fp)->_IO_read_ptr)
 #define _IO_putc_unlocked(_ch, _fp) __putc_unlocked_body (_ch, _fp)
 
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
 # define _IO_getwc_unlocked(_fp) \
   (_IO_BE ((_fp)->_wide_data == NULL					\
 	   || ((_fp)->_wide_data->_IO_read_ptr				\
@@ -273,7 +278,6 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t);
 	       >= (_fp)->_wide_data->_IO_write_end), 0)			\
    ? __woverflow (_fp, _wch)						\
    : (_IO_wint_t) (*(_fp)->_wide_data->_IO_write_ptr++ = (_wch)))
-#endif
 
 #define _IO_feof_unlocked(_fp) __feof_unlocked_body (_fp)
 #define _IO_ferror_unlocked(_fp) __ferror_unlocked_body (_fp)
@@ -319,28 +323,25 @@ extern _IO_off64_t _IO_seekpos (_IO_FILE *, _IO_off64_t, int);
 
 extern void _IO_free_backup_area (_IO_FILE *) __THROW;
 
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
+
 extern _IO_wint_t _IO_getwc (_IO_FILE *__fp);
 extern _IO_wint_t _IO_putwc (wchar_t __wc, _IO_FILE *__fp);
 extern int _IO_fwide (_IO_FILE *__fp, int __mode) __THROW;
-# if __GNUC__ >= 2
+
 /* While compiling glibc we have to handle compatibility with very old
    versions.  */
-#  if defined _LIBC && defined SHARED
-#   include <shlib-compat.h>
-#   if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
-#    define _IO_fwide_maybe_incompatible \
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
+#  define _IO_fwide_maybe_incompatible \
   (__builtin_expect (&_IO_stdin_used == NULL, 0))
 extern const int _IO_stdin_used;
 weak_extern (_IO_stdin_used);
-#   endif
-#  endif
-#  ifndef _IO_fwide_maybe_incompatible
-#   define _IO_fwide_maybe_incompatible (0)
-#  endif
+#else
+# define _IO_fwide_maybe_incompatible (0)
+#endif
+
 /* A special optimized version of the function above.  It optimizes the
    case of initializing an unoriented byte stream.  */
-#  define _IO_fwide(__fp, __mode) \
+#define _IO_fwide(__fp, __mode) \
   ({ int __result = (__mode);						      \
      if (__result < 0 && ! _IO_fwide_maybe_incompatible)		      \
        {								      \
@@ -354,7 +355,6 @@ weak_extern (_IO_stdin_used);
      else								      \
        __result = _IO_fwide (__fp, __result);				      \
      __result; })
-# endif
 
 extern int _IO_vfwscanf (_IO_FILE * __restrict, const wchar_t * __restrict,
 			 _IO_va_list, int *__restrict);
@@ -362,14 +362,46 @@ extern int _IO_vfwprintf (_IO_FILE *__restrict, const wchar_t *__restrict,
 			  _IO_va_list);
 extern _IO_ssize_t _IO_wpadn (_IO_FILE *, wint_t, _IO_ssize_t);
 extern void _IO_free_wbackup_area (_IO_FILE *) __THROW;
-#endif
 
 #ifdef __LDBL_COMPAT
-# include <bits/libio-ldbl.h>
+__LDBL_REDIR_DECL (_IO_vfscanf)
+__LDBL_REDIR_DECL (_IO_vfprintf)
 #endif
 
-#ifdef __cplusplus
-}
-#endif
+libc_hidden_proto (__overflow)
+libc_hidden_proto (__underflow)
+libc_hidden_proto (__uflow)
+libc_hidden_proto (__woverflow)
+libc_hidden_proto (__wunderflow)
+libc_hidden_proto (__wuflow)
+libc_hidden_proto (_IO_free_backup_area)
+libc_hidden_proto (_IO_free_wbackup_area)
+libc_hidden_proto (_IO_padn)
+libc_hidden_proto (_IO_putc)
+libc_hidden_proto (_IO_sgetn)
+libc_hidden_proto (_IO_vfprintf)
+libc_hidden_proto (_IO_vfscanf)
+
+#ifdef _IO_MTSAFE_IO
+# undef _IO_peekc
+# undef _IO_flockfile
+# undef _IO_funlockfile
+# undef _IO_ftrylockfile
+
+# define _IO_peekc(_fp) _IO_peekc_locked (_fp)
+# if _IO_lock_inexpensive
+#  define _IO_flockfile(_fp) \
+  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_lock (*(_fp)->_lock)
+#  define _IO_funlockfile(_fp) \
+  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_unlock (*(_fp)->_lock)
+# else
+#  define _IO_flockfile(_fp) \
+  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_flockfile (_fp)
+#  define _IO_funlockfile(_fp) \
+  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_funlockfile (_fp)
+# endif
+#endif /* _IO_MTSAFE_IO */
+
+__END_DECLS
 
-#endif /* _BITS_LIBIO_H */
+#endif /* _LIBIO_H */
diff --git a/libio/libioP.h b/libio/libioP.h
index ac66f95f8d4..8edc207277e 100644
--- a/libio/libioP.h
+++ b/libio/libioP.h
@@ -43,7 +43,7 @@
 #include <math_ldbl_opt.h>
 
 #include <stdio.h>
-#include <bits/libio.h>
+#include <libio/libio.h>
 #include "iolibio.h"
 
 #ifdef __cplusplus
-- 
2.15.1



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

* [PATCH v2 5/5] Post-cleanup 2: minimize _G_config.h.
  2018-02-05 23:34 [PATCH v2 0/5] Don't install libio.h or _G_config.h Zack Weinberg
                   ` (3 preceding siblings ...)
  2018-02-05 23:34 ` [PATCH v2 4/5] Post-cleanup 1: move libio.h back out of bits/ Zack Weinberg
@ 2018-02-05 23:35 ` Zack Weinberg
  2018-02-06 19:06   ` Adhemerval Zanella
  4 siblings, 1 reply; 21+ messages in thread
From: Zack Weinberg @ 2018-02-05 23:35 UTC (permalink / raw
  To: libc-alpha; +Cc: fweimer, joseph

Nearly everything in _G_config.h is either junk or more appropriately
defined elsewhere:

 * _G_fpos_t, _G_fpos64_t, and _G_BUFSIZ are already completely unused.
 * All remaining uses of _G_va_list have been changed to __gnuc_va_list.
 * The definition of _G_HAVE_ST_BLKSIZE/_IO_HAVE_ST_BLKSIZE has
   been inlined into its sole use.
 * The complete definition of _G_iconv_t has been moved to libio.h and
   renamed _IO_iconv_t (all actual users used that name).
 * _G_IO_IO_FILE_VERSION is vestigial; some code cares whether
   _IO_stdin_used exists, but nothing looks at its value.  I've
   preserved the value as a hardwired constant in csu/init.c.
   This means csu/init.c no longer needs to include anything.
 * Many of the headers included by _G_config.h were already being
   included directly by either either libio.h or stdio.h; the
   remaining ones were moved to libio.h.
 * _G_HAVE_MREMAP is still relevant, because mremap genuinely is a
   Linux extension; it's not in POSIX and as far as I can tell it's
   not available on the Hurd either.  I also preserved _G_HAVE_MMAP,
   since it's conceivable someone would want to port glibc to a
   MMU-less, mmap-less environment in the future.  Both are now always
   defined to 1/0 as is the current convention, instead of the older
   1/undef convention.  These are the only symbols still defined in
   _G_config.h.
 * The actual inclusion of _G_config.h moves from libio.h to libioP.h,
   as this is where a potential override of _G_HAVE_MMAP happens.
 * The #ifdef logic in libioP.h controlling _IO_JUMPS_OFFSET has been
   simplified.

After this patch, the only surviving _G_ symbols are the struct tag
names _G_fpos_t and _G_fpos64_t, which are preserved for the sake of
C++ mangled names in applications, and _G_HAVE_MMAP and _G_HAVE_MREMAP,
which do not seem worth renaming.

Installed stripped libraries are unchanged by this patch.

	* bits/_G_config.h: Move back to sysdeps/generic/_G_config.h.
	Delete all contents except for definitions of _G_HAVE_MMAP and
	_G_HAVE_MREMAP.  Add commentary explaining those two symbols.
	* sysdeps/unix/sysv/linux/bits/_G_config.h: Move back to
	sysdeps/unix/sysv/linux/_G_config.h.  Make same content
	change as above.

	* libio/libio.h: Don't include bits/_G_config.h here.
	Include stddef.h with __need_wchar_t defined.  Include
	bits/types/__mbstate_t.h, bits/types/wint_t.h, and gconv.h.
	Define _IO_iconv_t here, directly.
	Don't define _IO_HAVE_ST_BLKSIZE.
	* libio/libioP.h: Include _G_config.h here.  Move include of
	shlib-compat.h up with rest of includes.  Simplify conditionals
	controlling definition of _IO_JUMPS_OFFSET.

	* csu/init.c: Remove always-true #if around entire file.
	Don't include stdio.h.  Set _IO_stdin_used to hardwired
	constant 0x20001, and update commentary.
	* include/stdio.h, sysdeps/ieee754/ldbl-opt/nldbl-compat.h:
	Replace all uses of _G_va_list with __gnuc_va_list.
	* libio/filedoalloc.c: Use #if defined _STATBUF_ST_BLKSIZE
	instead of #if _IO_HAVE_ST_BLKSIZE.
	* libio/fileops.c: Test _G_HAVE_MREMAP with #if, not #ifdef.
	* libio/iofdopen.c, libio/iofopen.c: Test _G_HAVE_MMAP with #if,
	not #ifdef.
---
 bits/_G_config.h                         | 54 -------------------------------
 csu/init.c                               | 13 +++-----
 include/stdio.h                          | 28 ++++++++--------
 libio/filedoalloc.c                      |  2 +-
 libio/fileops.c                          |  2 +-
 libio/iofdopen.c                         |  4 +--
 libio/iofopen.c                          |  2 +-
 libio/libio.h                            | 22 ++++++++++---
 libio/libioP.h                           | 20 ++++++------
 sysdeps/generic/_G_config.h              | 15 +++++++++
 sysdeps/ieee754/ldbl-opt/nldbl-compat.h  | 13 ++++----
 sysdeps/unix/sysv/linux/_G_config.h      | 15 +++++++++
 sysdeps/unix/sysv/linux/bits/_G_config.h | 55 --------------------------------
 13 files changed, 89 insertions(+), 156 deletions(-)
 delete mode 100644 bits/_G_config.h
 create mode 100644 sysdeps/generic/_G_config.h
 create mode 100644 sysdeps/unix/sysv/linux/_G_config.h
 delete mode 100644 sysdeps/unix/sysv/linux/bits/_G_config.h

diff --git a/bits/_G_config.h b/bits/_G_config.h
deleted file mode 100644
index 8c81bc42787..00000000000
--- a/bits/_G_config.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* This file is needed by libio to define various configuration parameters.
-   These are always the same in the GNU C library.  */
-
-#ifndef _BITS_G_CONFIG_H
-#define _BITS_G_CONFIG_H 1
-
-/* Define types for libio in terms of the standard internal type names.  */
-
-#include <bits/types.h>
-#define __need_size_t
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# define __need_wchar_t
-#endif
-#define __need_NULL
-#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
-
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# include <gconv.h>
-typedef union
-{
-  struct __gconv_info __cd;
-  struct
-  {
-    struct __gconv_info __cd;
-    struct __gconv_step_data __data;
-  } __combined;
-} _G_iconv_t;
-#endif
-
-
-/* These library features are always available in the GNU C library.  */
-#define _G_va_list __gnuc_va_list
-
-#define _G_HAVE_MMAP 1
-
-#define _G_IO_IO_FILE_VERSION 0x20001
-
-/* This is defined by <bits/stat.h> if `st_blksize' exists.  */
-#define _G_HAVE_ST_BLKSIZE defined (_STATBUF_ST_BLKSIZE)
-
-#define _G_BUFSIZ 8192
-
-#endif	/* bits/_G_config.h */
diff --git a/csu/init.c b/csu/init.c
index 178063b44bf..c2f978f3da5 100644
--- a/csu/init.c
+++ b/csu/init.c
@@ -16,11 +16,8 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#if defined __GNUC__ && __GNUC__ >= 2
-
-#include <stdio.h>
-
-/* This records which stdio is linked against in the application. */
-const int _IO_stdin_used = _G_IO_IO_FILE_VERSION;
-
-#endif
+/* Vestigial libio version number.  Some code in libio checks whether
+   this symbol exists in the executable, but nothing looks at its
+   value anymore; the value it was historically set to has been
+   preserved out of an abundance of caution.  */
+const int _IO_stdin_used = 0x20001;
diff --git a/include/stdio.h b/include/stdio.h
index f12b281b4d6..94bc2fdc7ef 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -15,44 +15,44 @@ extern int __snprintf (char *__restrict __s, size_t __maxlen,
      __attribute__ ((__format__ (__printf__, 3, 4)));
 libc_hidden_proto (__snprintf)
 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)
      __attribute__ ((__format__ (__printf__, 3, 0)));
 extern int __vfscanf (FILE *__restrict __s,
 		      const char *__restrict __format,
-		      _G_va_list __arg)
+		      __gnuc_va_list __arg)
      __attribute__ ((__format__ (__scanf__, 2, 0)));
 libc_hidden_proto (__vfscanf)
 extern int __vscanf (const char *__restrict __format,
-		     _G_va_list __arg)
+		     __gnuc_va_list __arg)
      __attribute__ ((__format__ (__scanf__, 1, 0)));
 extern _IO_ssize_t __getline (char **__lineptr, size_t *__n,
 			      FILE *__stream) attribute_hidden;
 extern int __vsscanf (const char *__restrict __s,
 		      const char *__restrict __format,
-		      _G_va_list __arg)
+		      __gnuc_va_list __arg)
      __attribute__ ((__format__ (__scanf__, 2, 0)));
 
 extern int __sprintf_chk (char *, int, size_t, const char *, ...) __THROW;
 extern int __snprintf_chk (char *, size_t, int, size_t, const char *, ...)
      __THROW;
 extern int __vsprintf_chk (char *, int, size_t, const char *,
-			   _G_va_list) __THROW;
+			   __gnuc_va_list) __THROW;
 extern int __vsnprintf_chk (char *, size_t, int, size_t, const char *,
-			    _G_va_list) __THROW;
+			    __gnuc_va_list) __THROW;
 extern int __printf_chk (int, const char *, ...);
 extern int __fprintf_chk (FILE *, int, const char *, ...);
-extern int __vprintf_chk (int, const char *, _G_va_list);
-extern int __vfprintf_chk (FILE *, int, const char *, _G_va_list);
+extern int __vprintf_chk (int, const char *, __gnuc_va_list);
+extern int __vfprintf_chk (FILE *, int, const char *, __gnuc_va_list);
 extern char *__fgets_unlocked_chk (char *buf, size_t size, int n, FILE *fp);
 extern char *__fgets_chk (char *buf, size_t size, int n, FILE *fp);
 extern int __asprintf_chk (char **, int, const char *, ...) __THROW;
-extern int __vasprintf_chk (char **, int, const char *, _G_va_list) __THROW;
+extern int __vasprintf_chk (char **, int, const char *, __gnuc_va_list) __THROW;
 extern int __dprintf_chk (int, int, const char *, ...);
-extern int __vdprintf_chk (int, int, const char *, _G_va_list);
+extern int __vdprintf_chk (int, int, const char *, __gnuc_va_list);
 extern int __obstack_printf_chk (struct obstack *, int, const char *, ...)
      __THROW;
 extern int __obstack_vprintf_chk (struct obstack *, int, const char *,
-				  _G_va_list) __THROW;
+				  __gnuc_va_list) __THROW;
 
 extern int __isoc99_fscanf (FILE *__restrict __stream,
 			    const char *__restrict __format, ...) __wur;
@@ -61,12 +61,12 @@ extern int __isoc99_sscanf (const char *__restrict __s,
 			    const char *__restrict __format, ...) __THROW;
 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;
 libc_hidden_proto (__isoc99_vsscanf)
 libc_hidden_proto (__isoc99_vfscanf)
 
diff --git a/libio/filedoalloc.c b/libio/filedoalloc.c
index 329843827f5..d6517e493b0 100644
--- a/libio/filedoalloc.c
+++ b/libio/filedoalloc.c
@@ -93,7 +93,7 @@ _IO_file_doallocate (_IO_FILE *fp)
 	      local_isatty (fp->_fileno))
 	    fp->_flags |= _IO_LINE_BUF;
 	}
-#if _IO_HAVE_ST_BLKSIZE
+#if defined _STATBUF_ST_BLKSIZE
       if (st.st_blksize > 0 && st.st_blksize < _IO_BUFSIZ)
 	size = st.st_blksize;
 #endif
diff --git a/libio/fileops.c b/libio/fileops.c
index 6d5393cea3f..5fd8a9647f2 100644
--- a/libio/fileops.c
+++ b/libio/fileops.c
@@ -582,7 +582,7 @@ mmap_remap_check (_IO_FILE *fp)
 	{
 	  /* The file added some pages.  We need to remap it.  */
 	  void *p;
-#ifdef _G_HAVE_MREMAP
+#if _G_HAVE_MREMAP
 	  p = __mremap (fp->_IO_buf_base, ROUNDED (fp->_IO_buf_end
 						   - fp->_IO_buf_base),
 			ROUNDED (st.st_size), MREMAP_MAYMOVE);
diff --git a/libio/iofdopen.c b/libio/iofdopen.c
index 3546d52b4da..b6f1500dee4 100644
--- a/libio/iofdopen.c
+++ b/libio/iofdopen.c
@@ -126,13 +126,13 @@ _IO_new_fdopen (int fd, const char *mode)
   new_f->fp.file._lock = &new_f->lock;
 #endif
   _IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd,
-#ifdef _G_HAVE_MMAP
+#if _G_HAVE_MMAP
 	       (use_mmap && (read_write & _IO_NO_WRITES))
 	       ? &_IO_wfile_jumps_maybe_mmap :
 #endif
 	       &_IO_wfile_jumps);
   _IO_JUMPS (&new_f->fp) =
-#ifdef _G_HAVE_MMAP
+#if _G_HAVE_MMAP
     (use_mmap && (read_write & _IO_NO_WRITES)) ? &_IO_file_jumps_maybe_mmap :
 #endif
       &_IO_file_jumps;
diff --git a/libio/iofopen.c b/libio/iofopen.c
index d6f59497b42..2ea82e20917 100644
--- a/libio/iofopen.c
+++ b/libio/iofopen.c
@@ -33,7 +33,7 @@
 _IO_FILE *
 __fopen_maybe_mmap (_IO_FILE *fp)
 {
-#ifdef _G_HAVE_MMAP
+#if _G_HAVE_MMAP
   if ((fp->_flags2 & _IO_FLAGS2_MMAP) && (fp->_flags & _IO_NO_WRITES))
     {
       /* Since this is read-only, we might be able to mmap the contents
diff --git a/libio/libio.h b/libio/libio.h
index ff67e18c182..09531202472 100644
--- a/libio/libio.h
+++ b/libio/libio.h
@@ -41,8 +41,24 @@
 # error "Someone forgot to include stdio-lock.h"
 #endif
 
-#include <bits/_G_config.h>
-/* ALL of these should be defined in _G_config.h */
+#define __need_wchar_t
+#include <stddef.h>
+
+#include <bits/types/__mbstate_t.h>
+#include <bits/types/wint_t.h>
+#include <gconv.h>
+
+typedef union
+{
+  struct __gconv_info __cd;
+  struct
+  {
+    struct __gconv_info __cd;
+    struct __gconv_step_data __data;
+  } __combined;
+} _IO_iconv_t;
+
+/* Map the names used in libio to the names used in libc generally.  */
 #define _IO_fpos_t __fpos_t
 #define _IO_fpos64_t __fpos64_t
 #define _IO_size_t size_t
@@ -51,8 +67,6 @@
 #define _IO_off64_t __off64_t
 #define _IO_pid_t __pid_t
 #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 BUFSIZ
 #define _IO_wint_t wint_t
 #define _IO_va_list __gnuc_va_list
diff --git a/libio/libioP.h b/libio/libioP.h
index 8edc207277e..58cc9de094b 100644
--- a/libio/libioP.h
+++ b/libio/libioP.h
@@ -46,6 +46,12 @@
 #include <libio/libio.h>
 #include "iolibio.h"
 
+#include <shlib-compat.h>
+
+/* For historical reasons this is the name of the sysdeps header that
+   adjusts the libio configuration.  */
+#include <_G_config.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -75,16 +81,10 @@ extern "C" {
  * object being acted on (i.e. the 'this' parameter).
  */
 
-#include <shlib-compat.h>
-#if !SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
-  /* Setting this macro disables the use of the _vtable_offset bias in
-     _IO_JUMPS_FUNCS, below.  That is only needed if we want to
-     support old binaries (see oldfileops.c).  */
-# define _G_IO_NO_BACKWARD_COMPAT 1
-#endif
-
-#if (!defined _IO_USE_OLD_IO_FILE \
-     && (!defined _G_IO_NO_BACKWARD_COMPAT || _G_IO_NO_BACKWARD_COMPAT == 0))
+/* Setting this macro to 1 enables the use of the _vtable_offset bias
+   in _IO_JUMPS_FUNCS, below.  This is only needed for new-format
+   _IO_FILE in libc that must support old binaries (see oldfileops.c).  */
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) && !defined _IO_USE_OLD_IO_FILE
 # define _IO_JUMPS_OFFSET 1
 #else
 # define _IO_JUMPS_OFFSET 0
diff --git a/sysdeps/generic/_G_config.h b/sysdeps/generic/_G_config.h
new file mode 100644
index 00000000000..7c917bf64c4
--- /dev/null
+++ b/sysdeps/generic/_G_config.h
@@ -0,0 +1,15 @@
+/* Configuration parameters for stdio - generic version.  */
+
+#ifndef __G_CONFIG_H
+#define __G_CONFIG_H 1
+
+/* Define to 1 if the operating system supports mmap, 0 otherwise.
+   This function is required by POSIX but might still be unavailable,
+   for instance when the hardware lacks support for virtual memory.  */
+#define _G_HAVE_MMAP 1
+
+/* Define to 1 if the operating system supports mremap, 0 otherwise.
+   This function is currently a Linux-specific extension.  */
+#define _G_HAVE_MREMAP 0
+
+#endif	/* _G_config.h */
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
index 3b3ef731a6d..d61fbb2f649 100644
--- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
@@ -82,22 +82,23 @@ extern ssize_t __nldbl___vstrfmon (char *, size_t, const char *, va_list)
 /* These don't use __typeof because they were not declared by the headers,
    since we don't compile with _FORTIFY_SOURCE.  */
 extern int __nldbl___vfprintf_chk (FILE *__restrict, int,
-				   const char *__restrict, _G_va_list);
+				   const char *__restrict, __gnuc_va_list);
 extern int __nldbl___vfwprintf_chk (FILE *__restrict, int,
 				    const wchar_t *__restrict, __gnuc_va_list);
 extern int __nldbl___vsprintf_chk (char *__restrict, int, size_t,
-				   const char *__restrict, _G_va_list) __THROW;
+				   const char *__restrict, __gnuc_va_list)
+  __THROW;
 extern int __nldbl___vsnprintf_chk (char *__restrict, size_t, int, size_t,
-				    const char *__restrict, _G_va_list)
+				    const char *__restrict, __gnuc_va_list)
   __THROW;
 extern int __nldbl___vswprintf_chk (wchar_t *__restrict, size_t, int, size_t,
 				    const wchar_t *__restrict, __gnuc_va_list)
   __THROW;
-extern int __nldbl___vasprintf_chk (char **, int, const char *, _G_va_list)
+extern int __nldbl___vasprintf_chk (char **, int, const char *, __gnuc_va_list)
   __THROW;
-extern int __nldbl___vdprintf_chk (int, int, const char *, _G_va_list);
+extern int __nldbl___vdprintf_chk (int, int, const char *, __gnuc_va_list);
 extern int __nldbl___obstack_vprintf_chk (struct obstack *, int, const char *,
-					  _G_va_list) __THROW;
+					  __gnuc_va_list) __THROW;
 extern void __nldbl___vsyslog_chk (int, int, const char *, va_list);
 
 
diff --git a/sysdeps/unix/sysv/linux/_G_config.h b/sysdeps/unix/sysv/linux/_G_config.h
new file mode 100644
index 00000000000..04137164816
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/_G_config.h
@@ -0,0 +1,15 @@
+/* Configuration parameters for stdio - Linux version.  */
+
+#ifndef __G_CONFIG_H
+#define __G_CONFIG_H 1
+
+/* Define to 1 if the operating system supports mmap, 0 otherwise.
+   This function is required by POSIX but might still be unavailable,
+   for instance when the hardware lacks support for virtual memory.  */
+#define _G_HAVE_MMAP 1
+
+/* Define to 1 if the operating system supports mremap, 0 otherwise.
+   This function is currently a Linux-specific extension.  */
+#define _G_HAVE_MREMAP 1
+
+#endif	/* bits/_G_config.h */
diff --git a/sysdeps/unix/sysv/linux/bits/_G_config.h b/sysdeps/unix/sysv/linux/bits/_G_config.h
deleted file mode 100644
index 05a64acb2cf..00000000000
--- a/sysdeps/unix/sysv/linux/bits/_G_config.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* This file is needed by libio to define various configuration parameters.
-   These are always the same in the GNU C library.  */
-
-#ifndef _BITS_G_CONFIG_H
-#define _BITS_G_CONFIG_H 1
-
-/* Define types for libio in terms of the standard internal type names.  */
-
-#include <bits/types.h>
-#define __need_size_t
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# define __need_wchar_t
-#endif
-#define __need_NULL
-#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
-
-#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
-# include <gconv.h>
-typedef union
-{
-  struct __gconv_info __cd;
-  struct
-  {
-    struct __gconv_info __cd;
-    struct __gconv_step_data __data;
-  } __combined;
-} _G_iconv_t;
-#endif
-
-
-/* These library features are always available in the GNU C library.  */
-#define _G_va_list __gnuc_va_list
-
-#define _G_HAVE_MMAP 1
-#define _G_HAVE_MREMAP 1
-
-#define _G_IO_IO_FILE_VERSION 0x20001
-
-/* This is defined by <bits/stat.h> if `st_blksize' exists.  */
-#define _G_HAVE_ST_BLKSIZE defined (_STATBUF_ST_BLKSIZE)
-
-#define _G_BUFSIZ 8192
-
-#endif	/* bits/_G_config.h */
-- 
2.15.1



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

* Re: [PATCH v2 1/5] Pre-cleanup: Remove unnecessary redefinitions of std symbols.
  2018-02-05 23:34 ` [PATCH v2 1/5] Pre-cleanup: Remove unnecessary redefinitions of std symbols Zack Weinberg
@ 2018-02-05 23:50   ` Joseph Myers
  0 siblings, 0 replies; 21+ messages in thread
From: Joseph Myers @ 2018-02-05 23:50 UTC (permalink / raw
  To: Zack Weinberg; +Cc: libc-alpha, fweimer

On Mon, 5 Feb 2018, Zack Weinberg wrote:

> Two files in stdio-common were unnecessarily redefining some standard
> symbols as their _IO_ aliases, which causes problems for a build with
> the visibility of libio.h reduced.
> 
> This changes installed stripped libraries, because the line numbering
> changes in vfprintf.c, which changes the messages associated with a
> bunch of assertions.  However, if it weren't entangled with a scary
> change I wouldn't be hesitating to call it an obvious cleanup.
> 
> 	* stdio-common/vfprintf.c: Don't redefine FILE, va_list, or BUFSIZ.
>         * stdio-common/tstgetln.c: Don't redefine ssize_t.

OK, please commit.

-- 
Joseph S. Myers
joseph@codesourcery.com


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

* Re: [PATCH v2 2/5] Remove getc and putc macros from the public stdio.h.
  2018-02-05 23:34 ` [PATCH v2 2/5] Remove getc and putc macros from the public stdio.h Zack Weinberg
@ 2018-02-06  0:01   ` Joseph Myers
  2018-02-06  1:03     ` Zack Weinberg
  0 siblings, 1 reply; 21+ messages in thread
From: Joseph Myers @ 2018-02-06  0:01 UTC (permalink / raw
  To: Zack Weinberg; +Cc: libc-alpha, fweimer

On Mon, 5 Feb 2018, Zack Weinberg wrote:

> diff --git a/NEWS b/NEWS
> index 3ac57eca4ee..eceab2b2be2 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -15,6 +15,13 @@ Deprecated and removed features, and other changes affecting compatibility:
>  
>    [Add deprecations, removals and changes affecting compatibility here]
>  
> + * 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
> +   putc would provide performance improvements over fgetc and fputc, instead
> +   investigate using (f)getc_unlocked and (f)putc_unlocked, and, if
> +   necessary, flockfile and funlockfile.

The "[Add deprecations, removals and changes affecting compatibility 
here]" placeholder should be removed by this patch, as the first one to 
put something in this section for 2.28.

The patch is OK with that change.

There is a theoretical use for implementation-namespace aliases of even 
C90 standard functions such as getc and putc - properly, if a function is 
used in a *macro* defined in a standard header, it should be used via such 
an alias to avoid possible shadowing of the standard function name by a 
block-scope variable in a scope where the macro is used (standard function 
names aren't generally reserved with block scope).  But that doesn't 
affect this patch at all, since there are no such macros making use of 
either getc or putc (and in any case, the _IO_getc and _IO_putc function 
exports still exist should they prove to be of use in future, and any 
aliases for this issue could be defined in headers with asm redirection 
without needing library exports at all).

-- 
Joseph S. Myers
joseph@codesourcery.com


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

* Re: [PATCH v2 2/5] Remove getc and putc macros from the public stdio.h.
  2018-02-06  0:01   ` Joseph Myers
@ 2018-02-06  1:03     ` Zack Weinberg
  0 siblings, 0 replies; 21+ messages in thread
From: Zack Weinberg @ 2018-02-06  1:03 UTC (permalink / raw
  To: Joseph Myers; +Cc: GNU C Library, Florian Weimer

On Mon, Feb 5, 2018 at 7:01 PM, Joseph Myers <joseph@codesourcery.com> wrote:
> On Mon, 5 Feb 2018, Zack Weinberg wrote:
>> diff --git a/NEWS b/NEWS
>> index 3ac57eca4ee..eceab2b2be2 100644
>> --- a/NEWS
>> +++ b/NEWS
>> @@ -15,6 +15,13 @@ Deprecated and removed features, and other changes affecting compatibility:
>>
>>    [Add deprecations, removals and changes affecting compatibility here]
>>
>> + * 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
>> +   putc would provide performance improvements over fgetc and fputc, instead
>> +   investigate using (f)getc_unlocked and (f)putc_unlocked, and, if
>> +   necessary, flockfile and funlockfile.
>
> The "[Add deprecations, removals and changes affecting compatibility
> here]" placeholder should be removed by this patch, as the first one to
> put something in this section for 2.28.

Doh! That was a merge botch on my end.

> The patch is OK with that change.

I have made that change and pushed patches 1 and 2 of this series.

Also, the full patchset is now available as git branch
'zack/no-libio-h' if anyone wants to experiment with it.

zw


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

* Re: [PATCH v2 3/5] Don't install libio.h or _G_config.h.
  2018-02-05 23:34 ` [PATCH v2 3/5] Don't install libio.h or _G_config.h Zack Weinberg
@ 2018-02-06 13:50   ` Adhemerval Zanella
       [not found]     ` <CAKCAbMiGUH5cBcZQjdf_uHTbqPyTJhBR-o8zo6u+hd_WCA_4VQ@mail.gmail.com>
  0 siblings, 1 reply; 21+ messages in thread
From: Adhemerval Zanella @ 2018-02-06 13:50 UTC (permalink / raw
  To: libc-alpha



On 05/02/2018 21:34, Zack Weinberg wrote:
> In this patch, we stop installing libio.h and _G_config.h for public
> use; necessarily, this means the public stdio.h stops including
> libio.h.
> 
> 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 are 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.
> 
> Installed stripped libraries are unchanged by this patch.

It looks good to me, with just a couple of nits below (which do not block the
patch itself). Bootstrap build with build-many-glibc.py for x86_64-linux-gnu
at least is clean (although I do not think it uses any libio functionality).

> 
> 	* 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.
> ---
>  NEWS                                       |   4 +-
>  bits/_G_config.h                           |  20 +--
>  conform/data/stdio.h-data                  |   2 +-
>  include/bits/types/__fpos64_t.h            |   1 +
>  include/bits/types/__fpos_t.h              |   1 +
>  include/bits/types/cookie_io_functions_t.h |   1 +
>  include/bits/types/struct_FILE.h           |   1 +
>  include/stdio.h                            |   5 +
>  libio/Makefile                             |   9 +-
>  libio/_G_config.h                          |  25 ----
>  libio/bits/libio.h                         | 194 ++++-------------------------
>  libio/bits/stdio.h                         |  29 +++--
>  libio/bits/stdio2.h                        |  35 +++---
>  libio/bits/types/__fpos64_t.h              |  16 +++
>  libio/bits/types/__fpos_t.h                |  16 +++
>  libio/bits/types/cookie_io_functions_t.h   |  46 +++++++
>  libio/bits/types/struct_FILE.h             | 120 ++++++++++++++++++
>  libio/iolibio.h                            |   6 +
>  libio/libio.h                              |  25 ----
>  libio/libioP.h                             |   7 ++
>  libio/stdio.h                              |  95 +++++++-------
>  scripts/check-installed-headers.sh         |   5 -
>  sysdeps/unix/sysv/linux/bits/_G_config.h   |  20 +--
>  23 files changed, 350 insertions(+), 333 deletions(-)
>  create mode 100644 include/bits/types/__fpos64_t.h
>  create mode 100644 include/bits/types/__fpos_t.h
>  create mode 100644 include/bits/types/cookie_io_functions_t.h
>  create mode 100644 include/bits/types/struct_FILE.h
>  delete mode 100644 libio/_G_config.h
>  create mode 100644 libio/bits/types/__fpos64_t.h
>  create mode 100644 libio/bits/types/__fpos_t.h
>  create mode 100644 libio/bits/types/cookie_io_functions_t.h
>  create mode 100644 libio/bits/types/struct_FILE.h
>  delete mode 100644 libio/libio.h
> 
> diff --git a/NEWS b/NEWS
> index eceab2b2be2..87a3f1d1cd8 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -13,7 +13,9 @@ Major new features:
>  
>  Deprecated and removed features, and other changes affecting compatibility:
>  
> -  [Add deprecations, removals and changes affecting compatibility here]
> + * 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
> diff --git a/bits/_G_config.h b/bits/_G_config.h
> index 2b60d29f5ff..8c81bc42787 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
> -

Ok.

>  /* 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 f69802cc703..3ef24606610 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 	
>  #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 00000000000..68cc4e8b66c
> --- /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 00000000000..2dcdc98d750
> --- /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 00000000000..87f7930c6ec
> --- /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 00000000000..971407292be
> --- /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 f1e987ae5e3..3b6da17d82f 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 918a86bb743..3e08ed0eeb0 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

Ok.

>  
>  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 68de2fcaa0d..00000000000
> --- 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

Ok.

> diff --git a/libio/bits/libio.h b/libio/bits/libio.h
> index fae5b932a1f..cefc2c855b9 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>

Ok.

>  
>  #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
>  };

Ok.

>  
>  /* 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
> -};

Ok.

>  
>  #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;

Ok.

> +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;

Ok.

>  
>  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)

Ok.

>  
>  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 eb42b22153c..4ab919031f7 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.  */

Ok.

> diff --git a/libio/bits/stdio2.h b/libio/bits/stdio2.h
> index 55302e91d0d..11651506a67 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.  */

Ok.

> diff --git a/libio/bits/types/__fpos64_t.h b/libio/bits/types/__fpos64_t.h
> new file mode 100644
> index 00000000000..06a6891154f
> --- /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

Ok.

> diff --git a/libio/bits/types/__fpos_t.h b/libio/bits/types/__fpos_t.h
> new file mode 100644
> index 00000000000..bb04576651b
> --- /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

Ok.

> 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 00000000000..cd4c0e19f4c
> --- /dev/null
> +++ b/libio/bits/types/cookie_io_functions_t.h
> @@ -0,0 +1,46 @@
> +#ifndef __cookie_io_functions_t_defined
> +#define __cookie_io_functions_t_defined 1

Not sure if file this size requires a copyright header.

> +
> +#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

Ok.

> diff --git a/libio/bits/types/struct_FILE.h b/libio/bits/types/struct_FILE.h
> new file mode 100644
> index 00000000000..a120c762685
> --- /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

Ok.

> +
> +#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

Ok.

> diff --git a/libio/iolibio.h b/libio/iolibio.h
> index 621b31cff1f..7814b1d4e56 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.  */

Ok.

> diff --git a/libio/libio.h b/libio/libio.h
> deleted file mode 100644
> index 47a25083ce3..00000000000
> --- 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

Ok.

> diff --git a/libio/libioP.h b/libio/libioP.h
> index 068ceb2615a..ac66f95f8d4 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.  */

Ok.

> diff --git a/libio/stdio.h b/libio/stdio.h
> index 33de3813bbd..731f8e56f4c 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

I think a possible subsqueuent cleanup is to remove _IO_BUFSIZE utilization 
within glibc as well.

> 
>  
> -/* 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)

EOF is being define on both libio/libioP.h and libio/stdio.h. Shouldn't we
cleanup the libioP.h one?

>  
>  
>  /* 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)

Ok.

> @@ -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

Ok.

> @@ -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
>  
>  

Ok.

> @@ -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

Ok.

> diff --git a/scripts/check-installed-headers.sh b/scripts/check-installed-headers.sh
> index 3384e1c3e76..7ffd2b8e749 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

Ok.

> diff --git a/sysdeps/unix/sysv/linux/bits/_G_config.h b/sysdeps/unix/sysv/linux/bits/_G_config.h
> index 9994869098b..05a64acb2cf 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
> 

Ok.


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

* Re: [PATCH v2 4/5] Post-cleanup 1: move libio.h back out of bits/.
  2018-02-05 23:34 ` [PATCH v2 4/5] Post-cleanup 1: move libio.h back out of bits/ Zack Weinberg
@ 2018-02-06 16:57   ` Adhemerval Zanella
  2018-02-06 20:10     ` Zack Weinberg
  0 siblings, 1 reply; 21+ messages in thread
From: Adhemerval Zanella @ 2018-02-06 16:57 UTC (permalink / raw
  To: libc-alpha



On 05/02/2018 21:34, Zack Weinberg wrote:
> In this patch, libio.h moves back out of bits/ into the top level of
> the libio subdirectory, and is merged with libio/bits/libio-ldbl.h
> (which also used to be installed) and include/libio.h.  Since almost
> no files include libio.h directly, this is quite straightforward.
> 
> libio.h is now always used with _LIBC defined, so all of the _LIBC ||
> _GLIBCPP_USE_WCHAR_T conditionals are unnecessary.  Similarly, the
> ifdef nest surrounding the definition of _IO_fwide_maybe_incompatible
> can collapse down to a single SHLIB_COMPAT check.  I also took the
> opportunity to add some checks for configuration botches to libio.h.
> 
> Installed stripped libraries are unchanged by this patch.
> 
> The distinction between libio.h and libioP.h should be preserved as
> long as include/stdio.h needs to include libio.h, and that's entangled
> with _IO_MTSAFE_IO.  It might be feasible to merge iolibio.h into
> libioP.h at this point, but I'm not sure whether it's worth the trouble.

LGTM with a possible extra cleanups decribed below.

> 
>         * libio/bits/libio.h: Move back to libio/libio.h and adjust
>         multiple-include guard to match.
>         Merge contents of libio/bits/libio-ldbl.h and include/libio.h
>         into this file.
>         Remove preprocessor conditionals that are always true and/or
>         redundant to other preprocessor conditionals in the same nest.
>         Include shlib-compat.h unconditionally.
>         Error out if _LIBC is not defined, or if _ISOMAC is defined,
>         or if _IO_MTSAFE_IO is defined but _IO_lock_t_defined is not
>         defined after including stdio.h.
>         Use __BEGIN_DECLS/__END_DECLS.
> 
>         * libio/bits/libio-ldbl.h, include/bits/libio.h: Delete file.
>         * include/stdio.h, libio/iolibio.h, libio/libioP.h: Include
>         libio.h as <libio/libio.h> rather than as <bits/libio.h>.
> ---
>  include/bits/libio.h     | 45 -----------------------
>  include/stdio.h          |  2 +-
>  libio/bits/libio-ldbl.h  | 29 ---------------
>  libio/iolibio.h          |  2 +-
>  libio/{bits => }/libio.h | 96 ++++++++++++++++++++++++++++++++----------------
>  libio/libioP.h           |  2 +-
>  6 files changed, 67 insertions(+), 109 deletions(-)
>  delete mode 100644 include/bits/libio.h
>  delete mode 100644 libio/bits/libio-ldbl.h
>  rename libio/{bits => }/libio.h (87%)
> 
> diff --git a/include/bits/libio.h b/include/bits/libio.h
> deleted file mode 100644
> index 572395d5ffb..00000000000
> --- a/include/bits/libio.h
> +++ /dev/null
> @@ -1,45 +0,0 @@
> -#if !defined _ISOMAC && defined _IO_MTSAFE_IO
> -# include <stdio-lock.h>
> -#endif
> -#include <libio/bits/libio.h>
> -
> -#ifndef _ISOMAC
> -#ifndef _LIBC_LIBIO_H
> -#define _LIBC_LIBIO_H
> -
> -libc_hidden_proto (__overflow)
> -libc_hidden_proto (__underflow)
> -libc_hidden_proto (__uflow)
> -libc_hidden_proto (__woverflow)
> -libc_hidden_proto (__wunderflow)
> -libc_hidden_proto (__wuflow)
> -libc_hidden_proto (_IO_free_backup_area)
> -libc_hidden_proto (_IO_free_wbackup_area)
> -libc_hidden_proto (_IO_padn)
> -libc_hidden_proto (_IO_putc)
> -libc_hidden_proto (_IO_sgetn)
> -libc_hidden_proto (_IO_vfprintf)
> -libc_hidden_proto (_IO_vfscanf)
> -
> -#ifdef _IO_MTSAFE_IO
> -# undef _IO_peekc
> -# undef _IO_flockfile
> -# undef _IO_funlockfile
> -# undef _IO_ftrylockfile
> -
> -# define _IO_peekc(_fp) _IO_peekc_locked (_fp)
> -# if _IO_lock_inexpensive
> -#  define _IO_flockfile(_fp) \
> -  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_lock (*(_fp)->_lock)
> -#  define _IO_funlockfile(_fp) \
> -  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_unlock (*(_fp)->_lock)
> -# else
> -#  define _IO_flockfile(_fp) \
> -  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_flockfile (_fp)
> -#  define _IO_funlockfile(_fp) \
> -  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_funlockfile (_fp)
> -# endif
> -#endif /* _IO_MTSAFE_IO */
> -
> -#endif
> -#endif

Ok.

> diff --git a/include/stdio.h b/include/stdio.h
> index 3b6da17d82f..f12b281b4d6 100644
> --- a/include/stdio.h
> +++ b/include/stdio.h
> @@ -5,7 +5,7 @@
>  # include <libio/stdio.h>
>  # ifndef _ISOMAC
>  #  define _LIBC_STDIO_H 1
> -#  include <bits/libio.h>
> +#  include <libio/libio.h>
>  
>  /* Now define the internal interfaces.  */
>  

Ok.

> diff --git a/libio/bits/libio-ldbl.h b/libio/bits/libio-ldbl.h
> deleted file mode 100644
> index aa39353ca50..00000000000
> --- a/libio/bits/libio-ldbl.h
> +++ /dev/null
> @@ -1,29 +0,0 @@
> -/* -mlong-double-64 compatibility mode for libio functions.
> -   Copyright (C) 2006-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 _BITS_LIBIO_LDBL_H
> -#define _BITS_LIBIO_LDBL_H 1
> -
> -#ifndef _BITS_LIBIO_H
> -# error "Never include <bits/libio-ldbl.h> directly; use <libio.h> instead."
> -#endif
> -
> -__LDBL_REDIR_DECL (_IO_vfscanf)
> -__LDBL_REDIR_DECL (_IO_vfprintf)
> -
> -#endif

Ok.

> diff --git a/libio/iolibio.h b/libio/iolibio.h
> index 7814b1d4e56..52731b65f91 100644
> --- a/libio/iolibio.h
> +++ b/libio/iolibio.h
> @@ -2,7 +2,7 @@
>  #define _IOLIBIO_H 1
>  
>  #include <stdio.h>
> -#include <bits/libio.h>
> +#include <libio/libio.h>
>  
>  /* These emulate stdio functionality, but with a different name
>     (_IO_ungetc instead of ungetc), and using _IO_FILE instead of FILE. */

Ok.

> diff --git a/libio/bits/libio.h b/libio/libio.h
> similarity index 87%
> rename from libio/bits/libio.h
> rename to libio/libio.h
> index cefc2c855b9..ff67e18c182 100644
> --- a/libio/bits/libio.h
> +++ b/libio/libio.h
> @@ -25,11 +25,22 @@
>     This exception applies to code released by its copyright holders
>     in files containing the exception.  */
>  
> -#ifndef _BITS_LIBIO_H
> -#define _BITS_LIBIO_H 1
> +#ifndef _LIBIO_H
> +#define _LIBIO_H 1
> +
> +#ifndef _LIBC
> +# error "libio.h should only be included when building glibc itself"
> +#endif
> +#ifdef _ISOMAC
> +# error "libio.h should not be included under _ISOMAC"
> +#endif

Ok.

>  
>  #include <stdio.h>
>  
> +#if defined _IO_MTSAFE_IO && !defined _IO_lock_t_defined
> +# error "Someone forgot to include stdio-lock.h"
> +#endif
> +
>  #include <bits/_G_config.h>
>  /* ALL of these should be defined in _G_config.h */
>  #define _IO_fpos_t __fpos_t
> @@ -46,6 +57,10 @@
>  #define _IO_wint_t wint_t
>  #define _IO_va_list __gnuc_va_list
>  
> +#include <shlib-compat.h>
> +
> +__BEGIN_DECLS
> +
>  /* compatibility defines */
>  #define _STDIO_USES_IOSTREAM
>  #define _IO_UNIFIED_JUMPTABLES 1
> @@ -143,7 +158,6 @@ enum __codecvt_result
>    __codecvt_noconv
>  };
>  
> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
>  /* The order of the elements in the following struct must match the order
>     of the virtual functions in the libstdc++ codecvt class.  */
>  struct _IO_codecvt
> @@ -198,7 +212,6 @@ struct _IO_wide_data
>  
>    const struct _IO_jump_t *_wide_vtable;
>  };
> -#endif
>  
>  
>  #ifndef __cplusplus
> @@ -236,17 +249,10 @@ extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write,
>  			     void *__cookie, _IO_cookie_io_functions_t __fns);
>  #endif
>  
> -
> -#ifdef __cplusplus
> -extern "C" {
> -#endif

I think you can cleanup the __cplusplus guards for _IO_FILE as well.

> -
>  extern int __underflow (_IO_FILE *);
> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
>  extern _IO_wint_t __wunderflow (_IO_FILE *);
>  extern _IO_wint_t __wuflow (_IO_FILE *);
>  extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t);
> -#endif
>  
>  #if  __GNUC__ >= 3
>  # define _IO_BE(expr, res) __builtin_expect ((expr), res)
> @@ -261,7 +267,6 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t);
>  	: *(unsigned char *) (_fp)->_IO_read_ptr)
>  #define _IO_putc_unlocked(_ch, _fp) __putc_unlocked_body (_ch, _fp)
>  
> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
>  # define _IO_getwc_unlocked(_fp) \
>    (_IO_BE ((_fp)->_wide_data == NULL					\
>  	   || ((_fp)->_wide_data->_IO_read_ptr				\
> @@ -273,7 +278,6 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t);
>  	       >= (_fp)->_wide_data->_IO_write_end), 0)			\
>     ? __woverflow (_fp, _wch)						\
>     : (_IO_wint_t) (*(_fp)->_wide_data->_IO_write_ptr++ = (_wch)))
> -#endif
>  
>  #define _IO_feof_unlocked(_fp) __feof_unlocked_body (_fp)
>  #define _IO_ferror_unlocked(_fp) __ferror_unlocked_body (_fp)
> @@ -319,28 +323,25 @@ extern _IO_off64_t _IO_seekpos (_IO_FILE *, _IO_off64_t, int);
>  
>  extern void _IO_free_backup_area (_IO_FILE *) __THROW;
>  
> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
> +
>  extern _IO_wint_t _IO_getwc (_IO_FILE *__fp);
>  extern _IO_wint_t _IO_putwc (wchar_t __wc, _IO_FILE *__fp);
>  extern int _IO_fwide (_IO_FILE *__fp, int __mode) __THROW;
> -# if __GNUC__ >= 2
> +
>  /* While compiling glibc we have to handle compatibility with very old
>     versions.  */
> -#  if defined _LIBC && defined SHARED
> -#   include <shlib-compat.h>
> -#   if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> -#    define _IO_fwide_maybe_incompatible \
> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> +#  define _IO_fwide_maybe_incompatible \
>    (__builtin_expect (&_IO_stdin_used == NULL, 0))
>  extern const int _IO_stdin_used;
>  weak_extern (_IO_stdin_used);
> -#   endif
> -#  endif
> -#  ifndef _IO_fwide_maybe_incompatible
> -#   define _IO_fwide_maybe_incompatible (0)
> -#  endif
> +#else
> +# define _IO_fwide_maybe_incompatible (0)
> +#endif
> +
>  /* A special optimized version of the function above.  It optimizes the
>     case of initializing an unoriented byte stream.  */
> -#  define _IO_fwide(__fp, __mode) \
> +#define _IO_fwide(__fp, __mode) \
>    ({ int __result = (__mode);						      \
>       if (__result < 0 && ! _IO_fwide_maybe_incompatible)		      \
>         {								      \
> @@ -354,7 +355,6 @@ weak_extern (_IO_stdin_used);
>       else								      \
>         __result = _IO_fwide (__fp, __result);				      \
>       __result; })
> -# endif
>  
>  extern int _IO_vfwscanf (_IO_FILE * __restrict, const wchar_t * __restrict,
>  			 _IO_va_list, int *__restrict);
> @@ -362,14 +362,46 @@ extern int _IO_vfwprintf (_IO_FILE *__restrict, const wchar_t *__restrict,
>  			  _IO_va_list);
>  extern _IO_ssize_t _IO_wpadn (_IO_FILE *, wint_t, _IO_ssize_t);
>  extern void _IO_free_wbackup_area (_IO_FILE *) __THROW;
> -#endif
>  
>  #ifdef __LDBL_COMPAT
> -# include <bits/libio-ldbl.h>
> +__LDBL_REDIR_DECL (_IO_vfscanf)
> +__LDBL_REDIR_DECL (_IO_vfprintf)
>  #endif
>  
> -#ifdef __cplusplus
> -}
> -#endif
> +libc_hidden_proto (__overflow)
> +libc_hidden_proto (__underflow)
> +libc_hidden_proto (__uflow)
> +libc_hidden_proto (__woverflow)
> +libc_hidden_proto (__wunderflow)
> +libc_hidden_proto (__wuflow)
> +libc_hidden_proto (_IO_free_backup_area)
> +libc_hidden_proto (_IO_free_wbackup_area)
> +libc_hidden_proto (_IO_padn)
> +libc_hidden_proto (_IO_putc)
> +libc_hidden_proto (_IO_sgetn)
> +libc_hidden_proto (_IO_vfprintf)
> +libc_hidden_proto (_IO_vfscanf)
> +
> +#ifdef _IO_MTSAFE_IO
> +# undef _IO_peekc
> +# undef _IO_flockfile
> +# undef _IO_funlockfile
> +# undef _IO_ftrylockfile
> +
> +# define _IO_peekc(_fp) _IO_peekc_locked (_fp)
> +# if _IO_lock_inexpensive
> +#  define _IO_flockfile(_fp) \
> +  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_lock (*(_fp)->_lock)
> +#  define _IO_funlockfile(_fp) \
> +  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_lock_unlock (*(_fp)->_lock)
> +# else
> +#  define _IO_flockfile(_fp) \
> +  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_flockfile (_fp)
> +#  define _IO_funlockfile(_fp) \
> +  if (((_fp)->_flags & _IO_USER_LOCK) == 0) _IO_funlockfile (_fp)
> +# endif
> +#endif /* _IO_MTSAFE_IO */
> +
> +__END_DECLS
>  
> -#endif /* _BITS_LIBIO_H */
> +#endif /* _LIBIO_H */

As a side note, I think we can cleanup some definitions required to build it
externally:

271 #if  __GNUC__ >= 3
272 # define _IO_BE(expr, res) __builtin_expect ((expr), res)
273 #else
274 # define _IO_BE(expr, res) (expr)
275 #endif

And just use __glibc_{un}likely instead.

Similar for:

122 #ifdef _LIBC
123 # define _IO_FLAGS2_FORTIFY 4
124 #endif
125 #define _IO_FLAGS2_USER_WBUF 8
126 #ifdef _LIBC
127 # define _IO_FLAGS2_SCANF_STD 16
128 # define _IO_FLAGS2_NOCLOSE 32
129 # define _IO_FLAGS2_CLOEXEC 64
130 # define _IO_FLAGS2_NEED_LOCK 128
131 #endif

and

240 #ifndef _LIBC
241 #define _IO_stdin ((_IO_FILE*)(&_IO_2_1_stdin_))
242 #define _IO_stdout ((_IO_FILE*)(&_IO_2_1_stdout_))
243 #define _IO_stderr ((_IO_FILE*)(&_IO_2_1_stderr_))
244 #else
245 extern _IO_FILE *_IO_stdin attribute_hidden;
246 extern _IO_FILE *_IO_stdout attribute_hidden;
247 extern _IO_FILE *_IO_stderr attribute_hidden;
248 #endif

Since there is already a guard for _LIBC definition.

Also:

252 #ifdef __USE_GNU
253 typedef cookie_read_function_t __io_read_fn;
254 typedef cookie_write_function_t __io_write_fn;
255 typedef cookie_seek_function_t __io_seek_fn;
256 typedef cookie_close_function_t __io_close_fn;
257 typedef cookie_io_functions_t _IO_cookie_io_functions_t;
258 
259 struct _IO_cookie_file;
260 
261 /* Initialize one of those.  */
262 extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write,
263                              void *__cookie, _IO_cookie_io_functions_t __fns);
264 #endif

Since for glibc build __USE_GNU is implicit.

> diff --git a/libio/libioP.h b/libio/libioP.h
> index ac66f95f8d4..8edc207277e 100644
> --- a/libio/libioP.h
> +++ b/libio/libioP.h
> @@ -43,7 +43,7 @@
>  #include <math_ldbl_opt.h>
>  
>  #include <stdio.h>
> -#include <bits/libio.h>
> +#include <libio/libio.h>
>  #include "iolibio.h"
>  
>  #ifdef __cplusplus
> 

Ok.


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

* Re: [PATCH v2 5/5] Post-cleanup 2: minimize _G_config.h.
  2018-02-05 23:35 ` [PATCH v2 5/5] Post-cleanup 2: minimize _G_config.h Zack Weinberg
@ 2018-02-06 19:06   ` Adhemerval Zanella
  2018-02-06 20:17     ` Zack Weinberg
  0 siblings, 1 reply; 21+ messages in thread
From: Adhemerval Zanella @ 2018-02-06 19:06 UTC (permalink / raw
  To: libc-alpha



On 05/02/2018 21:35, Zack Weinberg wrote:
> Nearly everything in _G_config.h is either junk or more appropriately
> defined elsewhere:
> 
>  * _G_fpos_t, _G_fpos64_t, and _G_BUFSIZ are already completely unused.
>  * All remaining uses of _G_va_list have been changed to __gnuc_va_list.
>  * The definition of _G_HAVE_ST_BLKSIZE/_IO_HAVE_ST_BLKSIZE has
>    been inlined into its sole use.
>  * The complete definition of _G_iconv_t has been moved to libio.h and
>    renamed _IO_iconv_t (all actual users used that name).
>  * _G_IO_IO_FILE_VERSION is vestigial; some code cares whether
>    _IO_stdin_used exists, but nothing looks at its value.  I've
>    preserved the value as a hardwired constant in csu/init.c.
>    This means csu/init.c no longer needs to include anything.
>  * Many of the headers included by _G_config.h were already being
>    included directly by either either libio.h or stdio.h; the
>    remaining ones were moved to libio.h.
>  * _G_HAVE_MREMAP is still relevant, because mremap genuinely is a
>    Linux extension; it's not in POSIX and as far as I can tell it's
>    not available on the Hurd either.  I also preserved _G_HAVE_MMAP,
>    since it's conceivable someone would want to port glibc to a
>    MMU-less, mmap-less environment in the future.  Both are now always
>    defined to 1/0 as is the current convention, instead of the older
>    1/undef convention.  These are the only symbols still defined in
>    _G_config.h.
>  * The actual inclusion of _G_config.h moves from libio.h to libioP.h,
>    as this is where a potential override of _G_HAVE_MMAP happens.
>  * The #ifdef logic in libioP.h controlling _IO_JUMPS_OFFSET has been
>    simplified.
> 
> After this patch, the only surviving _G_ symbols are the struct tag
> names _G_fpos_t and _G_fpos64_t, which are preserved for the sake of
> C++ mangled names in applications, and _G_HAVE_MMAP and _G_HAVE_MREMAP,
> which do not seem worth renaming.
> 
> Installed stripped libraries are unchanged by this patch.

LGTM in general with just _IO_HAVE_ST_BLKSIZE suggestion below.

> 
> 	* bits/_G_config.h: Move back to sysdeps/generic/_G_config.h.
> 	Delete all contents except for definitions of _G_HAVE_MMAP and
> 	_G_HAVE_MREMAP.  Add commentary explaining those two symbols.
> 	* sysdeps/unix/sysv/linux/bits/_G_config.h: Move back to
> 	sysdeps/unix/sysv/linux/_G_config.h.  Make same content
> 	change as above.
> 
> 	* libio/libio.h: Don't include bits/_G_config.h here.
> 	Include stddef.h with __need_wchar_t defined.  Include
> 	bits/types/__mbstate_t.h, bits/types/wint_t.h, and gconv.h.
> 	Define _IO_iconv_t here, directly.
> 	Don't define _IO_HAVE_ST_BLKSIZE.
> 	* libio/libioP.h: Include _G_config.h here.  Move include of
> 	shlib-compat.h up with rest of includes.  Simplify conditionals
> 	controlling definition of _IO_JUMPS_OFFSET.
> 
> 	* csu/init.c: Remove always-true #if around entire file.
> 	Don't include stdio.h.  Set _IO_stdin_used to hardwired
> 	constant 0x20001, and update commentary.
> 	* include/stdio.h, sysdeps/ieee754/ldbl-opt/nldbl-compat.h:
> 	Replace all uses of _G_va_list with __gnuc_va_list.
> 	* libio/filedoalloc.c: Use #if defined _STATBUF_ST_BLKSIZE
> 	instead of #if _IO_HAVE_ST_BLKSIZE.
> 	* libio/fileops.c: Test _G_HAVE_MREMAP with #if, not #ifdef.
> 	* libio/iofdopen.c, libio/iofopen.c: Test _G_HAVE_MMAP with #if,
> 	not #ifdef.
> ---
>  bits/_G_config.h                         | 54 -------------------------------
>  csu/init.c                               | 13 +++-----
>  include/stdio.h                          | 28 ++++++++--------
>  libio/filedoalloc.c                      |  2 +-
>  libio/fileops.c                          |  2 +-
>  libio/iofdopen.c                         |  4 +--
>  libio/iofopen.c                          |  2 +-
>  libio/libio.h                            | 22 ++++++++++---
>  libio/libioP.h                           | 20 ++++++------
>  sysdeps/generic/_G_config.h              | 15 +++++++++
>  sysdeps/ieee754/ldbl-opt/nldbl-compat.h  | 13 ++++----
>  sysdeps/unix/sysv/linux/_G_config.h      | 15 +++++++++
>  sysdeps/unix/sysv/linux/bits/_G_config.h | 55 --------------------------------
>  13 files changed, 89 insertions(+), 156 deletions(-)
>  delete mode 100644 bits/_G_config.h
>  create mode 100644 sysdeps/generic/_G_config.h
>  create mode 100644 sysdeps/unix/sysv/linux/_G_config.h
>  delete mode 100644 sysdeps/unix/sysv/linux/bits/_G_config.h
> 
> diff --git a/bits/_G_config.h b/bits/_G_config.h
> deleted file mode 100644
> index 8c81bc42787..00000000000
> --- a/bits/_G_config.h
> +++ /dev/null
> @@ -1,54 +0,0 @@
> -/* This file is needed by libio to define various configuration parameters.
> -   These are always the same in the GNU C library.  */
> -
> -#ifndef _BITS_G_CONFIG_H
> -#define _BITS_G_CONFIG_H 1
> -
> -/* Define types for libio in terms of the standard internal type names.  */
> -
> -#include <bits/types.h>
> -#define __need_size_t
> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
> -# define __need_wchar_t
> -#endif
> -#define __need_NULL
> -#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
> -
> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
> -# include <gconv.h>
> -typedef union
> -{
> -  struct __gconv_info __cd;
> -  struct
> -  {
> -    struct __gconv_info __cd;
> -    struct __gconv_step_data __data;
> -  } __combined;
> -} _G_iconv_t;
> -#endif
> -
> -
> -/* These library features are always available in the GNU C library.  */
> -#define _G_va_list __gnuc_va_list
> -
> -#define _G_HAVE_MMAP 1
> -
> -#define _G_IO_IO_FILE_VERSION 0x20001
> -
> -/* This is defined by <bits/stat.h> if `st_blksize' exists.  */
> -#define _G_HAVE_ST_BLKSIZE defined (_STATBUF_ST_BLKSIZE)
> -
> -#define _G_BUFSIZ 8192
> -
> -#endif	/* bits/_G_config.h */

Ok.

> diff --git a/csu/init.c b/csu/init.c
> index 178063b44bf..c2f978f3da5 100644
> --- a/csu/init.c
> +++ b/csu/init.c
> @@ -16,11 +16,8 @@
>     License along with the GNU C Library; if not, see
>     <http://www.gnu.org/licenses/>.  */
>  
> -#if defined __GNUC__ && __GNUC__ >= 2
> -
> -#include <stdio.h>
> -
> -/* This records which stdio is linked against in the application. */
> -const int _IO_stdin_used = _G_IO_IO_FILE_VERSION;
> -
> -#endif
> +/* Vestigial libio version number.  Some code in libio checks whether
> +   this symbol exists in the executable, but nothing looks at its
> +   value anymore; the value it was historically set to has been
> +   preserved out of an abundance of caution.  */
> +const int _IO_stdin_used = 0x20001;

Ok.

> diff --git a/include/stdio.h b/include/stdio.h
> index f12b281b4d6..94bc2fdc7ef 100644
> --- a/include/stdio.h
> +++ b/include/stdio.h
> @@ -15,44 +15,44 @@ extern int __snprintf (char *__restrict __s, size_t __maxlen,
>       __attribute__ ((__format__ (__printf__, 3, 4)));
>  libc_hidden_proto (__snprintf)
>  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)
>       __attribute__ ((__format__ (__printf__, 3, 0)));
>  extern int __vfscanf (FILE *__restrict __s,
>  		      const char *__restrict __format,
> -		      _G_va_list __arg)
> +		      __gnuc_va_list __arg)
>       __attribute__ ((__format__ (__scanf__, 2, 0)));
>  libc_hidden_proto (__vfscanf)
>  extern int __vscanf (const char *__restrict __format,
> -		     _G_va_list __arg)
> +		     __gnuc_va_list __arg)
>       __attribute__ ((__format__ (__scanf__, 1, 0)));
>  extern _IO_ssize_t __getline (char **__lineptr, size_t *__n,
>  			      FILE *__stream) attribute_hidden;
>  extern int __vsscanf (const char *__restrict __s,
>  		      const char *__restrict __format,
> -		      _G_va_list __arg)
> +		      __gnuc_va_list __arg)
>       __attribute__ ((__format__ (__scanf__, 2, 0)));
>  
>  extern int __sprintf_chk (char *, int, size_t, const char *, ...) __THROW;
>  extern int __snprintf_chk (char *, size_t, int, size_t, const char *, ...)
>       __THROW;
>  extern int __vsprintf_chk (char *, int, size_t, const char *,
> -			   _G_va_list) __THROW;
> +			   __gnuc_va_list) __THROW;
>  extern int __vsnprintf_chk (char *, size_t, int, size_t, const char *,
> -			    _G_va_list) __THROW;
> +			    __gnuc_va_list) __THROW;
>  extern int __printf_chk (int, const char *, ...);
>  extern int __fprintf_chk (FILE *, int, const char *, ...);
> -extern int __vprintf_chk (int, const char *, _G_va_list);
> -extern int __vfprintf_chk (FILE *, int, const char *, _G_va_list);
> +extern int __vprintf_chk (int, const char *, __gnuc_va_list);
> +extern int __vfprintf_chk (FILE *, int, const char *, __gnuc_va_list);
>  extern char *__fgets_unlocked_chk (char *buf, size_t size, int n, FILE *fp);
>  extern char *__fgets_chk (char *buf, size_t size, int n, FILE *fp);
>  extern int __asprintf_chk (char **, int, const char *, ...) __THROW;
> -extern int __vasprintf_chk (char **, int, const char *, _G_va_list) __THROW;
> +extern int __vasprintf_chk (char **, int, const char *, __gnuc_va_list) __THROW;
>  extern int __dprintf_chk (int, int, const char *, ...);
> -extern int __vdprintf_chk (int, int, const char *, _G_va_list);
> +extern int __vdprintf_chk (int, int, const char *, __gnuc_va_list);
>  extern int __obstack_printf_chk (struct obstack *, int, const char *, ...)
>       __THROW;
>  extern int __obstack_vprintf_chk (struct obstack *, int, const char *,
> -				  _G_va_list) __THROW;
> +				  __gnuc_va_list) __THROW;
>  
>  extern int __isoc99_fscanf (FILE *__restrict __stream,
>  			    const char *__restrict __format, ...) __wur;
> @@ -61,12 +61,12 @@ extern int __isoc99_sscanf (const char *__restrict __s,
>  			    const char *__restrict __format, ...) __THROW;
>  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;
>  libc_hidden_proto (__isoc99_vsscanf)
>  libc_hidden_proto (__isoc99_vfscanf)
>  

Ok.

> diff --git a/libio/filedoalloc.c b/libio/filedoalloc.c
> index 329843827f5..d6517e493b0 100644
> --- a/libio/filedoalloc.c
> +++ b/libio/filedoalloc.c
> @@ -93,7 +93,7 @@ _IO_file_doallocate (_IO_FILE *fp)
>  	      local_isatty (fp->_fileno))
>  	    fp->_flags |= _IO_LINE_BUF;
>  	}
> -#if _IO_HAVE_ST_BLKSIZE
> +#if defined _STATBUF_ST_BLKSIZE
>        if (st.st_blksize > 0 && st.st_blksize < _IO_BUFSIZ)
>  	size = st.st_blksize;
>  #endif

I think it is more logical to have _IO_HAVE_ST_BLKSIZE defined as 0 on generic
bits/stat.h and 1 for Linux bits/stat.h (which is also the way to we are aiming
to handle these kind of macros).

> diff --git a/libio/fileops.c b/libio/fileops.c
> index 6d5393cea3f..5fd8a9647f2 100644
> --- a/libio/fileops.c
> +++ b/libio/fileops.c
> @@ -582,7 +582,7 @@ mmap_remap_check (_IO_FILE *fp)
>  	{
>  	  /* The file added some pages.  We need to remap it.  */
>  	  void *p;
> -#ifdef _G_HAVE_MREMAP
> +#if _G_HAVE_MREMAP
>  	  p = __mremap (fp->_IO_buf_base, ROUNDED (fp->_IO_buf_end
>  						   - fp->_IO_buf_base),
>  			ROUNDED (st.st_size), MREMAP_MAYMOVE);

Ok.

> diff --git a/libio/iofdopen.c b/libio/iofdopen.c
> index 3546d52b4da..b6f1500dee4 100644
> --- a/libio/iofdopen.c
> +++ b/libio/iofdopen.c
> @@ -126,13 +126,13 @@ _IO_new_fdopen (int fd, const char *mode)
>    new_f->fp.file._lock = &new_f->lock;
>  #endif
>    _IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd,
> -#ifdef _G_HAVE_MMAP
> +#if _G_HAVE_MMAP
>  	       (use_mmap && (read_write & _IO_NO_WRITES))
>  	       ? &_IO_wfile_jumps_maybe_mmap :
>  #endif
>  	       &_IO_wfile_jumps);
>    _IO_JUMPS (&new_f->fp) =
> -#ifdef _G_HAVE_MMAP
> +#if _G_HAVE_MMAP
>      (use_mmap && (read_write & _IO_NO_WRITES)) ? &_IO_file_jumps_maybe_mmap :
>  #endif
>        &_IO_file_jumps;

Ok.

> diff --git a/libio/iofopen.c b/libio/iofopen.c
> index d6f59497b42..2ea82e20917 100644
> --- a/libio/iofopen.c
> +++ b/libio/iofopen.c
> @@ -33,7 +33,7 @@
>  _IO_FILE *
>  __fopen_maybe_mmap (_IO_FILE *fp)
>  {
> -#ifdef _G_HAVE_MMAP
> +#if _G_HAVE_MMAP
>    if ((fp->_flags2 & _IO_FLAGS2_MMAP) && (fp->_flags & _IO_NO_WRITES))
>      {
>        /* Since this is read-only, we might be able to mmap the contents

Ok.

> diff --git a/libio/libio.h b/libio/libio.h
> index ff67e18c182..09531202472 100644
> --- a/libio/libio.h
> +++ b/libio/libio.h
> @@ -41,8 +41,24 @@
>  # error "Someone forgot to include stdio-lock.h"
>  #endif
>  
> -#include <bits/_G_config.h>
> -/* ALL of these should be defined in _G_config.h */
> +#define __need_wchar_t
> +#include <stddef.h>
> +
> +#include <bits/types/__mbstate_t.h>
> +#include <bits/types/wint_t.h>
> +#include <gconv.h>
> +
> +typedef union
> +{
> +  struct __gconv_info __cd;
> +  struct
> +  {
> +    struct __gconv_info __cd;
> +    struct __gconv_step_data __data;
> +  } __combined;
> +} _IO_iconv_t;
> +
> +/* Map the names used in libio to the names used in libc generally.  */
>  #define _IO_fpos_t __fpos_t
>  #define _IO_fpos64_t __fpos64_t
>  #define _IO_size_t size_t

Ok.

> @@ -51,8 +67,6 @@
>  #define _IO_off64_t __off64_t
>  #define _IO_pid_t __pid_t
>  #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 BUFSIZ
>  #define _IO_wint_t wint_t
>  #define _IO_va_list __gnuc_va_list

Ok.

> diff --git a/libio/libioP.h b/libio/libioP.h
> index 8edc207277e..58cc9de094b 100644
> --- a/libio/libioP.h
> +++ b/libio/libioP.h
> @@ -46,6 +46,12 @@
>  #include <libio/libio.h>
>  #include "iolibio.h"
>  
> +#include <shlib-compat.h>
> +
> +/* For historical reasons this is the name of the sysdeps header that
> +   adjusts the libio configuration.  */
> +#include <_G_config.h>
> +
>  #ifdef __cplusplus
>  extern "C" {
>  #endif
> @@ -75,16 +81,10 @@ extern "C" {
>   * object being acted on (i.e. the 'this' parameter).
>   */
>  
> -#include <shlib-compat.h>
> -#if !SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> -  /* Setting this macro disables the use of the _vtable_offset bias in
> -     _IO_JUMPS_FUNCS, below.  That is only needed if we want to
> -     support old binaries (see oldfileops.c).  */
> -# define _G_IO_NO_BACKWARD_COMPAT 1
> -#endif
> -
> -#if (!defined _IO_USE_OLD_IO_FILE \
> -     && (!defined _G_IO_NO_BACKWARD_COMPAT || _G_IO_NO_BACKWARD_COMPAT == 0))
> +/* Setting this macro to 1 enables the use of the _vtable_offset bias
> +   in _IO_JUMPS_FUNCS, below.  This is only needed for new-format
> +   _IO_FILE in libc that must support old binaries (see oldfileops.c).  */
> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) && !defined _IO_USE_OLD_IO_FILE
>  # define _IO_JUMPS_OFFSET 1
>  #else
>  # define _IO_JUMPS_OFFSET 0

Ok, this was indeed a convoluted check (I had to write it down to realize
_G_IO_NO_BACKWARD_COMPAT here is superflous).

> diff --git a/sysdeps/generic/_G_config.h b/sysdeps/generic/_G_config.h
> new file mode 100644
> index 00000000000..7c917bf64c4
> --- /dev/null
> +++ b/sysdeps/generic/_G_config.h
> @@ -0,0 +1,15 @@
> +/* Configuration parameters for stdio - generic version.  */
> +
> +#ifndef __G_CONFIG_H
> +#define __G_CONFIG_H 1
> +
> +/* Define to 1 if the operating system supports mmap, 0 otherwise.
> +   This function is required by POSIX but might still be unavailable,
> +   for instance when the hardware lacks support for virtual memory.  */
> +#define _G_HAVE_MMAP 1
> +
> +/* Define to 1 if the operating system supports mremap, 0 otherwise.
> +   This function is currently a Linux-specific extension.  */
> +#define _G_HAVE_MREMAP 0
> +
> +#endif	/* _G_config.h */

Ok.

> diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
> index 3b3ef731a6d..d61fbb2f649 100644
> --- a/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
> +++ b/sysdeps/ieee754/ldbl-opt/nldbl-compat.h
> @@ -82,22 +82,23 @@ extern ssize_t __nldbl___vstrfmon (char *, size_t, const char *, va_list)
>  /* These don't use __typeof because they were not declared by the headers,
>     since we don't compile with _FORTIFY_SOURCE.  */
>  extern int __nldbl___vfprintf_chk (FILE *__restrict, int,
> -				   const char *__restrict, _G_va_list);
> +				   const char *__restrict, __gnuc_va_list);
>  extern int __nldbl___vfwprintf_chk (FILE *__restrict, int,
>  				    const wchar_t *__restrict, __gnuc_va_list);
>  extern int __nldbl___vsprintf_chk (char *__restrict, int, size_t,
> -				   const char *__restrict, _G_va_list) __THROW;
> +				   const char *__restrict, __gnuc_va_list)
> +  __THROW;
>  extern int __nldbl___vsnprintf_chk (char *__restrict, size_t, int, size_t,
> -				    const char *__restrict, _G_va_list)
> +				    const char *__restrict, __gnuc_va_list)
>    __THROW;
>  extern int __nldbl___vswprintf_chk (wchar_t *__restrict, size_t, int, size_t,
>  				    const wchar_t *__restrict, __gnuc_va_list)
>    __THROW;
> -extern int __nldbl___vasprintf_chk (char **, int, const char *, _G_va_list)
> +extern int __nldbl___vasprintf_chk (char **, int, const char *, __gnuc_va_list)
>    __THROW;
> -extern int __nldbl___vdprintf_chk (int, int, const char *, _G_va_list);
> +extern int __nldbl___vdprintf_chk (int, int, const char *, __gnuc_va_list);
>  extern int __nldbl___obstack_vprintf_chk (struct obstack *, int, const char *,
> -					  _G_va_list) __THROW;
> +					  __gnuc_va_list) __THROW;
>  extern void __nldbl___vsyslog_chk (int, int, const char *, va_list);
>  
>  

Ok.

> diff --git a/sysdeps/unix/sysv/linux/_G_config.h b/sysdeps/unix/sysv/linux/_G_config.h
> new file mode 100644
> index 00000000000..04137164816
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/_G_config.h
> @@ -0,0 +1,15 @@
> +/* Configuration parameters for stdio - Linux version.  */
> +
> +#ifndef __G_CONFIG_H
> +#define __G_CONFIG_H 1
> +
> +/* Define to 1 if the operating system supports mmap, 0 otherwise.
> +   This function is required by POSIX but might still be unavailable,
> +   for instance when the hardware lacks support for virtual memory.  */
> +#define _G_HAVE_MMAP 1
> +
> +/* Define to 1 if the operating system supports mremap, 0 otherwise.
> +   This function is currently a Linux-specific extension.  */
> +#define _G_HAVE_MREMAP 1
> +
> +#endif	/* bits/_G_config.h */

Ok.

> diff --git a/sysdeps/unix/sysv/linux/bits/_G_config.h b/sysdeps/unix/sysv/linux/bits/_G_config.h
> deleted file mode 100644
> index 05a64acb2cf..00000000000
> --- a/sysdeps/unix/sysv/linux/bits/_G_config.h
> +++ /dev/null
> @@ -1,55 +0,0 @@
> -/* This file is needed by libio to define various configuration parameters.
> -   These are always the same in the GNU C library.  */
> -
> -#ifndef _BITS_G_CONFIG_H
> -#define _BITS_G_CONFIG_H 1
> -
> -/* Define types for libio in terms of the standard internal type names.  */
> -
> -#include <bits/types.h>
> -#define __need_size_t
> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
> -# define __need_wchar_t
> -#endif
> -#define __need_NULL
> -#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
> -
> -#if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
> -# include <gconv.h>
> -typedef union
> -{
> -  struct __gconv_info __cd;
> -  struct
> -  {
> -    struct __gconv_info __cd;
> -    struct __gconv_step_data __data;
> -  } __combined;
> -} _G_iconv_t;
> -#endif
> -
> -
> -/* These library features are always available in the GNU C library.  */
> -#define _G_va_list __gnuc_va_list
> -
> -#define _G_HAVE_MMAP 1
> -#define _G_HAVE_MREMAP 1
> -
> -#define _G_IO_IO_FILE_VERSION 0x20001
> -
> -/* This is defined by <bits/stat.h> if `st_blksize' exists.  */
> -#define _G_HAVE_ST_BLKSIZE defined (_STATBUF_ST_BLKSIZE)
> -
> -#define _G_BUFSIZ 8192
> -
> -#endif	/* bits/_G_config.h */

Ok.


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

* Fwd: [PATCH v2 3/5] Don't install libio.h or _G_config.h.
       [not found]     ` <CAKCAbMiGUH5cBcZQjdf_uHTbqPyTJhBR-o8zo6u+hd_WCA_4VQ@mail.gmail.com>
@ 2018-02-06 20:08       ` Zack Weinberg
  2018-02-06 20:30         ` Florian Weimer
  0 siblings, 1 reply; 21+ messages in thread
From: Zack Weinberg @ 2018-02-06 20:08 UTC (permalink / raw
  To: GNU C Library

[forwarding accidental off-list reply]

On Tue, Feb 6, 2018 at 8:50 AM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> On 05/02/2018 21:34, Zack Weinberg wrote:
>> In this patch, we stop installing libio.h and _G_config.h for public
>> use; necessarily, this means the public stdio.h stops including
>> libio.h.
>
> It looks good to me, with just a couple of nits below (which do not
> block the patch itself).

I can't promise to do any follow-up work anytime soon.

>> -#ifndef BUFSIZ
>> -# define BUFSIZ _IO_BUFSIZ
>> -#endif
>> +#define BUFSIZ 8192
>
> I think a possible subsqueuent cleanup is to remove _IO_BUFSIZE utilization
> within glibc as well.
>
>> +/* The value returned by fgetc and similar functions to indicate the
>> +   end of the file.  */
>> +#define EOF (-1)
>
> EOF is being define on both libio/libioP.h and libio/stdio.h. Shouldn't we
> cleanup the libioP.h one?

These are good suggestions for further cleanups but I'm not going to
fold them into this patchset.  I don't think there's any danger of
them getting forgotten about; whoever next looks at libio(P).h is
going to be looking for cleanups.

zw


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

* Re: [PATCH v2 4/5] Post-cleanup 1: move libio.h back out of bits/.
  2018-02-06 16:57   ` Adhemerval Zanella
@ 2018-02-06 20:10     ` Zack Weinberg
  2018-02-07 12:12       ` Adhemerval Zanella
  0 siblings, 1 reply; 21+ messages in thread
From: Zack Weinberg @ 2018-02-06 20:10 UTC (permalink / raw
  To: Adhemerval Zanella; +Cc: GNU C Library

On Tue, Feb 6, 2018 at 11:57 AM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> On 05/02/2018 21:34, Zack Weinberg wrote:
>> In this patch, libio.h moves back out of bits/ into the top level of
>> the libio subdirectory, and is merged with libio/bits/libio-ldbl.h
>> (which also used to be installed) and include/libio.h.  Since almost
>> no files include libio.h directly, this is quite straightforward.
>
> LGTM with a possible extra cleanups decribed below.
...
> I think you can cleanup the __cplusplus guards for _IO_FILE as well.
...
> As a side note, I think we can cleanup some definitions required to build it
> externally:

Certainly, but again, I don't want to add yet more stuff to this
patchset and I can't promise to do follow-up work in the near future.

zw


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

* Re: [PATCH v2 5/5] Post-cleanup 2: minimize _G_config.h.
  2018-02-06 19:06   ` Adhemerval Zanella
@ 2018-02-06 20:17     ` Zack Weinberg
  2018-02-07 12:14       ` Adhemerval Zanella
  0 siblings, 1 reply; 21+ messages in thread
From: Zack Weinberg @ 2018-02-06 20:17 UTC (permalink / raw
  To: Adhemerval Zanella; +Cc: GNU C Library

On Tue, Feb 6, 2018 at 2:06 PM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> On 05/02/2018 21:35, Zack Weinberg wrote:
>> Nearly everything in _G_config.h is either junk or more appropriately
>> defined elsewhere:
...
>
> LGTM in general with just _IO_HAVE_ST_BLKSIZE suggestion below.
...
>> -#if _IO_HAVE_ST_BLKSIZE
>> +#if defined _STATBUF_ST_BLKSIZE
>>        if (st.st_blksize > 0 && st.st_blksize < _IO_BUFSIZ)
>>       size = st.st_blksize;
>>  #endif
>
> I think it is more logical to have _IO_HAVE_ST_BLKSIZE defined as 0
> on generic bits/stat.h and 1 for Linux bits/stat.h (which is also
> the way to we are aiming to handle these kind of macros).

_STATBUF_ST_BLKSIZE, with #undef/1 semantics, has been part of our
sys/stat.h for a long time; it doesn't have a _lot_ of external users,
but it has a few (see
https://codesearch.debian.net/search?q=_STATBUF_ST_BLKSIZE). I am
reluctant to complicate this patchset by messing with it.  Is this a
hard objection?

>> +/* Setting this macro to 1 enables the use of the _vtable_offset bias
>> +   in _IO_JUMPS_FUNCS, below.  This is only needed for new-format
>> +   _IO_FILE in libc that must support old binaries (see oldfileops.c).  */
>
> Ok, this was indeed a convoluted check (I had to write it down to realize
> _G_IO_NO_BACKWARD_COMPAT here is superflous).

I want to thank Joseph for insisting on the "no changes to installed
stripped libraries" standard for this patchset; I got this change
wrong initially and I'm not sure I would have noticed that it was
wrong if I wasn't being suspicious of any change to the generated code.

zw


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

* Re: Fwd: [PATCH v2 3/5] Don't install libio.h or _G_config.h.
  2018-02-06 20:08       ` Fwd: " Zack Weinberg
@ 2018-02-06 20:30         ` Florian Weimer
  2018-02-07 12:11           ` Adhemerval Zanella
  0 siblings, 1 reply; 21+ messages in thread
From: Florian Weimer @ 2018-02-06 20:30 UTC (permalink / raw
  To: Zack Weinberg, GNU C Library

On 02/06/2018 09:08 PM, Zack Weinberg wrote:
> These are good suggestions for further cleanups but I'm not going to
> fold them into this patchset.  I don't think there's any danger of
> them getting forgotten about; whoever next looks at libio(P).h is
> going to be looking for cleanups.

I completely agree with this approach.

Thanks,
Florian


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

* Re: Fwd: [PATCH v2 3/5] Don't install libio.h or _G_config.h.
  2018-02-06 20:30         ` Florian Weimer
@ 2018-02-07 12:11           ` Adhemerval Zanella
  2018-02-07 15:16             ` Zack Weinberg
  0 siblings, 1 reply; 21+ messages in thread
From: Adhemerval Zanella @ 2018-02-07 12:11 UTC (permalink / raw
  To: libc-alpha



On 06/02/2018 18:30, Florian Weimer wrote:
> On 02/06/2018 09:08 PM, Zack Weinberg wrote:
>> These are good suggestions for further cleanups but I'm not going to
>> fold them into this patchset.  I don't think there's any danger of
>> them getting forgotten about; whoever next looks at libio(P).h is
>> going to be looking for cleanups.
> 
> I completely agree with this approach.

Fair enough.


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

* Re: [PATCH v2 4/5] Post-cleanup 1: move libio.h back out of bits/.
  2018-02-06 20:10     ` Zack Weinberg
@ 2018-02-07 12:12       ` Adhemerval Zanella
  2018-02-07 15:17         ` Zack Weinberg
  0 siblings, 1 reply; 21+ messages in thread
From: Adhemerval Zanella @ 2018-02-07 12:12 UTC (permalink / raw
  To: Zack Weinberg; +Cc: GNU C Library



On 06/02/2018 18:10, Zack Weinberg wrote:
> On Tue, Feb 6, 2018 at 11:57 AM, Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>> On 05/02/2018 21:34, Zack Weinberg wrote:
>>> In this patch, libio.h moves back out of bits/ into the top level of
>>> the libio subdirectory, and is merged with libio/bits/libio-ldbl.h
>>> (which also used to be installed) and include/libio.h.  Since almost
>>> no files include libio.h directly, this is quite straightforward.
>>
>> LGTM with a possible extra cleanups decribed below.
> ...
>> I think you can cleanup the __cplusplus guards for _IO_FILE as well.
> ...
>> As a side note, I think we can cleanup some definitions required to build it
>> externally:
> 
> Certainly, but again, I don't want to add yet more stuff to this
> patchset and I can't promise to do follow-up work in the near future.
> 
> zw
> 

Alright, I don't think these are blockers for the patch itself, but since
you are touching it (and there is a long time since someone work on this
code) I though you could check this out.


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

* Re: [PATCH v2 5/5] Post-cleanup 2: minimize _G_config.h.
  2018-02-06 20:17     ` Zack Weinberg
@ 2018-02-07 12:14       ` Adhemerval Zanella
  0 siblings, 0 replies; 21+ messages in thread
From: Adhemerval Zanella @ 2018-02-07 12:14 UTC (permalink / raw
  To: Zack Weinberg; +Cc: GNU C Library



On 06/02/2018 18:17, Zack Weinberg wrote:
> On Tue, Feb 6, 2018 at 2:06 PM, Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>> On 05/02/2018 21:35, Zack Weinberg wrote:
>>> Nearly everything in _G_config.h is either junk or more appropriately
>>> defined elsewhere:
> ...
>>
>> LGTM in general with just _IO_HAVE_ST_BLKSIZE suggestion below.
> ...
>>> -#if _IO_HAVE_ST_BLKSIZE
>>> +#if defined _STATBUF_ST_BLKSIZE
>>>        if (st.st_blksize > 0 && st.st_blksize < _IO_BUFSIZ)
>>>       size = st.st_blksize;
>>>  #endif
>>
>> I think it is more logical to have _IO_HAVE_ST_BLKSIZE defined as 0
>> on generic bits/stat.h and 1 for Linux bits/stat.h (which is also
>> the way to we are aiming to handle these kind of macros).
> 
> _STATBUF_ST_BLKSIZE, with #undef/1 semantics, has been part of our
> sys/stat.h for a long time; it doesn't have a _lot_ of external users,
> but it has a few (see
> https://codesearch.debian.net/search?q=_STATBUF_ST_BLKSIZE). I am
> reluctant to complicate this patchset by messing with it.  Is this a
> hard objection?

I do not think this is a patch blocker.

> 
>>> +/* Setting this macro to 1 enables the use of the _vtable_offset bias
>>> +   in _IO_JUMPS_FUNCS, below.  This is only needed for new-format
>>> +   _IO_FILE in libc that must support old binaries (see oldfileops.c).  */
>>
>> Ok, this was indeed a convoluted check (I had to write it down to realize
>> _G_IO_NO_BACKWARD_COMPAT here is superflous).
> 
> I want to thank Joseph for insisting on the "no changes to installed
> stripped libraries" standard for this patchset; I got this change
> wrong initially and I'm not sure I would have noticed that it was
> wrong if I wasn't being suspicious of any change to the generated code.
> 
> zw
> 


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

* Re: Fwd: [PATCH v2 3/5] Don't install libio.h or _G_config.h.
  2018-02-07 12:11           ` Adhemerval Zanella
@ 2018-02-07 15:16             ` Zack Weinberg
  0 siblings, 0 replies; 21+ messages in thread
From: Zack Weinberg @ 2018-02-07 15:16 UTC (permalink / raw
  To: GNU C Library

On Wed, Feb 7, 2018 at 7:11 AM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> On 06/02/2018 18:30, Florian Weimer wrote:
>> On 02/06/2018 09:08 PM, Zack Weinberg wrote:
>>> These are good suggestions for further cleanups but I'm not going to
>>> fold them into this patchset.  I don't think there's any danger of
>>> them getting forgotten about; whoever next looks at libio(P).h is
>>> going to be looking for cleanups.
>>
>> I completely agree with this approach.
>
> Fair enough.

I added a copyright header to bits/types/cookie_io_functions_t.h and
pushed the rest of this series.

zw


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

* Re: [PATCH v2 4/5] Post-cleanup 1: move libio.h back out of bits/.
  2018-02-07 12:12       ` Adhemerval Zanella
@ 2018-02-07 15:17         ` Zack Weinberg
  0 siblings, 0 replies; 21+ messages in thread
From: Zack Weinberg @ 2018-02-07 15:17 UTC (permalink / raw
  To: Adhemerval Zanella; +Cc: GNU C Library

On Wed, Feb 7, 2018 at 7:12 AM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> On 06/02/2018 18:10, Zack Weinberg wrote:
>> On Tue, Feb 6, 2018 at 11:57 AM, Adhemerval Zanella
>> <adhemerval.zanella@linaro.org> wrote:
>>> On 05/02/2018 21:34, Zack Weinberg wrote:
>>>> In this patch, libio.h moves back out of bits/ into the top level of
>>>> the libio subdirectory, and is merged with libio/bits/libio-ldbl.h
>>>> (which also used to be installed) and include/libio.h.  Since almost
>>>> no files include libio.h directly, this is quite straightforward.
>>>
>>> LGTM with a possible extra cleanups decribed below.
>> ...
>>> I think you can cleanup the __cplusplus guards for _IO_FILE as well.
>> ...
>>> As a side note, I think we can cleanup some definitions required to build it
>>> externally:
>>
>> Certainly, but again, I don't want to add yet more stuff to this
>> patchset and I can't promise to do follow-up work in the near future.
>
> Alright, I don't think these are blockers for the patch itself, but since
> you are touching it (and there is a long time since someone work on this
> code) I though you could check this out.

Yeah, I understand where you are coming from, it's just that I've
already spent more time on libc this week than I can really afford.
But I may have to wait for computers a lot today and tomorrow, so who
knows.

zw


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

end of thread, other threads:[~2018-02-07 15:15 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-02-05 23:34 [PATCH v2 0/5] Don't install libio.h or _G_config.h Zack Weinberg
2018-02-05 23:34 ` [PATCH v2 1/5] Pre-cleanup: Remove unnecessary redefinitions of std symbols Zack Weinberg
2018-02-05 23:50   ` Joseph Myers
2018-02-05 23:34 ` [PATCH v2 2/5] Remove getc and putc macros from the public stdio.h Zack Weinberg
2018-02-06  0:01   ` Joseph Myers
2018-02-06  1:03     ` Zack Weinberg
2018-02-05 23:34 ` [PATCH v2 3/5] Don't install libio.h or _G_config.h Zack Weinberg
2018-02-06 13:50   ` Adhemerval Zanella
     [not found]     ` <CAKCAbMiGUH5cBcZQjdf_uHTbqPyTJhBR-o8zo6u+hd_WCA_4VQ@mail.gmail.com>
2018-02-06 20:08       ` Fwd: " Zack Weinberg
2018-02-06 20:30         ` Florian Weimer
2018-02-07 12:11           ` Adhemerval Zanella
2018-02-07 15:16             ` Zack Weinberg
2018-02-05 23:34 ` [PATCH v2 4/5] Post-cleanup 1: move libio.h back out of bits/ Zack Weinberg
2018-02-06 16:57   ` Adhemerval Zanella
2018-02-06 20:10     ` Zack Weinberg
2018-02-07 12:12       ` Adhemerval Zanella
2018-02-07 15:17         ` Zack Weinberg
2018-02-05 23:35 ` [PATCH v2 5/5] Post-cleanup 2: minimize _G_config.h Zack Weinberg
2018-02-06 19:06   ` Adhemerval Zanella
2018-02-06 20:17     ` Zack Weinberg
2018-02-07 12:14       ` Adhemerval Zanella

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