[commit: ghc] master: Save R1/R2/.. across foreign calls (8b25d39)

Simon Marlow <[email protected]>
Newsgroups gmane.comp.lang.haskell.cvs.ghc
Message-ID <[email protected]>
Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/8b25d3953f2fa7055dc217e77a849cac92d2aa78

>---------------------------------------------------------------

commit 8b25d3953f2fa7055dc217e77a849cac92d2aa78
Author: Simon Marlow <[email protected]>
Date:   Fri Nov 2 11:28:16 2012 +0000

    Save R1/R2/.. across foreign calls

>---------------------------------------------------------------

 rts/Exception.cmm |   17 +++++++++++++----
 1 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/rts/Exception.cmm b/rts/Exception.cmm
index 3f1dc10..2b63328 100644
--- a/rts/Exception.cmm
+++ b/rts/Exception.cmm
@@ -55,6 +55,9 @@ INFO_TABLE_RET(stg_unmaskAsyncExceptionszh_ret, RET_SMALL, W_ info_ptr)
 {
     CInt r;
 
+    P_ ret;
+    ret = R1;
+
     StgTSO_flags(CurrentTSO) = %lobits32(
       TO_W_(StgTSO_flags(CurrentTSO)) & ~(TSO_BLOCKEX|TSO_INTERRUPTIBLE));
 
@@ -68,18 +71,18 @@ INFO_TABLE_RET(stg_unmaskAsyncExceptionszh_ret, RET_SMALL, W_ info_ptr)
          * thread, which might result in the thread being killed.
          */
         Sp_adj(-2);
-        Sp(1) = R1;
+        Sp(1) = ret;
         Sp(0) = stg_ret_p_info;
         SAVE_THREAD_STATE();
         (r) = ccall maybePerformBlockedException (MyCapability() "ptr", 
                                                       CurrentTSO "ptr");
-
         if (r != 0::CInt) {
             if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) {
                 jump stg_threadFinished [];
             } else {
                 LOAD_THREAD_STATE();
                 ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
+                R1 = ret;
                 jump %ENTRY_CODE(Sp(0)) [R1];
             }
         }
@@ -94,6 +97,7 @@ INFO_TABLE_RET(stg_unmaskAsyncExceptionszh_ret, RET_SMALL, W_ info_ptr)
     }
 
     Sp_adj(1);
+    R1 = ret;
     jump %ENTRY_CODE(Sp(0)) [R1];
 }
 
@@ -184,7 +188,10 @@ stg_unmaskAsyncExceptionszh /* explicit stack */
     W_ level;
 
     /* Args: R1 :: IO a */
-    STK_CHK_P (WDS(4), stg_unmaskAsyncExceptionszh, R1);
+    P_ io;
+    io = R1;
+
+    STK_CHK_P (WDS(4), stg_unmaskAsyncExceptionszh, io);
     /* 4 words: one for the unblock frame, 3 for setting up the
      * stack to call maybePerformBlockedException() below.
      */
@@ -222,7 +229,7 @@ stg_unmaskAsyncExceptionszh /* explicit stack */
              */
             Sp_adj(-3);
             Sp(2) = stg_ap_v_info;
-            Sp(1) = R1;
+            Sp(1) = io;
             Sp(0) = stg_enter_info;
 
             SAVE_THREAD_STATE();
@@ -235,6 +242,7 @@ stg_unmaskAsyncExceptionszh /* explicit stack */
 	        } else {
 	            LOAD_THREAD_STATE();
 	            ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16);
+                    R1 = io;
                     jump %ENTRY_CODE(Sp(0)) [R1];
 	        }
             } else {
@@ -246,6 +254,7 @@ stg_unmaskAsyncExceptionszh /* explicit stack */
     }
     TICK_UNKNOWN_CALL();
     TICK_SLOW_CALL_v();
+    R1 = io;
     jump stg_ap_v_fast [R1];
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.