/* -----------------------------------------------------------------------------
- * $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
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 */
/* initialize the storage manager */
initStorage();
+ /* initialise the object linker, if necessary */
+#ifdef GHCI
+ initLinker();
+#endif
+
/* initialise the stable pointer table */
initStablePtrTable();
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 */
/* -----------------------------------------------------------------------------