projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Vital follow-up to fix of Trac #2045
[ghc-hetmet.git]
/
rts
/
Exception.cmm
diff --git
a/rts/Exception.cmm
b/rts/Exception.cmm
index
a0a6db4
..
75f2c15
100644
(file)
--- a/
rts/Exception.cmm
+++ b/
rts/Exception.cmm
@@
-13,6
+13,8
@@
#include "Cmm.h"
#include "RaiseAsync.h"
#include "Cmm.h"
#include "RaiseAsync.h"
+import ghczmprim_GHCziBool_True_closure;
+
/* -----------------------------------------------------------------------------
Exception Primitives
/* -----------------------------------------------------------------------------
Exception Primitives
@@
-71,6
+73,14
@@
INFO_TABLE_RET( stg_unblockAsyncExceptionszh_ret, RET_SMALL )
*/
Sp_adj(1);
#endif
*/
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];
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.
*/
* 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? */
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") [];
// 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(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;
R1 = ioAction;
- jump stg_ap_pppv_info;
+ jump RET_LBL(stg_ap_pppv);
}
}
}
}