[project @ 1999-03-17 13:19:19 by simonm]
[ghc-hetmet.git] / ghc / rts / RtsStartup.c
index a0e976e..5155d66 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: RtsStartup.c,v 1.6 1999/02/05 16:02:50 simonm Exp $
+ * $Id: RtsStartup.c,v 1.9 1999/03/09 14:27:06 sewardj Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
 #include "LLC.h"
 #endif
 
+#ifdef COMPILER
+#ifndef aix_TARGET_OS /* AIX gives link errors with this as a const (RO assembler section) */
+const 
+#endif 
+  StgClosure *PrelBase_Bool_closure_tbl[] = {
+#ifndef HAVE_WIN32_DLL_SUPPORT
+    &False_closure,
+    &True_closure
+#else
+    &dummy_ret_closure,
+    &dummy_ret_closure
+#endif
+};
+#endif
+
 /*
  * Flag Structure
  */
@@ -37,6 +52,15 @@ struct RTS_FLAGS RtsFlags;
 
 extern void startupHaskell(int argc, char *argv[])
 {
+    static int rts_has_started_up = 0;
+    int i;
+
+    /* To avoid repeated initialisations of the RTS */
+   if (rts_has_started_up)
+     return;
+   else
+     rts_has_started_up=1;
+
 #if defined(PAR)
     int nPEs = 0;                  /* Number of PEs */
 #endif
@@ -106,7 +130,26 @@ extern void startupHaskell(int argc, char *argv[])
 #if 0
     initUserSignals();
 #endif
-
+    /* When the RTS and Prelude live in separate DLLs,
+       we need to patch up the char- and int-like tables
+       that the RTS keep after both DLLs have been loaded,
+       filling in the tables with references to where the
+       static info tables have been loaded inside the running
+       process.
+       
+       Ditto for Bool closure tbl.
+    */
+#ifdef HAVE_WIN32_DLL_SUPPORT
+    for(i=0;i<=255;i++)
+       (CHARLIKE_closure[i]).header.info = (const StgInfoTable*)&Czh_static_info;
+
+    for(i=0;i<=32;i++)
+       (INTLIKE_closure[i]).header.info = (const StgInfoTable*)&Izh_static_info;
+       
+    PrelBase_Bool_closure_tbl[0] = (const StgClosure*)&False_closure;
+    PrelBase_Bool_closure_tbl[1] = (const StgClosure*)&True_closure;
+#endif
     /* Record initialization times */
     end_init();
 }
@@ -114,8 +157,8 @@ extern void startupHaskell(int argc, char *argv[])
 void
 shutdownHaskell(void)
 {
-  /* Finalise any remaining weak pointers */
-  finaliseWeakPointersNow();
+  /* Finalize any remaining weak pointers */
+  finalizeWeakPointersNow();
 
 #if defined(GRAN)
   #error FixMe.