Revision
45
Author
robert@fledge.watson.org
Date
2009-09-26 12:23:40 -0700 (Sat, 26 Sep 2009)

Log Message

Some versions of clang appear not to mark __builtin_trap() as __noreturn__,
leading to a compile error as dispatch_main(), which relies on
__builtin_trap() to exit in various error cases, is marked __no_return__.
Detect this bug/feature in configure, and handle.

Modified Paths

Diff

Modified: trunk/configure.ac (44 => 45)


--- trunk/configure.ac	2009-09-26 18:45:51 UTC (rev 44)
+++ trunk/configure.ac	2009-09-26 19:23:40 UTC (rev 45)
@@ -248,6 +248,15 @@
 AC_SUBST([CBLOCKS_FLAGS])
 
 #
+# Temporary: some versions of clang do not mark __builtin_trap() as
+# __attribute__((__noreturn__)).  Detect and add if required.
+#
+AC_COMPILE_IFELSE([
+  AC_LANG_PROGRAM([void __attribute__((__noreturn__)) temp(void) { __builtin_trap(); }], [])], [
+    AC_DEFINE(HAVE_NORETURN_BUILTIN_TRAP,,[Define if __builtin_trap marked noreturn])
+  ], [])
+
+#
 # Generate Makefiles.
 #
 AC_CONFIG_FILES([Makefile dispatch/Makefile man/Makefile src/Makefile])

Modified: trunk/src/queue.c (44 => 45)


--- trunk/src/queue.c	2009-09-26 18:45:51 UTC (rev 44)
+++ trunk/src/queue.c	2009-09-26 19:23:40 UTC (rev 45)
@@ -884,6 +884,15 @@
 }
 #endif
 
+/*
+ * XXXRW: Work-around for possible clang bug in which __builtin_trap() is not
+ * marked noreturn, leading to a build error as dispatch_main() *is* marked
+ * noreturn.  Mask by marking __builtin_trap() as noreturn locally.
+ */
+#ifndef HAVE_NORETURN_BUILTIN_TRAP
+void __builtin_trap(void) __attribute__((__noreturn__));
+#endif
+
 void
 dispatch_main(void)
 {