[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