[project @ 2000-10-16 16:34:33 by sewardj]
[ghc-hetmet.git] / ghc / rts / RtsStartup.c
index 37bc4c0..f992f1b 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: RtsStartup.c,v 1.37 2000/03/31 03:09:36 hwloidl Exp $
+ * $Id: RtsStartup.c,v 1.43 2000/10/06 15:35:47 simonmar Exp $
  *
  * (c) The GHC Team, 1998-2000
  *
 #include "StgStartup.h"
 #include "Prelude.h"           /* fixupRTStoPreludeRefs */
 
+#ifdef GHCI
+#include "HsFFI.h"
+#include "Linker.h"
+#endif
+
 #if defined(PROFILING) || defined(DEBUG)
-# include "ProfRts.h"
+# include "Profiling.h"
 # include "ProfHeap.h"
 #endif
 
@@ -53,6 +58,26 @@ EXTFUN(__init_Prelude);
 static void initModules ( void * );
 
 void
+setProgArgv(int argc, char *argv[])
+{
+   /* Usually this is done by startupHaskell, so we don't need to call this. 
+      However, sometimes Hugs wants to change the arguments which Haskell
+      getArgs >>= ... will be fed.  So you can do that by calling here
+      _after_ calling startupHaskell.
+   */
+   prog_argc = argc;
+   prog_argv = argv;
+}
+
+void
+getProgArgv(int *argc, char **argv[])
+{
+   *argc = prog_argc;
+   *argv = prog_argv;
+}
+
+
+void
 startupHaskell(int argc, char *argv[], void *init_root)
 {
     /* To avoid repeated initialisations of the RTS */
@@ -123,6 +148,11 @@ startupHaskell(int argc, char *argv[], void *init_root)
     /* initialize the storage manager */
     initStorage();
 
+    /* initialise the object linker, if necessary */
+#ifdef GHCI
+    initLinker();
+#endif
+
     /* initialise the stable pointer table */
     initStablePtrTable();
 
@@ -196,29 +226,33 @@ startupHaskell(int argc, char *argv[], void *init_root)
    StgRun to call this stuff.
    -------------------------------------------------------------------------- */
 
-#ifndef INTERPRETER
-
 /* The init functions use an explicit stack... 
  */
 #define INIT_STACK_SIZE  (BLOCK_SIZE * 4)
 F_ *init_stack = NULL;
 nat init_sp = 0;
 
+#ifndef INTERPRETER
 static void
 initModules ( void *init_root )
 {
-  init_sp = 0;
-  init_stack = (F_ *)allocate(INIT_STACK_SIZE / sizeof(W_));
-  init_stack[init_sp++] = (F_)stg_init_ret;
-  init_stack[init_sp++] = (F_)__init_Prelude;
-  if (init_root != NULL) {
-    init_stack[init_sp++] = (F_)init_root;
-  }
-
-  MainRegTable.rSp = (P_)(init_stack + init_sp);
-  StgRun((StgFunPtr)stg_init, NULL/* no reg table */);
-}
+#ifdef SMP
+    Capability cap;
+#else
+#define cap MainRegTable
+#endif
 
+    init_sp = 0;
+    init_stack = (F_ *)allocate(INIT_STACK_SIZE / sizeof(W_));
+    init_stack[init_sp++] = (F_)stg_init_ret;
+    init_stack[init_sp++] = (F_)__init_Prelude;
+    if (init_root != NULL) {
+       init_stack[init_sp++] = (F_)init_root;
+    }
+    
+    cap.rSp = (P_)(init_stack + init_sp);
+    StgRun((StgFunPtr)stg_init, &cap);
+}
 #endif /* !INTERPRETER */
 
 /* -----------------------------------------------------------------------------