[project @ 1999-03-16 13:20:07 by simonm]
[ghc-hetmet.git] / ghc / rts / RtsStartup.c
index 5ad4a17..5155d66 100644 (file)
@@ -1,5 +1,7 @@
 /* -----------------------------------------------------------------------------
- * $Id: RtsStartup.c,v 1.4 1999/01/22 10:58:43 simonm Exp $
+ * $Id: RtsStartup.c,v 1.9 1999/03/09 14:27:06 sewardj Exp $
+ *
+ * (c) The GHC Team, 1998-1999
  *
  * Main function for a standalone Haskell program.
  *
@@ -10,7 +12,7 @@
 #include "RtsUtils.h"
 #include "RtsFlags.h"  
 #include "Storage.h"    /* initStorage, exitStorage */
-#include "StablePtr.h"  /* initStablePtrTable */
+#include "StablePriv.h" /* initStablePtrTable */
 #include "Schedule.h"   /* initScheduler */
 #include "Stats.h"      /* initStats */
 #include "Weak.h"
 #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
  */
@@ -35,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
@@ -104,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();
 }
@@ -112,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.