Index: libcfa/configure
===================================================================
--- libcfa/configure	(revision 2ad74d8f44d624e200828496252e4e7eb0a08509)
+++ libcfa/configure	(revision 0100882edf7e7d1ea48cf5b3e761d5e0fd505979)
@@ -1960,4 +1960,95 @@
 
 } # ac_fn_cxx_try_link
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## --------------------------------------- ##
+## Report this to cforall@plg.uwaterloo.ca ##
+## --------------------------------------- ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
 cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
@@ -16859,4 +16950,17 @@
 
 
+for ac_header in linux/io_uring.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "linux/io_uring.h" "ac_cv_header_linux_io_uring_h" "$ac_includes_default"
+if test "x$ac_cv_header_linux_io_uring_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LINUX_IO_URING_H 1
+_ACEOF
+
+fi
+
+done
+
+
 ac_config_files="$ac_config_files Makefile src/Makefile prelude/Makefile"
 
Index: libcfa/configure.ac
===================================================================
--- libcfa/configure.ac	(revision 2ad74d8f44d624e200828496252e4e7eb0a08509)
+++ libcfa/configure.ac	(revision 0100882edf7e7d1ea48cf5b3e761d5e0fd505979)
@@ -118,4 +118,6 @@
 AC_PROG_MAKE_SET
 
+AC_CHECK_HEADERS([linux/io_uring.h])
+
 AC_CONFIG_FILES([
 	Makefile
Index: libcfa/src/Makefile.am
===================================================================
--- libcfa/src/Makefile.am	(revision 2ad74d8f44d624e200828496252e4e7eb0a08509)
+++ libcfa/src/Makefile.am	(revision 0100882edf7e7d1ea48cf5b3e761d5e0fd505979)
@@ -48,5 +48,5 @@
 thread_headers_nosrc = concurrency/invoke.h
 thread_headers = concurrency/coroutine.hfa concurrency/thread.hfa concurrency/kernel.hfa concurrency/monitor.hfa concurrency/mutex.hfa
-thread_libsrc = concurrency/CtxSwitch-@ARCHITECTURE@.S concurrency/alarm.cfa concurrency/invoke.c concurrency/preemption.cfa ${thread_headers:.hfa=.cfa}
+thread_libsrc = concurrency/CtxSwitch-@ARCHITECTURE@.S concurrency/alarm.cfa concurrency/invoke.c concurrency/io.cfa concurrency/preemption.cfa ${thread_headers:.hfa=.cfa}
 else
 headers =
Index: libcfa/src/Makefile.in
===================================================================
--- libcfa/src/Makefile.in	(revision 2ad74d8f44d624e200828496252e4e7eb0a08509)
+++ libcfa/src/Makefile.in	(revision 0100882edf7e7d1ea48cf5b3e761d5e0fd505979)
@@ -164,8 +164,8 @@
 am__libcfathread_la_SOURCES_DIST =  \
 	concurrency/CtxSwitch-@ARCHITECTURE@.S concurrency/alarm.cfa \
-	concurrency/invoke.c concurrency/preemption.cfa \
-	concurrency/coroutine.cfa concurrency/thread.cfa \
-	concurrency/kernel.cfa concurrency/monitor.cfa \
-	concurrency/mutex.cfa
+	concurrency/invoke.c concurrency/io.cfa \
+	concurrency/preemption.cfa concurrency/coroutine.cfa \
+	concurrency/thread.cfa concurrency/kernel.cfa \
+	concurrency/monitor.cfa concurrency/mutex.cfa
 @BUILDLIB_TRUE@am__objects_3 = concurrency/coroutine.lo \
 @BUILDLIB_TRUE@	concurrency/thread.lo concurrency/kernel.lo \
@@ -174,5 +174,6 @@
 @BUILDLIB_TRUE@	concurrency/CtxSwitch-@ARCHITECTURE@.lo \
 @BUILDLIB_TRUE@	concurrency/alarm.lo concurrency/invoke.lo \
-@BUILDLIB_TRUE@	concurrency/preemption.lo $(am__objects_3)
+@BUILDLIB_TRUE@	concurrency/io.lo concurrency/preemption.lo \
+@BUILDLIB_TRUE@	$(am__objects_3)
 am_libcfathread_la_OBJECTS = $(am__objects_4)
 libcfathread_la_OBJECTS = $(am_libcfathread_la_OBJECTS)
@@ -474,5 +475,5 @@
 @BUILDLIB_FALSE@thread_headers = 
 @BUILDLIB_TRUE@thread_headers = concurrency/coroutine.hfa concurrency/thread.hfa concurrency/kernel.hfa concurrency/monitor.hfa concurrency/mutex.hfa
-@BUILDLIB_TRUE@thread_libsrc = concurrency/CtxSwitch-@ARCHITECTURE@.S concurrency/alarm.cfa concurrency/invoke.c concurrency/preemption.cfa ${thread_headers:.hfa=.cfa}
+@BUILDLIB_TRUE@thread_libsrc = concurrency/CtxSwitch-@ARCHITECTURE@.S concurrency/alarm.cfa concurrency/invoke.c concurrency/io.cfa concurrency/preemption.cfa ${thread_headers:.hfa=.cfa}
 
 #----------------------------------------------------------------------------------------------------------------
@@ -608,4 +609,6 @@
 	concurrency/$(DEPDIR)/$(am__dirstamp)
 concurrency/invoke.lo: concurrency/$(am__dirstamp) \
+	concurrency/$(DEPDIR)/$(am__dirstamp)
+concurrency/io.lo: concurrency/$(am__dirstamp) \
 	concurrency/$(DEPDIR)/$(am__dirstamp)
 concurrency/preemption.lo: concurrency/$(am__dirstamp) \
Index: libcfa/src/exception.c
===================================================================
--- libcfa/src/exception.c	(revision 2ad74d8f44d624e200828496252e4e7eb0a08509)
+++ libcfa/src/exception.c	(revision 0100882edf7e7d1ea48cf5b3e761d5e0fd505979)
@@ -10,6 +10,6 @@
 // Created On       : Mon Jun 26 15:13:00 2017
 // Last Modified By : Andrew Beach
-// Last Modified On : Mon Apr 06 14:40:00 2020
-// Update Count     : 15
+// Last Modified On : Thr Apr  9 12:20:00 2020
+// Update Count     : 17
 //
 
@@ -28,4 +28,5 @@
 #include <unwind.h>
 #include <bits/debug.hfa>
+#include "stdhdr/assert.h"
 
 // FIX ME: temporary hack to keep ARM build working
@@ -216,8 +217,13 @@
 		struct _Unwind_Context * unwind_context,
 		void * stop_param) {
-	if ( actions & _UA_END_OF_STACK  ) exit(1);
-	if ( actions & _UA_CLEANUP_PHASE ) return _URC_NO_REASON;
-
-	return _URC_FATAL_PHASE2_ERROR;
+	// Verify actions follow the rules we expect.
+	verify((actions & _UA_CLEANUP_PHASE) && actions & (_UA_FORCE_UNWIND));
+	verify(!(actions & (_UA_SEARCH_PHASE | _UA_HANDER_FRAME)));
+
+	if ( actions & _UA_END_OF_STACK ) {
+		exit(1);
+	} else {
+		return _URC_NO_REASON;
+	}
 }
 
@@ -282,17 +288,22 @@
 			version, actions, exception_class, unwind_exception, unwind_context);
 
-	// If we've reached the end of the stack then there is nothing much we can do...
-	if (actions & _UA_END_OF_STACK) return _URC_END_OF_STACK;
-
+	// Verify that actions follow the rules we expect.
+	// This function should never be called at the end of the stack.
+	verify(!(actions & _UA_END_OF_STACK));
+	// Either only the search phase flag is set or...
 	if (actions & _UA_SEARCH_PHASE) {
+		verify(actions == _UA_SEARCH_PHASE);
 		__cfaabi_dbg_print_safe(" lookup phase");
-	}
-	else if (actions & _UA_CLEANUP_PHASE) {
+	// ... we are in clean-up phase.
+	} else {
+		verify(actions & _UA_CLEANUP_PHASE);
 		__cfaabi_dbg_print_safe(" cleanup phase");
-	}
-	// Just in case, probably can't actually happen
-	else {
-		printf(" error\n");
-		return _URC_FATAL_PHASE1_ERROR;
+		// We shouldn't be the handler frame during forced unwind.
+		if (actions & _UA_HANDLER_FRAME) {
+			verify(!(actions & _UA_FORCE_UNWIND));
+			__cfaabi_dbg_print_safe(" (handler frame)");
+		} else if (actions & _UA_FORCE_UNWIND) {
+			__cfaabi_dbg_print_safe(" (force unwind)");
+		}
 	}
 
@@ -396,5 +407,5 @@
 			// This is only a cleanup handler, ignore it
 			__cfaabi_dbg_print_safe(" no action");
-		} else if (actions & _UA_CLEANUP_PHASE) {
+		} else {
 			// In clean-up phase, no destructors here but this could be the handler.
 
@@ -434,5 +445,5 @@
 
 #pragma GCC push_options
-#pragma GCC optimize("O0")
+#pragma GCC optimize("no-toplevel-reorder")
 
 // Try statements are hoisted out see comments for details. While this could probably be unique
