summaryrefslogtreecommitdiff
path: root/libio
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2016-08-02 17:40:35 +0000
committerJoseph Myers <joseph@codesourcery.com>2016-08-02 17:40:35 +0000
commit487890009e4ed87198331d0dae9b0be52d37f68c (patch)
tree29908cfe0c8c65ae9bb4f9309517f5546ec27022 /libio
parent968dc26df61f4577c6a1df5734de21c1504d2c79 (diff)
Support __STDC_WANT_LIB_EXT2__ feature test macro.
This patch implements support for the __STDC_WANT_LIB_EXT2__ feature test macro from ISO/IEC TR 24731-2:2010, thereby implementing one possible approach for supporting ISO C feature test macros. Recall that, as described in <https://sourceware.org/ml/libc-alpha/2016-05/msg00486.html>, these macros work based on the definition when affected headers are included, so cannot be handled once when the first system header is included because that might not be one of the headers the particular macro in question affects. <https://sourceware.org/ml/libc-alpha/2016-05/msg00680.html> expresses views on possible approaches for implementation and <https://sourceware.org/ml/libc-alpha/2016-06/msg00039.html> follows up on that. This patch arranges things so that the relevant condition is __GLIBC_USE (LIB_EXT2), following one of the suggestions given. Headers using these macros include <bits/libc-header-start.h>, which in turn includes <features.h>. Headers must define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION before including <bits/libc-header-start.h>, to discourage inclusion outside glibc as requested. __USE_GNU conditions on affected functions are changed to __GLIBC_USE (LIB_EXT2), while it's added as an additional alternative on the conditions for functions already enabled for some POSIX versions. It would be possible to convert existing __USE_* conditionals to __GLIBC_USE (with the relevant __GLIBC_USE_* being defined in <features.h> where __USE_* are presently defined), and so make them typo-proof (given -Wundef -Werror in glibc builds) because __GLIBC_USE is used with #if not #ifdef / #if defined. No attempt is made to enforce the rule about diagnosing different definitions of __STDC_WANT_LIB_EXT2__ when affected headers are included; such a diagnostic is incompatible with multiple-include guards on the affected headers, unless compiler extensions are added to support it. As previously noted, glibc does not implement all features from TR 24731-2:2010: the functions aswprintf vaswprintf getwdelim getwline are not in glibc, although they would be appropriate to add if someone wished to do so. But I think it makes sense to support the feature test macro if *any* of the controlled features are present in glibc. Tested for x86_64 and x86 (testsuite, and that installed stripped shared libraries are unchanged by the patch). * bits/libc-header-start.h: New file. * Makefile (headers): Add bits/libc-header-start.h. * include/features.h (__STDC_WANT_LIB_EXT2__): Document. (__GLIBC_USE): New macro. * libio/stdio.h: Define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION and include <bits/libc-header-start.h> instead of including <features.h>. (fmemopen): Declare also if [__GLIBC_USE (LIB_EXT2)]. (open_memstream): Likewise. (vasprintf): Declare if [__GLIBC_USE (LIB_EXT2)], not [__USE_GNU]. (__asprintf): Likewise. (asprintf): Likewise. (__getdelim): Declare also if [__GLIBC_USE (LIB_EXT2)]. (getdelim): Likewise. (getline): Likewise. * string/string.h: Define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION and include <bits/libc-header-start.h> instead of including <features.h>. (strdup): Declare also if [__GLIBC_USE (LIB_EXT2)] (strndup): Likewise. * wcsmbs/wchar.h: Define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION and include <bits/libc-header-start.h> instead of including <features.h>. (open_wmemstream): Declare also if [__GLIBC_USE (LIB_EXT2)]. * manual/creature.texi (__STDC_WANT_LIB_EXT2__): Document macro.
Diffstat (limited to 'libio')
-rw-r--r--libio/stdio.h9
1 files changed, 5 insertions, 4 deletions
diff --git a/libio/stdio.h b/libio/stdio.h
index 4511c3cc69..e37f901e5f 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -24,7 +24,8 @@
#if !defined __need_FILE && !defined __need___FILE
# define _STDIO_H 1
-# include <features.h>
+# define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+# include <bits/libc-header-start.h>
__BEGIN_DECLS
@@ -316,7 +317,7 @@ extern FILE *fopencookie (void *__restrict __magic_cookie,
_IO_cookie_io_functions_t __io_funcs) __THROW __wur;
#endif
-#ifdef __USE_XOPEN2K8
+#if defined __USE_XOPEN2K8 || __GLIBC_USE (LIB_EXT2)
/* Create a new stream that refers to a memory buffer. */
extern FILE *fmemopen (void *__s, size_t __len, const char *__modes)
__THROW __wur;
@@ -395,7 +396,7 @@ extern int vsnprintf (char *__restrict __s, size_t __maxlen,
__END_NAMESPACE_C99
#endif
-#ifdef __USE_GNU
+#if __GLIBC_USE (LIB_EXT2)
/* 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,
@@ -653,7 +654,7 @@ extern char *fgets_unlocked (char *__restrict __s, int __n,
#endif
-#ifdef __USE_XOPEN2K8
+#if defined __USE_XOPEN2K8 || __GLIBC_USE (LIB_EXT2)
/* Read up to (and including) a DELIMITER from STREAM into *LINEPTR
(and null-terminate it). *LINEPTR is a pointer returned from malloc (or
NULL), pointing to *N characters of space. It is realloc'd as