From: Thomas Schilling Date: Wed, 26 Nov 2008 18:34:02 +0000 (+0000) Subject: Force recompilation of BCOs when they were compiled in HscNothing mode. X-Git-Tag: 2009-03-13~390 X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=5e0453cad41cb0f004c1680b392d79651053a1d4 Force recompilation of BCOs when they were compiled in HscNothing mode. Previously, loading a set of modules in HscNothing mode and then switching to HscInterpreted could lead to crashes since modules compiled with HscNothing were thought to be valid bytecode objects. This patch forces recompilation in these cases, hence switching between HscNothing and HscInterpreted should be safe now. --- diff --git a/compiler/main/GHC.hs b/compiler/main/GHC.hs index f3e0199..00b373a 100644 --- a/compiler/main/GHC.hs +++ b/compiler/main/GHC.hs @@ -1567,6 +1567,19 @@ upsweep_mod hsc_env old_hpt (stable_obj, stable_bco) summary mod_index nmods compile_it_discard_iface = compile hsc_env summary' mod_index nmods Nothing + -- With the HscNothing target we create empty linkables to avoid + -- recompilation. We have to detect these to recompile anyway if + -- the target changed since the last compile. + is_fake_linkable + | Just hmi <- old_hmi, Just l <- hm_linkable hmi = + null (linkableUnlinked l) + | otherwise = + -- we have no linkable, so it cannot be fake + False + + implies False _ = True + implies True x = x + in case () of _ @@ -1589,7 +1602,8 @@ upsweep_mod hsc_env old_hpt (stable_obj, stable_bco) summary mod_index nmods -- object is stable, but we need to load the interface -- off disk to make a HMI. - | not (isObjectTarget target), is_stable_bco -> + | not (isObjectTarget target), is_stable_bco, + (target /= HscNothing) `implies` not is_fake_linkable -> ASSERT(isJust old_hmi) -- must be in the old_hpt let Just hmi = old_hmi in do liftIO $ debugTraceMsg (hsc_dflags hsc_env) 5 @@ -1601,6 +1615,7 @@ upsweep_mod hsc_env old_hpt (stable_obj, stable_bco) summary mod_index nmods Just hmi <- old_hmi, Just l <- hm_linkable hmi, not (isObjectLinkable l), + (target /= HscNothing) `implies` not is_fake_linkable, linkableTime l >= ms_hs_date summary -> do liftIO $ debugTraceMsg (hsc_dflags hsc_env) 5 (text "compiling non-stable BCO mod:" <+> ppr this_mod_name) diff --git a/compiler/main/HscTypes.lhs b/compiler/main/HscTypes.lhs index 0d83a92..1d3f4dc 100644 --- a/compiler/main/HscTypes.lhs +++ b/compiler/main/HscTypes.lhs @@ -1992,8 +1992,14 @@ data Linkable = LM { -- (i.e. when the bytecodes were produced, -- or the mod date on the files) linkableModule :: Module, -- ^ The linkable module itself - linkableUnlinked :: [Unlinked] -- ^ Those files and chunks of code we have - -- yet to link + linkableUnlinked :: [Unlinked] + -- ^ Those files and chunks of code we have yet to link. + -- + -- INVARIANT: A valid linkable always has at least one 'Unlinked' item. + -- If this list is empty, the Linkable represents a fake linkable, which + -- is generated in HscNothing mode to avoid recompiling modules. + -- + -- XXX: Do items get removed from this list when they get linked? } isObjectLinkable :: Linkable -> Bool