[project @ 2002-11-20 15:40:32 by simonpj]
[ghc-hetmet.git] / ghc / rts / StgStartup.hc
index cb8beca..660bf35 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: StgStartup.hc,v 1.8 2000/03/16 12:40:40 simonmar Exp $
+ * $Id: StgStartup.hc,v 1.19 2002/07/16 14:56:09 simonmar Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -7,6 +7,7 @@
  *
  * ---------------------------------------------------------------------------*/
 
+#include "Stg.h"
 #include "Rts.h"
 #include "StgRun.h" /* StgReturn */
 #include "StgStartup.h"
@@ -44,8 +45,8 @@
 
 EXTFUN(stg_stop_thread_entry);
 
-#ifdef PROFILING
-#define STOP_THREAD_BITMAP 1
+#if defined(PROFILING)
+#define STOP_THREAD_BITMAP 3
 #else
 #define STOP_THREAD_BITMAP 0
 #endif
@@ -76,12 +77,15 @@ STGFUN(stg_stop_thread_entry)
      * tidy up the registers and return to the scheduler.
     */
 
-    /* Move Su just off the end of the stack, we're about to spam the
-     * STOP_FRAME with the return value.
+    /* Move Sp to the last word on the stack, and Su to just past the end
+     * of the stack.  We then place the return value at the top of the stack.
      */
+    Sp += sizeofW(StgStopFrame) - 1;
     Su = (StgUpdateFrame *)(Sp+1);  
     Sp[0] = R1.w;
 
+    CurrentTSO->what_next = ThreadComplete;
+
     SaveThreadState(); /* inline! */
 
     /* R1 contains the return value of the thread */
@@ -129,14 +133,8 @@ STGFUN(stg_enterStackTop)
   
 /* -----------------------------------------------------------------------------
    Special STG entry points for module registration.
-
-   This stuff is problematic for Hugs, because it introduces a
-   dependency between the RTS and the program (ie. __init_Main).  So
-   we currently disable module initialisation for Hugs.
    -------------------------------------------------------------------------- */
 
-#ifndef INTERPRETER 
-
 extern F_ *init_stack;
 
 STGFUN(stg_init_ret)
@@ -146,21 +144,14 @@ STGFUN(stg_init_ret)
   FE_
 }
 
+/* On entry to stg_init:
+ *    init_stack[0] = &stg_init_ret;
+ *    init_stack[1] = __stginit_Something;
+ */
 STGFUN(stg_init)
 {
-  EF_(__init_Main);
-  EF_(__init_Prelude);
   FB_
-  Sp = (P_)init_stack;
-  PUSH_INIT_STACK(stg_init_ret);
-  PUSH_INIT_STACK(__init_Prelude);
-  JMP_(__init_Main);
+  Sp = BaseReg->rSp;
+  JMP_(POP_INIT_STACK());
   FE_
 }
-
-/* PrelGHC doesn't really exist... */
-
-START_MOD_INIT(__init_PrelGHC);
-END_MOD_INIT();
-
-#endif /* !INTERPRETER */