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


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

Re: [PATCH v2 3/5] Don't install libio.h or _G_config.h.



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.


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