summaryrefslogtreecommitdiff
path: root/rts/HeapStackCheck.cmm
diff options
context:
space:
mode:
authorGeoffrey Mainland <gmainlan@microsoft.com>2012-10-29 17:32:10 +0000
committerGeoffrey Mainland <gmainlan@microsoft.com>2012-10-30 12:50:54 +0000
commit3db0254253a20473c774dccdb37e3b79464b5b41 (patch)
treef4d31c719d1653727b6e0fdb61b1f9b33292a2aa /rts/HeapStackCheck.cmm
parentf9265dd369b9e269349930012c25e670248f2a09 (diff)
downloadhaskell-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.cmm13
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];
}