; 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
-> 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
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)
= 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}
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));"
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);