diff options
author | Matthew Pickering <matthewtpickering@gmail.com> | 2021-10-08 10:18:13 +0100 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-10-12 19:17:15 -0400 |
commit | ff0409d0847a24bdbd76c358960c86263b219179 (patch) | |
tree | 6dd4de5cdd5110427177fb2d3920fda5c397ae3e | |
parent | 0d7117916541d6bb0041200e128ce4088086a973 (diff) | |
download | haskell-ff0409d0847a24bdbd76c358960c86263b219179.tar.gz |
driver: Filter out HPT modules **before** typecheck loop
It's better to remove the modules first before performing the
typecheckLoop as otherwise you can end up with thunks which reference
stale HomeModInfo which are difficult to force due to the knot-tie.
-rw-r--r-- | compiler/GHC/Driver/Make.hs | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/compiler/GHC/Driver/Make.hs b/compiler/GHC/Driver/Make.hs index 7f740f0123..362303a5c8 100644 --- a/compiler/GHC/Driver/Make.hs +++ b/compiler/GHC/Driver/Make.hs @@ -1255,8 +1255,6 @@ function GHC.IfaceToCore.typecheckIface does exactly that. Following this fix, GHC can compile itself with --make -O2. -} --- NB: sometimes mods has duplicates; this is harmless because --- any duplicates get clobbered in addListToHpt and never get forced. typecheckLoop :: HscEnv -> [HomeModInfo] -> IO [(ModuleName, HomeModInfo)] typecheckLoop hsc_env hmis = do debugTraceMsg logger 2 $ @@ -1265,6 +1263,7 @@ typecheckLoop hsc_env hmis = do let new_hpt = addListToHpt old_hpt new_mods let new_hsc_env = hscUpdateHPT (const new_hpt) hsc_env -- Crucial, crucial: initIfaceLoad clears the if_rec_types field. + -- See [KnotVars invariants] mds <- initIfaceLoad new_hsc_env $ mapM (typecheckIface . hm_iface) hmis let new_mods = [ (mn,hmi{ hm_details = details }) @@ -1274,7 +1273,10 @@ typecheckLoop hsc_env hmis = do where logger = hsc_logger hsc_env - old_hpt = hsc_HPT hsc_env + to_delete = (map (moduleName . mi_module . hm_iface) hmis) + -- Filter out old modules before tying the knot, otherwise we can end + -- up with a thunk which keeps reference to the old HomeModInfo. + !old_hpt = foldl' delFromHpt (hsc_HPT hsc_env) to_delete -- --------------------------------------------------------------------------- -- |