X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FRtsStartup.c;h=75102f473a46f7e256b420d1a3c9235b4eaed8ca;hb=b5bafea8126d85bdf7017664644e2d8135c3ba1e;hp=e02426a124e270a9dde07d3f0dc9cdf8e0669771;hpb=dac8c9b9e8b570b81bea7077b6b2b98c70f20c70;p=ghc-hetmet.git diff --git a/ghc/rts/RtsStartup.c b/ghc/rts/RtsStartup.c index e02426a..75102f4 100644 --- a/ghc/rts/RtsStartup.c +++ b/ghc/rts/RtsStartup.c @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- - * $Id: RtsStartup.c,v 1.32 2000/03/09 11:49:34 simonmar Exp $ + * $Id: RtsStartup.c,v 1.39 2000/04/03 16:28:08 simonmar Exp $ * - * (c) The GHC Team, 1998-1999 + * (c) The GHC Team, 1998-2000 * * Main function for a standalone Haskell program. * @@ -21,9 +21,10 @@ #include "Ticky.h" #include "StgRun.h" #include "StgStartup.h" +#include "Prelude.h" /* fixupRTStoPreludeRefs */ #if defined(PROFILING) || defined(DEBUG) -# include "ProfRts.h" +# include "Profiling.h" # include "ProfHeap.h" #endif @@ -48,15 +49,12 @@ static int rts_has_started_up = 0; static ullong startTime = 0; #endif -static void initModules ( void ); +EXTFUN(__init_Prelude); +static void initModules ( void * ); void -startupHaskell(int argc, char *argv[]) +startupHaskell(int argc, char *argv[], void *init_root) { -#ifdef ENABLE_WIN32_DLL_SUPPORT - int i; -#endif - /* To avoid repeated initialisations of the RTS */ if (rts_has_started_up) return; @@ -134,7 +132,7 @@ startupHaskell(int argc, char *argv[]) /* run the per-module initialisation code */ #if !defined(INTERPRETER) - initModules(); + initModules(init_root); #endif #if defined(PROFILING) || defined(DEBUG) @@ -160,21 +158,14 @@ startupHaskell(int argc, char *argv[]) init_default_handlers(); #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. +#if !defined(INTERPRETER) + /* Initialise pointers from the RTS to the prelude. + Only for compiled code -- the interpreter + will call this itself later, so don't do so now. */ -#ifdef ENABLE_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; - + fixupRTStoPreludeRefs(NULL); #endif + /* Record initialization times */ end_init(); } @@ -195,10 +186,10 @@ startupHaskell(int argc, char *argv[]) - we supply a unique integer to each statically declared cost centre and cost centre stack in the program. - The code generator inserts a small function "__init_" in each + The code generator inserts a small function "__init_" in each module and calls the registration functions in each of the modules - it imports. So, if we call "__init_Main", each reachable module in the - program will be registered. + it imports. So, if we call "__init_PrelMain", each reachable module in the + program will be registered (because PrelMain.mainIO calls Main.main). The init* functions are compiled in the same way as STG code, i.e. without normal C call/return conventions. Hence we must use @@ -210,17 +201,24 @@ startupHaskell(int argc, char *argv[]) /* The init functions use an explicit stack... */ #define INIT_STACK_SIZE (BLOCK_SIZE * 4) -F_ *init_stack; +F_ *init_stack = NULL; +nat init_sp = 0; static void -initModules ( void ) +initModules ( void *init_root ) { - /* this storage will be reclaimed by the garbage collector, - * as a large block. - */ - init_stack = (F_ *)allocate(INIT_STACK_SIZE / sizeof(W_)); - - StgRun((StgFunPtr)stg_init, NULL/* no reg table */); + Capability cap; + + 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 */ @@ -271,6 +269,10 @@ shutdownHaskell(void) resetNonBlockingFd(1); resetNonBlockingFd(2); +#if defined(PAR) + shutdownParallelSystem(0); +#endif + /* stop timing the shutdown, we're about to print stats */ stat_endExit(); @@ -293,10 +295,6 @@ shutdownHaskell(void) rts_has_started_up=0; -#if defined(PAR) - shutdownParallelSystem(0); -#endif - } /*