summaryrefslogtreecommitdiff
path: root/compiler/GHC/Iface/Recomp.hs
diff options
context:
space:
mode:
authorMatthew Pickering <matthewtpickering@gmail.com>2021-06-08 20:49:49 +0100
committerMatthew Pickering <matthewtpickering@gmail.com>2021-06-08 20:49:49 +0100
commitb95ccfb24d5b51a68ee173e04564e98d6a8f6180 (patch)
treeec1ccfcddfe2f98c37dac3bbc6b4ab30b2b44d8f /compiler/GHC/Iface/Recomp.hs
parent9e724f6e5bcb31abd270ea44fb01b1edb18f626f (diff)
downloadhaskell-wip/hash-file-cache.tar.gz
FinderCache: Also cache file hashing in interface file checkswip/hash-file-cache
Now that we hash object files to decide when to recompile due to TH, this can make a big difference as each interface file in a project will contain reference to the object files of all package dependencies. Especially when these are statically linked, hashing them can add up. The cache is invalidated when `depanalPartial` is called, like the normal finder cache.
Diffstat (limited to 'compiler/GHC/Iface/Recomp.hs')
-rw-r--r--compiler/GHC/Iface/Recomp.hs21
1 files changed, 10 insertions, 11 deletions
diff --git a/compiler/GHC/Iface/Recomp.hs b/compiler/GHC/Iface/Recomp.hs
index 68ca5bfdbe..7759aea72d 100644
--- a/compiler/GHC/Iface/Recomp.hs
+++ b/compiler/GHC/Iface/Recomp.hs
@@ -271,7 +271,7 @@ checkVersions hsc_env mod_summary iface
when (isOneShot (ghcMode (hsc_dflags hsc_env))) $ do {
; updateEps_ $ \eps -> eps { eps_is_boot = mkModDeps $ (dep_boot_mods (mi_deps iface)) }
}
- ; recomp <- checkList [checkModUsage (homeUnitAsUnit home_unit) u
+ ; recomp <- checkList [checkModUsage (hsc_FC hsc_env) (homeUnitAsUnit home_unit) u
| u <- mi_usages iface]
; return (recomp, Just iface)
}}}}}}}}}}}
@@ -550,8 +550,8 @@ getFromModIface doc_msg mod getter
-- | Given the usage information extracted from the old
-- M.hi file for the module being compiled, figure out
-- whether M needs to be recompiled.
-checkModUsage :: Unit -> Usage -> IfG RecompileRequired
-checkModUsage _this_pkg UsagePackageModule{
+checkModUsage :: FinderCache -> Unit -> Usage -> IfG RecompileRequired
+checkModUsage _ _this_pkg UsagePackageModule{
usg_mod = mod,
usg_mod_hash = old_mod_hash } = do
logger <- getLogger
@@ -563,19 +563,19 @@ checkModUsage _this_pkg UsagePackageModule{
-- recompile. This is safe but may entail more recompilation when
-- a dependent package has changed.
-checkModUsage _ UsageMergedRequirement{ usg_mod = mod, usg_mod_hash = old_mod_hash } = do
+checkModUsage _ _ UsageMergedRequirement{ usg_mod = mod, usg_mod_hash = old_mod_hash } = do
logger <- getLogger
needInterface mod $ \iface -> do
let reason = moduleNameString (moduleName mod) ++ " changed (raw)"
checkModuleFingerprint logger reason old_mod_hash (mi_mod_hash (mi_final_exts iface))
-checkModUsage this_pkg UsageHomeModuleInterface{ usg_mod_name = mod_name, usg_iface_hash = old_mod_hash } = do
+checkModUsage _ this_pkg UsageHomeModuleInterface{ usg_mod_name = mod_name, usg_iface_hash = old_mod_hash } = do
let mod = mkModule this_pkg mod_name
logger <- getLogger
needInterface mod $ \iface -> do
let reason = moduleNameString (moduleName mod) ++ " changed (interface)"
checkIfaceFingerprint logger reason old_mod_hash (mi_iface_hash (mi_final_exts iface))
-checkModUsage this_pkg UsageHomeModule{
+checkModUsage _ this_pkg UsageHomeModule{
usg_mod_name = mod_name,
usg_mod_hash = old_mod_hash,
usg_exports = maybe_old_export_hash,
@@ -602,19 +602,18 @@ checkModUsage this_pkg UsageHomeModule{
(text " Export list changed") $ do
-- CHECK ITEMS ONE BY ONE
- recompile <- checkList [ checkEntityUsage logger reason new_decl_hash u
- | u <- old_decl_hash]
+ !recompile <- checkList [ checkEntityUsage logger reason new_decl_hash u
+ | u <- old_decl_hash]
if recompileRequired recompile
then return recompile -- This one failed, so just bail out now
else up_to_date logger (text " Great! The bits I use are up to date")
-
-checkModUsage _this_pkg UsageFile{ usg_file_path = file,
+checkModUsage fc _this_pkg UsageFile{ usg_file_path = file,
usg_file_hash = old_hash,
usg_file_label = mlabel } =
liftIO $
handleIO handler $ do
- new_hash <- getFileHash file
+ new_hash <- lookupFileCache fc file
if (old_hash /= new_hash)
then return recomp
else return UpToDate