diff options
author | sof <unknown> | 2005-04-22 16:01:54 +0000 |
---|---|---|
committer | sof <unknown> | 2005-04-22 16:01:54 +0000 |
commit | a584b4ffc67402ed3086f7acb8ff46f50dc787cc (patch) | |
tree | 0b12666d41c0509ca88883e0e0669ed84516b51d /ghc/compiler/codeGen | |
parent | f4b456822742dc8b7afcd392f74f450a4d9c1c92 (diff) | |
download | haskell-a584b4ffc67402ed3086f7acb8ff46f50dc787cc.tar.gz |
[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.
Diffstat (limited to 'ghc/compiler/codeGen')
-rw-r--r-- | ghc/compiler/codeGen/CodeGen.lhs | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/ghc/compiler/codeGen/CodeGen.lhs b/ghc/compiler/codeGen/CodeGen.lhs index 3e346f6d15..a649ebd28d 100644 --- a/ghc/compiler/codeGen/CodeGen.lhs +++ b/ghc/compiler/codeGen/CodeGen.lhs @@ -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} |