diff options
author | Geoffrey Mainland <gmainlan@microsoft.com> | 2012-10-29 17:32:10 +0000 |
---|---|---|
committer | Geoffrey Mainland <gmainlan@microsoft.com> | 2012-10-30 12:50:54 +0000 |
commit | 3db0254253a20473c774dccdb37e3b79464b5b41 (patch) | |
tree | f4d31c719d1653727b6e0fdb61b1f9b33292a2aa /rts/HeapStackCheck.cmm | |
parent | f9265dd369b9e269349930012c25e670248f2a09 (diff) | |
download | haskell-3db0254253a20473c774dccdb37e3b79464b5b41.tar.gz |
Save and restore registers across calls to unlockClosure.
We may not assume that registers are saved across calls to unlockClosure because
it could call a C function on some platforms.
Diffstat (limited to 'rts/HeapStackCheck.cmm')
-rw-r--r-- | rts/HeapStackCheck.cmm | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/rts/HeapStackCheck.cmm b/rts/HeapStackCheck.cmm index 4fd44302f5..b3ae2648d9 100644 --- a/rts/HeapStackCheck.cmm +++ b/rts/HeapStackCheck.cmm @@ -509,7 +509,12 @@ INFO_TABLE_RET ( stg_block_takemvar, RET_SMALL, W_ info_ptr, P_ mvar ) // code fragment executed just before we return to the scheduler stg_block_takemvar_finally { + W_ r1, r3; + r1 = R1; + r3 = R3; unlockClosure(R3, stg_MVAR_DIRTY_info); + R1 = r1; + R3 = r3; jump StgReturn [R1]; } @@ -532,7 +537,12 @@ INFO_TABLE_RET( stg_block_putmvar, RET_SMALL, W_ info_ptr, // code fragment executed just before we return to the scheduler stg_block_putmvar_finally { + W_ r1, r3; + r1 = R1; + r3 = R3; unlockClosure(R3, stg_MVAR_DIRTY_info); + R1 = r1; + R3 = r3; jump StgReturn [R1]; } @@ -565,7 +575,10 @@ stg_block_throwto_finally // unlocked. It may have been unlocked if we revoked the message // due to an exception being raised during threadPaused(). if (StgHeader_info(StgTSO_block_info(CurrentTSO)) == stg_WHITEHOLE_info) { + W_ r1; + r1 = R1; unlockClosure(StgTSO_block_info(CurrentTSO), stg_MSG_THROWTO_info); + R1 = r1; } jump StgReturn [R1]; } |