X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FException.cmm;h=a3f3dd0d8290aad57c8ad12b72bbbec46d0661c5;hb=e943c43f3d673beebff117b660ba45cefc246ad0;hp=bf5893e21ab85640ce0bfa830e46e4fd39d1f9cb;hpb=53a5d0b0186379be1fb378b1ed591ff5f359178c;p=ghc-hetmet.git diff --git a/rts/Exception.cmm b/rts/Exception.cmm index bf5893e..a3f3dd0 100644 --- a/rts/Exception.cmm +++ b/rts/Exception.cmm @@ -68,6 +68,16 @@ INFO_TABLE_RET( stg_unblockAsyncExceptionszh_ret, * we are about to raise an async exception in the current * thread, which might result in the thread being killed. */ + +#ifndef REG_R1 + /* + * raiseAsync assumes that the stack is in ThreadRunGHC state, + * i.e. with a return address on the top. In unreg mode, the + * return value for IO is on top of the return address, so we + * need to make a small adjustment here. + */ + Sp_adj(1); +#endif SAVE_THREAD_STATE(); r = foreign "C" maybePerformBlockedException (MyCapability() "ptr", CurrentTSO "ptr") [R1]; @@ -82,6 +92,15 @@ INFO_TABLE_RET( stg_unblockAsyncExceptionszh_ret, jump %ENTRY_CODE(Sp(0)); } } +#ifndef REG_R1 + /* + * Readjust stack in unregisterised mode if we didn't raise an + * exception, see above + */ + else { + Sp_adj(-1); + } +#endif } #ifdef REG_R1