[PATCH v2 1/4] Feature test macro overhaul
Yaakov Selkowitz
yselkowi@redhat.com
Tue Feb 23 03:24:00 GMT 2016
Second draft attached. This version uses more BSD-like __*_VISIBLE
names. I haven't tested this extensively yet.
--
Yaakov Selkowitz
Associate Software Engineer, ARM
Red Hat, Inc.
-------------- next part --------------
diff --git a/newlib/libc/include/sys/cdefs.h b/newlib/libc/include/sys/cdefs.h
index 773ac25..2a55a92 100644
--- a/newlib/libc/include/sys/cdefs.h
+++ b/newlib/libc/include/sys/cdefs.h
@@ -624,132 +624,6 @@
#define __DEQUALIFY(type, var) ((type)(__uintptr_t)(const volatile void *)(var))
#endif
-/*-
- * The following definitions are an extension of the behavior originally
- * implemented in <sys/_posix.h>, but with a different level of granularity.
- * POSIX.1 requires that the macros we test be defined before any standard
- * header file is included.
- *
- * Here's a quick run-down of the versions:
- * defined(_POSIX_SOURCE) 1003.1-1988
- * _POSIX_C_SOURCE == 1 1003.1-1990
- * _POSIX_C_SOURCE == 2 1003.2-1992 C Language Binding Option
- * _POSIX_C_SOURCE == 199309 1003.1b-1993
- * _POSIX_C_SOURCE == 199506 1003.1c-1995, 1003.1i-1995,
- * and the omnibus ISO/IEC 9945-1: 1996
- * _POSIX_C_SOURCE == 200112 1003.1-2001
- * _POSIX_C_SOURCE == 200809 1003.1-2008
- *
- * In addition, the X/Open Portability Guide, which is now the Single UNIX
- * Specification, defines a feature-test macro which indicates the version of
- * that specification, and which subsumes _POSIX_C_SOURCE.
- *
- * Our macros begin with two underscores to avoid namespace screwage.
- */
-
-/* Deal with _GNU_SOURCE, which implies everything and the kitchen sink */
-#ifdef _GNU_SOURCE
-#undef _XOPEN_SOURCE
-#define _XOPEN_SOURCE 700
-#define __BSD_VISIBLE 1
-#define __GNU_VISIBLE 1
-#endif
-
-/* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1. */
-#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1
-#undef _POSIX_C_SOURCE /* Probably illegal, but beyond caring now. */
-#define _POSIX_C_SOURCE 199009
-#endif
-
-/* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2. */
-#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2
-#undef _POSIX_C_SOURCE
-#define _POSIX_C_SOURCE 199209
-#endif
-
-/* Deal with various X/Open Portability Guides and Single UNIX Spec. */
-#ifdef _XOPEN_SOURCE
-#if _XOPEN_SOURCE - 0 >= 700
-#define __XSI_VISIBLE 700
-#undef _POSIX_C_SOURCE
-#define _POSIX_C_SOURCE 200809
-#elif _XOPEN_SOURCE - 0 >= 600
-#define __XSI_VISIBLE 600
-#undef _POSIX_C_SOURCE
-#define _POSIX_C_SOURCE 200112
-#elif _XOPEN_SOURCE - 0 >= 500
-#define __XSI_VISIBLE 500
-#undef _POSIX_C_SOURCE
-#define _POSIX_C_SOURCE 199506
-#endif
-#endif
-
-/*
- * Deal with all versions of POSIX. The ordering relative to the tests above is
- * important.
- */
-#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE)
-#define _POSIX_C_SOURCE 198808
-#endif
-#ifdef _POSIX_C_SOURCE
-#if _POSIX_C_SOURCE >= 200809
-#define __POSIX_VISIBLE 200809
-#define __ISO_C_VISIBLE 1999
-#elif _POSIX_C_SOURCE >= 200112
-#define __POSIX_VISIBLE 200112
-#define __ISO_C_VISIBLE 1999
-#elif _POSIX_C_SOURCE >= 199506
-#define __POSIX_VISIBLE 199506
-#define __ISO_C_VISIBLE 1990
-#elif _POSIX_C_SOURCE >= 199309
-#define __POSIX_VISIBLE 199309
-#define __ISO_C_VISIBLE 1990
-#elif _POSIX_C_SOURCE >= 199209
-#define __POSIX_VISIBLE 199209
-#define __ISO_C_VISIBLE 1990
-#elif _POSIX_C_SOURCE >= 199009
-#define __POSIX_VISIBLE 199009
-#define __ISO_C_VISIBLE 1990
-#else
-#define __POSIX_VISIBLE 198808
-#define __ISO_C_VISIBLE 0
-#endif /* _POSIX_C_SOURCE */
-#else
-/*-
- * Deal with _ANSI_SOURCE:
- * If it is defined, and no other compilation environment is explicitly
- * requested, then define our internal feature-test macros to zero. This
- * makes no difference to the preprocessor (undefined symbols in preprocessing
- * expressions are defined to have value zero), but makes it more convenient for
- * a test program to print out the values.
- *
- * If a program mistakenly defines _ANSI_SOURCE and some other macro such as
- * _POSIX_C_SOURCE, we will assume that it wants the broader compilation
- * environment (and in fact we will never get here).
- */
-#if defined(_ANSI_SOURCE) /* Hide almost everything. */
-#define __POSIX_VISIBLE 0
-#define __XSI_VISIBLE 0
-#define __BSD_VISIBLE 0
-#define __ISO_C_VISIBLE 1990
-#elif defined(_C99_SOURCE) /* Localism to specify strict C99 env. */
-#define __POSIX_VISIBLE 0
-#define __XSI_VISIBLE 0
-#define __BSD_VISIBLE 0
-#define __ISO_C_VISIBLE 1999
-#elif defined(_C11_SOURCE) /* Localism to specify strict C11 env. */
-#define __POSIX_VISIBLE 0
-#define __XSI_VISIBLE 0
-#define __BSD_VISIBLE 0
-#define __ISO_C_VISIBLE 2011
-#else /* Default: everything except __GNU_VISIBLE. */
-#define __POSIX_VISIBLE 200809
-#define __XSI_VISIBLE 700
-#define __BSD_VISIBLE 1
-#define __ISO_C_VISIBLE 2011
-#endif
-#endif
-
/*
* Type Safety Checking
*
diff --git a/newlib/libc/include/sys/config.h b/newlib/libc/include/sys/config.h
index 5297bef..c536698 100644
--- a/newlib/libc/include/sys/config.h
+++ b/newlib/libc/include/sys/config.h
@@ -232,9 +232,6 @@
#if defined(__CYGWIN__)
#include <cygwin/config.h>
-#if !defined (__STRICT_ANSI__) || (__STDC_VERSION__ >= 199901L)
-#define __USE_XOPEN2K 1
-#endif
#endif
#if defined(__rtems__)
diff --git a/newlib/libc/include/sys/features.h b/newlib/libc/include/sys/features.h
index cb6d1eb..5f0fe5e 100644
--- a/newlib/libc/include/sys/features.h
+++ b/newlib/libc/include/sys/features.h
@@ -39,6 +39,180 @@ extern "C" {
/* Version with trailing underscores for BSD compatibility. */
#define __GNUC_PREREQ__(ma, mi) __GNUC_PREREQ(ma, mi)
+
+/*
+ * Feature test macros control which symbols are exposed by the system
+ * headers. Any of these must be defined before including any headers.
+ *
+ * __STRICT_ANSI__ (defined by gcc -ansi, -std=c90, -std=c99, or -std=c11)
+ * ISO C
+ * _POSIX_SOURCE (deprecated by _POSIX_C_SOURCE=1)
+ * _POSIX_C_SOURCE >= 1
+ * POSIX.1-1990
+ * _POSIX_C_SOURCE >= 2
+ * POSIX.2-1992
+ * _POSIX_C_SOURCE >= 199309L
+ * POSIX.1b-1993 Real-time extensions
+ * _POSIX_C_SOURCE >= 199506L
+ * POSIX.1c-1995 Threads extensions
+ * _POSIX_C_SOURCE >= 200112L
+ * POSIX.1-2001 and C99
+ * _POSIX_C_SOURCE >= 200809L
+ * POSIX.1-2008
+ * _XOPEN_SOURCE
+ * POSIX.1-1990 and XPG4
+ * _XOPEN_SOURCE_EXTENDED
+ * SUSv1 (POSIX.2-1992 plus XPG4v2)
+ * _XOPEN_SOURCE >= 500
+ * SUSv2 (POSIX.1c-1995 plus XSI)
+ * _XOPEN_SOURCE >= 600
+ * SUSv3 (POSIX.1-2001 plus XSI) and C99
+ * _XOPEN_SOURCE >= 700
+ * SUSv4 (POSIX.1-2008 plus XSI)
+ * _ISOC99_SOURCE or gcc -std=c99 or g++ -std=c++11
+ * ISO C99
+ * _ISOC11_SOURCE or gcc -std=c11 or g++ -std=c++11
+ * ISO C11
+ * _ATFILE_SOURCE (implied by _POSIX_C_SOURCE >= 200809L)
+ * "at" functions
+ * _LARGEFILE_SOURCE (deprecated by _XOPEN_SOURCE >= 500)
+ * fseeko, ftello
+ * _BSD_SOURCE
+ * BSD extensions
+ * _SVID_SOURCE
+ * SVr4 extensions
+ * _GNU_SOURCE
+ * All of the above plus GNU extensions
+ *
+ * If none of these macros are defined, C99 (C11 since GCC 5), POSIX.1-2008,
+ * BSD, and SVr4 symbols are exposed by default.
+ */
+
+#ifdef _GNU_SOURCE
+#undef _ATFILE_SOURCE
+#define _ATFILE_SOURCE 1
+#undef _ISOC99_SOURCE
+#define _ISOC99_SOURCE 1
+#undef _ISOC11_SOURCE
+#define _ISOC11_SOURCE 1
+#undef _POSIX_SOURCE
+#define _POSIX_SOURCE 1
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 200809L
+#undef _XOPEN_SOURCE
+#define _XOPEN_SOURCE 700
+#undef _XOPEN_SOURCE_EXTENDED
+#define _XOPEN_SOURCE_EXTENDED 1
+#undef _BSD_SOURCE
+#define _BSD_SOURCE 1
+#undef _SVID_SOURCE
+#define _SVID_SOURCE 1
+#endif /* _GNU_SOURCE */
+
+#if !defined(__STRICT_ANSI__) && !defined(_ANSI_SOURCE) && \
+ !defined(_ISOC99_SOURCE) && !defined(_POSIX_SOURCE) && \
+ !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE) && \
+ !defined(_BSD_SOURCE) && !defined(_SVID_SOURCE)
+#define _BSD_SOURCE
+#define _SVID_SOURCE
+#endif
+
+#if (!defined(__STRICT_ANSI__) && !defined(_ANSI_SOURCE)) || \
+ ((_XOPEN_SOURCE - 0) >= 500 && !defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE))
+#define _POSIX_SOURCE 1
+#if !defined(_XOPEN_SOURCE) || (_XOPEN_SOURCE - 0) >= 700
+#define _POSIX_C_SOURCE 200809L
+#elif (_XOPEN_SOURCE - 0) >= 600
+#define _POSIX_C_SOURCE 200112L
+#elif (_XOPEN_SOURCE - 0) >= 500
+#define _POSIX_C_SOURCE 199506L
+#else /* _XOPEN_SOURCE < 500 */
+#define _POSIX_C_SOURCE 2
+#endif
+#endif
+
+#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200809
+#undef _ATFILE_SOURCE
+#define _ATFILE_SOURCE
+#endif
+
+/* Our macros begin with two underscores to avoid namespace issues. */
+#ifdef _ATFILE_SOURCE
+#define __ATFILE_VISIBLE 1
+#else
+#define __ATFILE_VISIBLE 0
+#endif
+
+#ifdef _BSD_SOURCE
+#define __BSD_VISIBLE 1
+#else
+#define __BSD_VISIBLE 0
+#endif
+
+#ifdef _GNU_SOURCE
+#define __GNU_VISIBLE 1
+#else
+#define __GNU_VISIBLE 0
+#endif
+
+#if defined(_ISOC11_SOURCE) || \
+ (__STDC_VERSION__ - 0) >= 201112L || (__cplusplus - 0) >= 201103L
+#define __ISO_C_VISIBLE 2011
+#elif defined(_ISOC99_SOURCE) || \
+ (__STDC_VERSION__ - 0) >= 199901L || (_POSIX_C_SOURCE - 0) >= 200112L
+#define __ISO_C_VISIBLE 1999
+#else
+#define __ISO_C_VISIBLE 1990
+#endif
+
+#if defined(_LARGEFILE_SOURCE) || (_XOPEN_SOURCE - 0) >= 500
+#define __LARGEFILE_VISIBLE 1
+#else
+#define __LARGEFILE_VISIBLE 0
+#endif
+
+#if defined(_BSD_SOURCE) || defined(_SVID_SOURCE)
+#define __MISC_VISIBLE 1
+#else
+#define __MISC_VISIBLE 0
+#endif
+
+#if (_POSIX_C_SOURCE - 0) >= 200809L
+#define __POSIX_VISIBLE 200809
+#elif (_POSIX_C_SOURCE - 0) >= 200112L
+#define __POSIX_VISIBLE 200112
+#elif (_POSIX_C_SOURCE - 0) >= 199506L
+#define __POSIX_VISIBLE 199506
+#elif (_POSIX_C_SOURCE - 0) >= 199309L
+#define __POSIX_VISIBLE 199309
+#elif (_POSIX_C_SOURCE - 0) >= 2 || defined(_XOPEN_SOURCE)
+#define __POSIX_VISIBLE 199209
+#elif defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE)
+#define __POSIX_VISIBLE 199009
+#else
+#define __POSIX_VISIBLE 0
+#endif
+
+#ifdef _SVID_SOURCE
+#define __SVID_VISIBLE 1
+#else
+#define __SVID_VISIBLE 0
+#endif
+
+#if (_XOPEN_SOURCE - 0) >= 700
+#define __XSI_VISIBLE 700
+#elif (_XOPEN_SOURCE - 0) >= 600
+#define __XSI_VISIBLE 600
+#elif (_XOPEN_SOURCE - 0) >= 500
+#define __XSI_VISIBLE 500
+#elif defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED)
+#define __XSI_VISIBLE 4
+#elif defined(_XOPEN_SOURCE)
+#define __XSI_VISIBLE 1
+#else
+#define __XSI_VISIBLE 0
+#endif
+
/* RTEMS adheres to POSIX -- 1003.1b with some features from annexes. */
#ifdef __rtems__
@@ -206,25 +380,6 @@ extern "C" {
#endif /* __CYGWIN__ */
-/* Per the permission given in POSIX.1-2008 section 2.2.1, define
- * _POSIX_C_SOURCE if _XOPEN_SOURCE is defined and _POSIX_C_SOURCE is not.
- * (_XOPEN_SOURCE indicates that XSI extensions are desired by an application.)
- * This permission is first granted in 2008, but use it for older ones, also.
- * Allow for _XOPEN_SOURCE to be empty (from the earliest form of it, before it
- * was required to have specific values).
- */
-#if !defined(_POSIX_C_SOURCE) && defined(_XOPEN_SOURCE)
- #if (_XOPEN_SOURCE - 0) == 700 /* POSIX.1-2008 */
- #define _POSIX_C_SOURCE 200809L
- #elif (_XOPEN_SOURCE - 0) == 600 /* POSIX.1-2001 or 2004 */
- #define _POSIX_C_SOURCE 200112L
- #elif (_XOPEN_SOURCE - 0) == 500 /* POSIX.1-1995 */
- #define _POSIX_C_SOURCE 199506L
- #elif (_XOPEN_SOURCE - 0) < 500 /* really old */
- #define _POSIX_C_SOURCE 2
- #endif
-#endif
-
#ifdef __cplusplus
}
#endif
More information about the Newlib
mailing list