After looking this up, I was wrong about dlopen() handling
the invocation of .ctors constructors for you. That makes
the behaviour consistent across platforms, at least.

Irrespective of how these module constructors end being
handled, not running them in GHCi is a shortcoming. Perhaps
we should document that somewhere?

--sigbjorn

----- Original Message ----- From: "Sigbjorn Finne" <[EMAIL PROTECTED]>
To: "Wolfgang Thaller" <[EMAIL PROTECTED]>
Cc: <[EMAIL PROTECTED]>
Sent: Monday, May 16, 2005 06:50
Subject: Re: stginit and Win32



Sure, commit away. I'll try out the next nightly HEAD build
to see whether or not that does it.

Assuming it does, there is now the issue of ELF-based platforms
running the .ctors constructor code upon loading (which I
presume dlopen() does for you..), but nowhere else. Could lead
to non-obvious bugs.

--sigbjorn

----- Original Message ----- From: "Simon Marlow" <[EMAIL PROTECTED]>
To: "Wolfgang Thaller" <[EMAIL PROTECTED]>; "Sigbjorn Finne" <[EMAIL PROTECTED]>
Cc: <[EMAIL PROTECTED]>
Sent: Monday, May 16, 2005 03:22
Subject: RE: stginit and Win32



I'm waiting for Sigbjorn to give the nod on this one, but it's fine by
me.  The -u __stginit_Prelude looks like a relic.

Cheers,
Simon

On 15 May 2005 06:07, Wolfgang Thaller wrote:

Hi,

would it be OK to commit this change to the PE linker, to ignore
constructor sections like the ELF and Mach-O linkers do:

Index: ghc/rts/Linker.c
===================================================================
RCS file: /home/cvs/root/fptools/ghc/rts/Linker.c,v
retrieving revision 1.193
diff -u -r1.193 Linker.c
--- ghc/rts/Linker.c    11 May 2005 00:31:11 -0000    1.193
+++ ghc/rts/Linker.c    15 May 2005 03:34:23 -0000
@@ -1982,6 +1983,8 @@
               information. */
            && 0 != strcmp(".stab", sectab_i->Name)
            && 0 != strcmp(".stabstr", sectab_i->Name)
+          /* ignore constructor section for now */
+          && 0 != strcmp(".ctors", sectab_i->Name)
           ) {
           errorBelch("Unknown PEi386 section name `%s' (while
processing: %s)", sectab_i->Name, oc->fileName);
           return 0;

It's untested, but I can't see what can possibly go wrong - famous
last words ;-).
We could then remove the mingw32 special case for stginit functions
(patches below).
A note on ghc/rts/package.conf.in: I don't think the -u
__stginit_Prelude is needed any
more in any case (I don't see why it should be necessary at all, and
my Mac OS build works
happily without it even with stginit functions).

Cheers,

Wolfgang


Index: ghc/compiler/codeGen/CodeGen.lhs =================================================================== RCS file: /home/cvs/root/fptools/ghc/compiler/codeGen/CodeGen.lhs,v retrieving revision 1.71 diff -u -r1.71 CodeGen.lhs --- ghc/compiler/codeGen/CodeGen.lhs 15 May 2005 03:20:29 -0000 1.71 +++ ghc/compiler/codeGen/CodeGen.lhs 15 May 2005 03:34:16 -0000 @@ -150,7 +150,7 @@ -> Code mkModuleInit dflags way cost_centre_info this_mod mb_main_mod foreign_stubs imported_mods = do { - if need_init_code + if opt_SccProfilingOn then do { -- Allocate the static boolean that records if this -- module has been registered already emitData Data [CmmDataLabel moduleRegdLabel, @@ -204,10 +204,6 @@ stmtC (CmmStore (mkLblExpr moduleRegdLabel) (CmmLit (mkIntCLit 1))) -- Now do local stuff -#if defined(mingw32_HOST_OS) - -- ... until the GHCi Linker can load files with constructor functions: - ; registerForeignExports foreign_stubs -#endif ; initCostCentres cost_centre_info ; mapCs (registerModuleImport dflags way) (imported_mods++extra_imported_mods) @@ -218,12 +214,6 @@ ret_code = stmtsC [ CmmAssign spReg (cmmRegOffW spReg 1) , CmmJump (CmmLoad (cmmRegOffW spReg (-1)) wordRep) [] ] -#if defined(mingw32_HOST_OS) - need_init_code = True -#else - need_init_code = opt_SccProfilingOn -#endif - ----------------------- registerModuleImport :: DynFlags -> String -> Module -> Code registerModuleImport dflags way mod @@ -232,18 +222,6 @@ | otherwise -- Push the init procedure onto the work stack = stmtsC [ CmmAssign spReg (cmmRegOffW spReg (-1)) , CmmStore (CmmReg spReg) (mkLblExpr (mkModuleInitLabel dflags mod way)) ] - ------------------------ -registerForeignExports :: ForeignStubs -> Code -registerForeignExports NoStubs - = nopC -registerForeignExports (ForeignStubs _ _ _ fe_bndrs) - = mapM_ mk_export_register fe_bndrs - where - mk_export_register bndr - = emitRtsCall SLIT("getStablePtr") - [ (CmmLit (CmmLabel (mkLocalClosureLabel (idName bndr))), - PtrHint) ] \end{code} Index: ghc/compiler/deSugar/DsForeign.lhs =================================================================== RCS file: /home/cvs/root/fptools/ghc/compiler/deSugar/DsForeign.lhs,v retrieving revision 1.91 diff -u -r1.91 DsForeign.lhs --- ghc/compiler/deSugar/DsForeign.lhs 15 May 2005 03:20:29 -0000 1.91 +++ ghc/compiler/deSugar/DsForeign.lhs 15 May 2005 03:34:17 -0000 @@ -540,21 +540,10 @@ -- the program. -- (this is bad for big umbrella modules like Graphics.Rendering.OpenGL) - -- the only reason for making the mingw32 (anything targetting PE, really) stick - -- out here is that the GHCi linker isn't capable of handling .ctors sections - useStaticConstructors -#if defined(mingw32_HOST_OS) - = False -#else - = True -#endif - initialiser = case maybe_target of Nothing -> empty - Just hs_fn - | not useStaticConstructors -> empty - | otherwise -> + Just hs_fn -> vcat [ text "static void stginit_export_" <> ppr hs_fn <> text "() __attribute__((constructor));" Index: ghc/rts/package.conf.in =================================================================== RCS file: /home/cvs/root/fptools/ghc/rts/package.conf.in,v retrieving revision 1.15 diff -u -r1.15 package.conf.in --- ghc/rts/package.conf.in 22 Apr 2005 16:53:48 -0000 1.15 +++ ghc/rts/package.conf.in 15 May 2005 03:34:24 -0000 @@ -99,9 +99,6 @@ , "-u", "_GHCziIOBase_BlockedIndefinitely_closure" , "-u", "_GHCziIOBase_Deadlock_closure" , "-u", "_GHCziWeak_runFinalizzerBatch_closure" -#if defined(mingw32_HOST_OS) - , "-u", "__stginit_Prelude" -#endif #else "-u", "GHCziBase_Izh_static_info" , "-u", "GHCziBase_Czh_static_info" @@ -135,9 +132,6 @@ , "-u", "GHCziIOBase_BlockedIndefinitely_closure" , "-u", "GHCziIOBase_Deadlock_closure" , "-u", "GHCziWeak_runFinalizzerBatch_closure" -#if defined(mingw32_HOST_OS) - , "-u", "__stginit_Prelude" -#endif #endif framework-dirs:

_______________________________________________
Cvs-ghc mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/cvs-ghc


_______________________________________________ Cvs-ghc mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/cvs-ghc
_______________________________________________
Cvs-ghc mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to