summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorViktor Dukhovni <ietf-dane@dukhovni.org>2021-04-27 13:33:26 -0400
committerBen Gamari <ben@well-typed.com>2021-05-03 11:35:44 -0400
commit7146958a3cc0212b2c2c35917c10adde0aa57d30 (patch)
tree635fc5910fafa52eb09e58eb66f1431856924146
parent3e8eaaab78496256919890db62f0161bdfe3add3 (diff)
downloadhaskell-7146958a3cc0212b2c2c35917c10adde0aa57d30.tar.gz
Tighten scope of non-POSIX visibility macros
The __BSD_VISIBLE and _DARWIN_C_SOURCE macros expose non-POSIX prototypes in system header files. We should scope these to just the ".c" modules that actually need them, and avoid defining them in header files used in other C modules.
-rw-r--r--includes/Rts.h6
-rw-r--r--rts/LinkerInternals.h5
-rw-r--r--rts/posix/Itimer.c21
-rw-r--r--rts/posix/OSThreads.c17
4 files changed, 34 insertions, 15 deletions
diff --git a/includes/Rts.h b/includes/Rts.h
index e7fb8561f6..0f96ba2eca 100644
--- a/includes/Rts.h
+++ b/includes/Rts.h
@@ -29,12 +29,6 @@ extern "C" {
#include <windows.h>
#endif
-#if defined(ios_HOST_OS) || defined(darwin_HOST_OS)
-/* Inclusion of system headers usually requires _DARWIN_C_SOURCE on Mac OS X
- * because of some specific defines like MMAP_ANON, MMAP_ANONYMOUS. */
-#define _DARWIN_C_SOURCE 1
-#endif
-
#if !defined(IN_STG_CODE)
#define IN_STG_CODE 0
#endif
diff --git a/rts/LinkerInternals.h b/rts/LinkerInternals.h
index e1da899c89..167a14202d 100644
--- a/rts/LinkerInternals.h
+++ b/rts/LinkerInternals.h
@@ -13,11 +13,6 @@
#include "linker/M32Alloc.h"
#if RTS_LINKER_USE_MMAP
-#if defined(ios_HOST_OS) || defined(darwin_HOST_OS)
-/* Inclusion of system headers usually requires _DARWIN_C_SOURCE on Mac OS X
- * because of some specific defines like MMAP_ANON, MMAP_ANONYMOUS. */
-#define _DARWIN_C_SOURCE 1
-#endif
#include <sys/mman.h>
#endif
diff --git a/rts/posix/Itimer.c b/rts/posix/Itimer.c
index 80925df703..98b23f623e 100644
--- a/rts/posix/Itimer.c
+++ b/rts/posix/Itimer.c
@@ -18,6 +18,27 @@
*/
#include "PosixSource.h"
+
+/* We've defined _POSIX_SOURCE via "PosixSource.h", and yet still use
+ some non-POSIX features. With _POSIX_SOURCE defined, visibility of
+ non-POSIX extension prototypes requires _DARWIN_C_SOURCE on Mac OS X and
+ __BSD_VISIBLE on FreeBSD and DragonflyBSD. Otherwise, for example, code
+ using pthread_setname_np(3) and variants will not compile. We must
+ therefore define the additional macros that expose non-POSIX APIs early,
+ before any of the relevant system headers are included via "Rts.h".
+
+ An alternative approach could be to write portable wrappers or stubs for all
+ the non-posix functions in a C-module that does not include "PosixSource.h",
+ and then use only POSIX features and the portable wrapper functions in all
+ other C-modules. */
+#include "ghcconfig.h"
+#if defined(freebsd_HOST_OS) || defined(dragonfly_HOST_OS)
+#define __BSD_VISIBLE 1
+#endif
+#if defined(darwin_HOST_OS)
+#define _DARWIN_C_SOURCE 1
+#endif
+
#include "Rts.h"
/*
diff --git a/rts/posix/OSThreads.c b/rts/posix/OSThreads.c
index b815894a9f..e039b43573 100644
--- a/rts/posix/OSThreads.c
+++ b/rts/posix/OSThreads.c
@@ -9,14 +9,23 @@
#include "PosixSource.h"
+/* We've defined _POSIX_SOURCE via "PosixSource.h", and yet still use
+ some non-POSIX features. With _POSIX_SOURCE defined, visibility of
+ non-POSIX extension prototypes requires _DARWIN_C_SOURCE on Mac OS X and
+ __BSD_VISIBLE on FreeBSD and DragonflyBSD. Otherwise, for example, code
+ using pthread_setname_np(3) and variants will not compile. We must
+ therefore define the additional macros that expose non-POSIX APIs early,
+ before any of the relevant system headers are included via "Rts.h".
+
+ An alternative approach could be to write portable wrappers or stubs for all
+ the non-posix functions in a C-module that does not include "PosixSource.h",
+ and then use only POSIX features and the portable wrapper functions in all
+ other C-modules. */
+#include "ghcconfig.h"
#if defined(freebsd_HOST_OS) || defined(dragonfly_HOST_OS)
-/* Inclusion of system headers usually requires __BSD_VISIBLE on FreeBSD and
- * DragonflyBSD, because of some specific types, like u_char, u_int, etc. */
#define __BSD_VISIBLE 1
#endif
#if defined(darwin_HOST_OS)
-/* Inclusion of system headers usually requires _DARWIN_C_SOURCE on Mac OS X
- * because of some specific types like u_char, u_int, etc. */
#define _DARWIN_C_SOURCE 1
#endif