From fcc9fa26d8b6f34a646aeb570fb93fc67c49b7ab Mon Sep 17 00:00:00 2001
From: simonmar <unknown>
Date: Fri, 4 Feb 2000 11:15:04 +0000
Subject: [PATCH] [project @ 2000-02-04 11:15:04 by simonmar] Fix bug #1 in the
 unregisterised RTS:

Now that catch# is a fully-fledged IO operation, it has to respect the
return convention for IO, in particular if we don't have an R1
(eg. when unregisterised) then the return value goes on the stack.

The return convention could be better, after all we use R1 when
returning normal values, but I'll just fix it for now.
---
 ghc/rts/Exception.hc | 43 +++++++++++++++++++++++++++++++++----------
 1 file changed, 33 insertions(+), 10 deletions(-)

diff --git a/ghc/rts/Exception.hc b/ghc/rts/Exception.hc
index 56eeb87fa751..1ad991d55206 100644
--- a/ghc/rts/Exception.hc
+++ b/ghc/rts/Exception.hc
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Exception.hc,v 1.6 2000/01/30 10:25:28 simonmar Exp $
+ * $Id: Exception.hc,v 1.7 2000/02/04 11:15:04 simonmar Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -199,6 +199,7 @@ FN_(killThreadzh_fast)
    Catch frames
    -------------------------------------------------------------------------- */
 
+#ifdef REG_R1
 #define CATCH_FRAME_ENTRY_TEMPLATE(label,ret) 	\
    FN_(label);					\
    FN_(label)					\
@@ -209,16 +210,38 @@ FN_(killThreadzh_fast)
       JMP_(ret);				\
       FE_					\
    }
+#else
+#define CATCH_FRAME_ENTRY_TEMPLATE(label,ret) 	\
+   FN_(label);					\
+   FN_(label)					\
+   {						\
+      StgWord rval;				\
+      FB_					\
+      rval = Sp[0];				\
+      Sp++;					\
+      Su = ((StgCatchFrame *)Sp)->link;		\
+      Sp += sizeofW(StgCatchFrame) - 1;		\
+      Sp[0] = rval;				\
+      JMP_(ret);				\
+      FE_					\
+   }
+#endif
+
+#ifdef REG_R1
+#define SP_OFF 0
+#else
+#define SP_OFF 1
+#endif
 
-CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_entry,ENTRY_CODE(Sp[0]));
-CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_0_entry,RET_VEC(Sp[0],0));
-CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_1_entry,RET_VEC(Sp[0],1));
-CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_2_entry,RET_VEC(Sp[0],2));
-CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_3_entry,RET_VEC(Sp[0],3));
-CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_4_entry,RET_VEC(Sp[0],4));
-CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_5_entry,RET_VEC(Sp[0],5));
-CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_6_entry,RET_VEC(Sp[0],6));
-CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_7_entry,RET_VEC(Sp[0],7));
+CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_entry,ENTRY_CODE(Sp[SP_OFF]));
+CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_0_entry,RET_VEC(Sp[SP_OFF],0));
+CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_1_entry,RET_VEC(Sp[SP_OFF],1));
+CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_2_entry,RET_VEC(Sp[SP_OFF],2));
+CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_3_entry,RET_VEC(Sp[SP_OFF],3));
+CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_4_entry,RET_VEC(Sp[SP_OFF],4));
+CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_5_entry,RET_VEC(Sp[SP_OFF],5));
+CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_6_entry,RET_VEC(Sp[SP_OFF],6));
+CATCH_FRAME_ENTRY_TEMPLATE(catch_frame_7_entry,RET_VEC(Sp[SP_OFF],7));
 
 #ifdef PROFILING
 #define CATCH_FRAME_BITMAP 7
-- 
GitLab