From 5c089c20af055312ade6e9bbb2ca27e470b0bf81 Mon Sep 17 00:00:00 2001 From: sof Date: Wed, 3 Mar 1999 19:10:37 +0000 Subject: [PATCH] [project @ 1999-03-03 19:10:37 by sof] - moved the Bool closure table to here (don't want to end up accidentally mangling it.) - startupHaskell: for Win32 DLLs, initialise the various closure tables now that the DLLs have been loaded and the closure addresses are in scope. --- ghc/rts/RtsStartup.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/ghc/rts/RtsStartup.c b/ghc/rts/RtsStartup.c index bd09db7..fc31f16 100644 --- a/ghc/rts/RtsStartup.c +++ b/ghc/rts/RtsStartup.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: RtsStartup.c,v 1.7 1999/02/11 17:40:27 simonm Exp $ + * $Id: RtsStartup.c,v 1.8 1999/03/03 19:10:37 sof Exp $ * * (c) The GHC Team, 1998-1999 * @@ -30,6 +30,19 @@ #include "LLC.h" #endif +#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 +}; + /* * Flag Structure */ @@ -37,6 +50,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 +128,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(); } -- 1.7.10.4