summaryrefslogtreecommitdiff
path: root/compiler/codeGen/CodeGen.lhs
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2010-04-28 20:49:14 +0000
committerSimon Marlow <marlowsd@gmail.com>2010-04-28 20:49:14 +0000
commit9105c03ffef568aab097a293313eb6ff4f0dd5dc (patch)
tree4622666683b836ecb0521e671c61a88d4d9e2570 /compiler/codeGen/CodeGen.lhs
parent5dfe6b1d583acc2dda0c0fd203f66c7c54a1131b (diff)
downloadhaskell-9105c03ffef568aab097a293313eb6ff4f0dd5dc.tar.gz
omit "dyn" from the way appended to the __stginit label
When GHCi is linked dynamically, we still want to be able to load non-dynamic object files.
Diffstat (limited to 'compiler/codeGen/CodeGen.lhs')
-rw-r--r--compiler/codeGen/CodeGen.lhs21
1 files changed, 13 insertions, 8 deletions
diff --git a/compiler/codeGen/CodeGen.lhs b/compiler/codeGen/CodeGen.lhs
index 106fcc1cf1..81267f21f9 100644
--- a/compiler/codeGen/CodeGen.lhs
+++ b/compiler/codeGen/CodeGen.lhs
@@ -65,8 +65,6 @@ codeGen dflags this_mod data_tycons imported_mods
cost_centre_info stg_binds hpc_info
= do
{ showPass dflags "CodeGen"
- ; let way = buildTag dflags
- main_mod = mainModIs dflags
-- Why?
-- ; mapM_ (\x -> seq x (return ())) data_tycons
@@ -74,9 +72,8 @@ codeGen dflags this_mod data_tycons imported_mods
; code_stuff <- initC dflags this_mod $ do
{ cmm_binds <- mapM (getCmm . cgTopBinding dflags) stg_binds
; cmm_tycons <- mapM cgTyCon data_tycons
- ; cmm_init <- getCmm (mkModuleInit way cost_centre_info
- this_mod main_mod
- imported_mods hpc_info)
+ ; cmm_init <- getCmm (mkModuleInit dflags cost_centre_info
+ this_mod imported_mods hpc_info)
; return (cmm_binds ++ concat cmm_tycons ++ [cmm_init])
}
-- Put datatype_stuff after code_stuff, because the
@@ -134,14 +131,13 @@ We initialise the module tree by keeping a work-stack,
\begin{code}
mkModuleInit
- :: String -- the "way"
+ :: DynFlags
-> CollectedCCs -- cost centre info
-> Module
- -> Module -- name of the Main module
-> [Module]
-> HpcInfo
-> Code
-mkModuleInit way cost_centre_info this_mod main_mod imported_mods hpc_info
+mkModuleInit dflags cost_centre_info this_mod imported_mods hpc_info
= do { -- Allocate the static boolean that records if this
-- module has been registered already
emitData Data [CmmDataLabel moduleRegdLabel,
@@ -182,6 +178,15 @@ mkModuleInit way cost_centre_info this_mod main_mod imported_mods hpc_info
(emitSimpleProc plain_main_init_lbl rec_descent_init)
}
where
+ -- The way string we attach to the __stginit label to catch
+ -- accidental linking of modules compiled in different ways. We
+ -- omit "dyn" from this way, because we want to be able to load
+ -- both dynamic and non-dynamic modules into a dynamic GHC.
+ way = mkBuildTag (filter want_way (ways dflags))
+ want_way w = not (wayRTSOnly w) && wayName w /= WayDyn
+
+ main_mod = mainModIs dflags
+
plain_init_lbl = mkPlainModuleInitLabel this_mod
real_init_lbl = mkModuleInitLabel this_mod way
plain_main_init_lbl = mkPlainModuleInitLabel rOOT_MAIN