Merge pull request #466 from apple/kwt-ubuntu1804-clang-workaround

Workaround for Ubuntu 18.04 clang crashes in swift-corelibs-libdispath
diff --git a/src/init.c b/src/init.c
index 5b62992..54f5d98 100644
--- a/src/init.c
+++ b/src/init.c
@@ -29,6 +29,14 @@
 #include "protocolServer.h"
 #endif
 
+#ifdef __linux__
+// The clang compiler in Ubuntu 18.04 has a bug that causes it to crash
+// when compiling _dispatch_bug_kevent_vanished(). As a workaround, use a
+// less capable version of this function on Linux until a fixed version
+// of the compiler is available.
+#define RDAR_49023449 1
+#endif // __linux__
+
 #pragma mark -
 #pragma mark dispatch_init
 
@@ -955,6 +963,7 @@
 	return dc->dc_func;
 }
 
+#if HAVE_MACH
 void
 _dispatch_bug_kevent_client(const char *msg, const char *filter,
 		const char *operation, int err, uint64_t ident, uint64_t udata,
@@ -998,6 +1007,23 @@
 				msg, strerror(err), err, udata, filter, ident, ident, func);
 	}
 }
+#endif // HAVE_MACH
+
+#if RDAR_49023449
+
+// The clang compiler on Ubuntu18.04 crashes when compiling the full version of
+// this function. This reduced version avoids the crash but logs less useful
+// information.
+void
+_dispatch_bug_kevent_vanished(dispatch_unote_t du)
+{
+	_dispatch_log_fault("LIBDISPATCH_STRICT: _dispatch_bug_kevent_vanished",
+			"BUG in libdispatch client: %s, monitored resource vanished before "
+			"the source cancel handler was invoked",
+			dux_type(du._du)->dst_kind);
+}
+
+#else // RDAR_49023449
 
 void
 _dispatch_bug_kevent_vanished(dispatch_unote_t du)
@@ -1012,7 +1038,7 @@
 		dc = du._dr->ds_handler[DS_EVENT_HANDLER];
 		if (dc) func = _dispatch_continuation_get_function_symbol(dc);
 		break;
- #if HAVE_MACH
+#if HAVE_MACH
 	case DISPATCH_MACH_CHANNEL_TYPE:
 		func = du._dmrr->dmrr_handler_func;
 		break;
@@ -1027,6 +1053,8 @@
 			du._du->du_ident, du._du->du_ident, func);
 }
 
+#endif // RDAR_49023449
+
 DISPATCH_NOINLINE DISPATCH_WEAK
 void
 _dispatch_bug_deprecated(const char *msg)
diff --git a/src/internal.h b/src/internal.h
index 92142fb..3cc16fc 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -474,10 +474,12 @@
 
 struct dispatch_unote_class_s;
 
+#if HAVE_MACH
 DISPATCH_NOINLINE DISPATCH_COLD
 void _dispatch_bug_kevent_client(const char *msg, const char *filter,
 		const char *operation, int err, uint64_t ident, uint64_t udata,
 		struct dispatch_unote_class_s *du);
+#endif // HAVE_MACH
 
 DISPATCH_NOINLINE DISPATCH_COLD
 void _dispatch_bug_kevent_vanished(struct dispatch_unote_class_s *du);