don't make -ddump-if-trace imply -no-recomp
[ghc-hetmet.git] / rts / Exception.cmm
index a0a6db4..75f2c15 100644 (file)
@@ -13,6 +13,8 @@
 #include "Cmm.h"
 #include "RaiseAsync.h"
 
+import ghczmprim_GHCziBool_True_closure;
+
 /* -----------------------------------------------------------------------------
    Exception Primitives
 
@@ -71,6 +73,14 @@ INFO_TABLE_RET( stg_unblockAsyncExceptionszh_ret, RET_SMALL )
          */
         Sp_adj(1);
 #endif
+        STK_CHK_GEN( WDS(2), R1_PTR, stg_unblockAsyncExceptionszh_ret_info);
+        Sp_adj(-2);
+        Sp(1) = R1;
+#ifdef REG_R1
+        Sp(0) = stg_gc_unpt_r1_info;
+#else
+        Sp(0) = stg_ut_1_0_unreg_info;
+#endif
         SAVE_THREAD_STATE();
         (r) = foreign "C" maybePerformBlockedException (MyCapability() "ptr", 
                                                      CurrentTSO "ptr") [R1];
@@ -210,6 +220,11 @@ killThreadzh_fast
      * If the exception went to a catch frame, we'll just continue from
      * the handler.
      */
+  loop:
+    if (StgTSO_what_next(target) == ThreadRelocated::I16) {
+        target = StgTSO_link(target);
+        goto loop;
+    }
     if (target == CurrentTSO) {
        SAVE_THREAD_STATE();
        /* ToDo: what if the current thread is blocking exceptions? */
@@ -426,14 +441,15 @@ retry_pop_stack:
             // be per-thread.
             W_[rts_stop_on_exception] = 0;
             ("ptr" ioAction) = foreign "C" deRefStablePtr (W_[rts_breakpoint_io_action] "ptr") [];
-            Sp = Sp - WDS(6);
-            Sp(5) = exception;
-            Sp(4) = stg_raise_ret_info;
+            Sp = Sp - WDS(7);
+            Sp(6) = exception;
+            Sp(5) = stg_raise_ret_info;
+            Sp(4) = stg_noforceIO_info;    // required for unregisterised
             Sp(3) = exception;             // the AP_STACK
-            Sp(2) = base_GHCziBase_True_closure; // dummy breakpoint info
-            Sp(1) = base_GHCziBase_True_closure; // True <=> a breakpoint
+            Sp(2) = ghczmprim_GHCziBool_True_closure; // dummy breakpoint info
+            Sp(1) = ghczmprim_GHCziBool_True_closure; // True <=> a breakpoint
             R1 = ioAction;
-            jump stg_ap_pppv_info;
+            jump RET_LBL(stg_ap_pppv);
         }
     }