stginit and Win32
Sigbjorn Finne
sof at galois.com
Mon May 16 09:50:16 EDT 2005
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" <simonmar at microsoft.com>
To: "Wolfgang Thaller" <wolfgang.thaller at gmx.net>; "Sigbjorn Finne"
<sof at galois.com>
Cc: <cvs-ghc at haskell.org>
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
>> Cvs-ghc at haskell.org
>> http://www.haskell.org/mailman/listinfo/cvs-ghc
>
More information about the Cvs-ghc
mailing list