Commit a584b4ff authored by sof's avatar sof

[project @ 2005-04-22 16:01:53 by sof]

Until the GHCi linker is made capable of handling .ctors sections in
PEi object files, stick with __stginits. Being a bit sloppy by
using 'mingw32_HOST_OS' to test for this.
parent f4b45682
......@@ -87,9 +87,14 @@ codeGen dflags this_mod type_env foreign_stubs imported_mods
; cmm_tycons <- mapM cgTyCon data_tycons
; cmm_init <- getCmm (mkModuleInit dflags way cost_centre_info
this_mod mb_main_mod
imported_mods)
foreign_stubs imported_mods)
; return (cmm_binds ++ concat cmm_tycons
++ if opt_SccProfilingOn then [cmm_init] else [])
++ if opt_SccProfilingOn
#if defined(mingw32_HOST_OS)
|| True
#endif
then [cmm_init]
else [])
}
-- Put datatype_stuff after code_stuff, because the
-- datatype closure table (for enumeration types) to
......@@ -151,9 +156,10 @@ mkModuleInit
-> CollectedCCs -- cost centre info
-> Module
-> Maybe String -- Just m ==> we have flag: -main-is Foo.baz
-> ForeignStubs
-> [Module]
-> Code
mkModuleInit dflags way cost_centre_info this_mod mb_main_mod imported_mods
mkModuleInit dflags way cost_centre_info this_mod mb_main_mod foreign_stubs imported_mods
= do {
-- Allocate the static boolean that records if this
......@@ -212,6 +218,9 @@ mkModuleInit dflags way cost_centre_info this_mod mb_main_mod imported_mods
stmtC (CmmStore (mkLblExpr moduleRegdLabel) (CmmLit (mkIntCLit 1)))
-- Now do local stuff
#if defined(mingw32_HOST_OS)
; registerForeignExports foreign_stubs
#endif
; initCostCentres cost_centre_info
; mapCs (registerModuleImport dflags way)
(imported_mods++extra_imported_mods)
......@@ -227,6 +236,17 @@ registerModuleImport dflags way mod
= 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}
......
......@@ -530,10 +530,21 @@ mkFExportCBits c_nm maybe_target arg_htys res_hty is_IO_res_ty cc
Nothing -> empty
Just hs_fn -> text "extern StgClosure " <> ppr hs_fn <> text "_closure" <> semi
-- 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 ->
Just hs_fn
| not useStaticConstructors -> empty
| otherwise ->
vcat
[ text "static void stginit_export_" <> ppr hs_fn
<> text "() __attribute__((constructor));"
......
......@@ -49,7 +49,8 @@ int main(int argc, char *argv[])
SchedulerStatus status;
/* all GranSim/GUM init is done in startupHaskell; sets IAmMainThread! */
#if defined(PROFILING)
#if defined(PROFILING) || defined(mingw32_HOST_OS)
/* mingw32 and PROFILING (still) define __stginits in .text */
startupHaskell(argc,argv,__stginit_ZCMain);
#else
startupHaskell(argc,argv,NULL);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment