summaryrefslogtreecommitdiff
path: root/compiler/GHC/Driver/Pipeline.hs
diff options
context:
space:
mode:
authorMatthew Pickering <matthewtpickering@gmail.com>2021-04-07 10:57:06 +0100
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-04-14 05:07:45 -0400
commit726da09e76d0832b5aedd5b78624435695ac04e7 (patch)
tree61c013968fc4a218562a647c1860696ef9ff95a8 /compiler/GHC/Driver/Pipeline.hs
parentb665d9833b13d9d4241ff56585bbf45d2fcf2278 (diff)
downloadhaskell-726da09e76d0832b5aedd5b78624435695ac04e7.tar.gz
Always generate ModDetails from ModIface
This vastly reduces memory usage when compiling with `--make` mode, from about 900M when compiling Cabal to about 300M. As a matter of uniformity, it also ensures that reading from an interface performs the same as using the in-memory cache. We can also delete all the horrible knot-tying in updateIdInfos. Goes some way to fixing #13586 Accept new output of tests fixing some bugs along the way ------------------------- Metric Decrease: T12545 -------------------------
Diffstat (limited to 'compiler/GHC/Driver/Pipeline.hs')
-rw-r--r--compiler/GHC/Driver/Pipeline.hs22
1 files changed, 9 insertions, 13 deletions
diff --git a/compiler/GHC/Driver/Pipeline.hs b/compiler/GHC/Driver/Pipeline.hs
index 0a75b62248..e6b7be62ef 100644
--- a/compiler/GHC/Driver/Pipeline.hs
+++ b/compiler/GHC/Driver/Pipeline.hs
@@ -87,7 +87,6 @@ import GHC.Data.StringBuffer ( hGetStringBuffer, hPutStringBuffer )
import GHC.Data.Maybe ( expectJust )
import GHC.Iface.Make ( mkFullIface )
-import GHC.Iface.UpdateIdInfos ( updateModDetailsIdInfos )
import GHC.Types.Basic ( SuccessFlag(..) )
import GHC.Types.Target
@@ -100,7 +99,6 @@ import GHC.Unit.Env
import GHC.Unit.State
import GHC.Unit.Finder
import GHC.Unit.Module.ModSummary
-import GHC.Unit.Module.ModDetails
import GHC.Unit.Module.ModIface
import GHC.Unit.Module.Graph (needsTemplateHaskellOrQQ)
import GHC.Unit.Module.Deps
@@ -258,13 +256,15 @@ compileOne' m_tc_result mHscMessage
return $! HomeModInfo iface hmi_details (Just linkable)
(HscRecomp { hscs_guts = cgguts,
hscs_mod_location = mod_location,
- hscs_mod_details = hmi_details,
hscs_partial_iface = partial_iface,
hscs_old_iface_hash = mb_old_iface_hash
}, Interpreter) -> do
-- In interpreted mode the regular codeGen backend is not run so we
-- generate a interface without codeGen info.
final_iface <- mkFullIface hsc_env' partial_iface Nothing
+ -- Reconstruct the `ModDetails` from the just-constructed `ModIface`
+ -- See Note [ModDetails and --make mode]
+ hmi_details <- liftIO $ initModDetails hsc_env' summary final_iface
liftIO $ hscMaybeWriteIface logger dflags True final_iface mb_old_iface_hash (ms_location summary)
(hasStub, comp_bc, spt_entries) <- hscInteractive hsc_env' cgguts mod_location
@@ -291,7 +291,7 @@ compileOne' m_tc_result mHscMessage
(Temporary TFL_CurrentModule)
basename dflags next_phase (Just location)
-- We're in --make mode: finish the compilation pipeline.
- (_, _, Just (iface, details)) <- runPipeline StopLn hsc_env'
+ (_, _, Just iface) <- runPipeline StopLn hsc_env'
(output_fn,
Nothing,
Just (HscOut src_flavour mod_name status))
@@ -302,6 +302,8 @@ compileOne' m_tc_result mHscMessage
-- The object filename comes from the ModLocation
o_time <- getModificationUTCTime object_filename
let !linkable = LM o_time this_mod [DotO object_filename]
+ -- See Note [ModDetails and --make mode]
+ details <- initModDetails hsc_env' summary iface
return $! HomeModInfo iface details (Just linkable)
where dflags0 = ms_hspp_opts summary
@@ -712,7 +714,7 @@ runPipeline
-> PipelineOutput -- ^ Output filename
-> Maybe ModLocation -- ^ A ModLocation, if this is a Haskell module
-> [FilePath] -- ^ foreign objects
- -> IO (DynFlags, FilePath, Maybe (ModIface, ModDetails))
+ -> IO (DynFlags, FilePath, Maybe ModIface)
-- ^ (final flags, output filename, interface)
runPipeline stop_phase hsc_env0 (input_fn, mb_input_buf, mb_phase)
mb_basename output maybe_loc foreign_os
@@ -842,7 +844,7 @@ runPipeline'
-> FilePath -- ^ Input filename
-> Maybe ModLocation -- ^ A ModLocation, if this is a Haskell module
-> [FilePath] -- ^ foreign objects, if we have one
- -> IO (DynFlags, FilePath, Maybe (ModIface, ModDetails))
+ -> IO (DynFlags, FilePath, Maybe ModIface)
-- ^ (final flags, output filename, interface)
runPipeline' start_phase hsc_env env input_fn
maybe_loc foreign_os
@@ -1374,7 +1376,6 @@ runPhase (HscOut src_flavour mod_name result) _ = do
return (RealPhase StopLn, o_file)
HscRecomp { hscs_guts = cgguts,
hscs_mod_location = mod_location,
- hscs_mod_details = mod_details,
hscs_partial_iface = partial_iface,
hscs_old_iface_hash = mb_old_iface_hash
}
@@ -1387,12 +1388,7 @@ runPhase (HscOut src_flavour mod_name result) _ = do
let dflags = hsc_dflags hsc_env'
final_iface <- liftIO (mkFullIface hsc_env' partial_iface (Just cg_infos))
- let final_mod_details
- | gopt Opt_OmitInterfacePragmas dflags
- = mod_details
- | otherwise = {-# SCC updateModDetailsIdInfos #-}
- updateModDetailsIdInfos cg_infos mod_details
- setIface final_iface final_mod_details
+ setIface final_iface
-- See Note [Writing interface files]
liftIO $ hscMaybeWriteIface logger dflags False final_iface mb_old_iface_hash mod_location