summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Pickering <matthewtpickering@gmail.com>2021-05-04 07:51:48 +0100
committerMatthew Pickering <matthewtpickering@gmail.com>2021-05-04 07:51:48 +0100
commitd3ad7a94ecb4037278826eb599b2de0d19b900e9 (patch)
treeca5fc4fd82a9f4adec630af7395e9247c2785dd9
parent0b06da03c4a24b098f8b6cf07b48f683ce0f167e (diff)
downloadhaskell-d3ad7a94ecb4037278826eb599b2de0d19b900e9.tar.gz
Small improvements to getLinkDeps
-rw-r--r--compiler/GHC/Driver/Dependencies.hs24
-rw-r--r--compiler/GHC/HsToCore/Usage.hs2
-rw-r--r--compiler/GHC/Linker/Loader.hs5
3 files changed, 15 insertions, 16 deletions
diff --git a/compiler/GHC/Driver/Dependencies.hs b/compiler/GHC/Driver/Dependencies.hs
index 416dfd7422..d26f3f5991 100644
--- a/compiler/GHC/Driver/Dependencies.hs
+++ b/compiler/GHC/Driver/Dependencies.hs
@@ -97,7 +97,8 @@ findHomeModules hsc_env home_unit mns = go mns mempty
-- | Find all depedencies that we need to link, used for GHCi and
-- interface file dependency calculation
-getLinkDeps :: HscEnv
+getLinkDeps :: SDoc
+ -> HscEnv
-> HomePackageTable
-- Already loaded things.
-> ([UnitId] -- Packages
@@ -110,13 +111,11 @@ getLinkDeps :: HscEnv
-> IO ([Linkable], [UnitId]) -- ... then link these first
-- Fails with an IO exception if it can't find enough files
-getLinkDeps hsc_env hpt (loaded_pkgs, objs, bcos) replace_osuf span mods pkgs
+getLinkDeps herald hsc_env hpt (loaded_pkgs, objs, bcos) replace_osuf span mods pkgs
-- Find all the packages and linkables that a set of modules depends on
= do {
-- 1. Find the dependent home-pkg-modules/packages from each iface
- -- (omitting modules from the interactive package, which is already linked)
- ; (mods_s, pkgs_s) <- follow_deps (filterOut isInteractiveModule mods)
- emptyUniqDSet emptyUniqDSet;
+ ; (mods_s, pkgs_s) <- follow_deps mods emptyUniqDSet emptyUniqDSet;
; let {
-- 2. Exclude ones already linked
@@ -137,11 +136,10 @@ getLinkDeps hsc_env hpt (loaded_pkgs, objs, bcos) replace_osuf span mods pkgs
where
dflags = hsc_dflags hsc_env
- -- The ModIface contains the transitive closure of the module dependencies
- -- within the current package, *except* for boot modules: if we encounter
- -- a boot module, we have to find its real interface and discover the
- -- dependencies of that. Hence we need to traverse the dependency
- -- tree recursively. See bug #936, testcase ghci/prog007.
+ -- The ModIface only contains the direct module dependencies
+ -- within the current package so we have to recurse to find all
+ -- the transitive dependencies.
+ -- See bug #936, testcase ghci/prog007.
follow_deps :: [Module] -- modules to follow
-> UniqDSet ModuleName -- accum. module dependencies
-> UniqDSet UnitId -- accum. package dependencies
@@ -180,8 +178,8 @@ getLinkDeps hsc_env hpt (loaded_pkgs, objs, bcos) replace_osuf span mods pkgs
else follow_deps (map (mkHomeModule home_unit) mod_deps' ++ mods)
acc_mods' acc_pkgs'
where
- msg = text "need to link module" <+> ppr mod <+>
- text "due to use of Template Haskell"
+ msg = text "need to find module dependencies" <+> ppr mod <+>
+ text "due to" <+> herald
link_boot_mod_error mod =
@@ -198,7 +196,7 @@ getLinkDeps hsc_env hpt (loaded_pkgs, objs, bcos) replace_osuf span mods pkgs
dieWith :: DynFlags -> SrcSpan -> SDoc -> IO a
dieWith dflags span msg = throwGhcExceptionIO (ProgramError (showSDoc dflags (mkLocMessage MCFatal span msg)))
- while_linking_expr = text "while linking an interpreted expression"
+ while_linking_expr = text "while finding linking dependencies for an expression"
-- This one is a build-system bug
diff --git a/compiler/GHC/HsToCore/Usage.hs b/compiler/GHC/HsToCore/Usage.hs
index aa669c2abe..ebfe8f8e9e 100644
--- a/compiler/GHC/HsToCore/Usage.hs
+++ b/compiler/GHC/HsToCore/Usage.hs
@@ -178,7 +178,7 @@ One way to improve this is to either:
mkPluginUsage2 :: HscEnv -> [Module] -> [UnitId] -> IO [Usage]
mkPluginUsage2 hsc_env mods pkgs = do
- (ls, us) <- getLinkDeps hsc_env (hsc_HPT hsc_env) ([], [], []) Nothing noSrcSpan mods pkgs
+ (ls, us) <- getLinkDeps (text "usage") hsc_env (hsc_HPT hsc_env) ([], [], []) Nothing noSrcSpan mods pkgs
ds <-
case hsc_interp hsc_env of
Just interp -> fst <$> computePackagesDeps interp hsc_env us
diff --git a/compiler/GHC/Linker/Loader.hs b/compiler/GHC/Linker/Loader.hs
index 032197ea9c..5c0aacafe2 100644
--- a/compiler/GHC/Linker/Loader.hs
+++ b/compiler/GHC/Linker/Loader.hs
@@ -194,8 +194,9 @@ loadDependencies interp hsc_env pls span needed_mods = do
maybe_normal_osuf <- checkNonStdWay dflags interp span
-- Find what packages and linkables are required
- (lnks, pkgs) <- getLinkDeps hsc_env hpt (pkgs_loaded pls, objs_loaded pls, bcos_loaded pls)
- maybe_normal_osuf span needed_mods []
+ -- (omitting modules from the interactive package, which is already linked)
+ (lnks, pkgs) <- getLinkDeps (text "linking") hsc_env hpt (pkgs_loaded pls, objs_loaded pls, bcos_loaded pls)
+ maybe_normal_osuf span (filterOut isInteractiveModule needed_mods) []
-- Link the packages and modules required
pls1 <- loadPackages' interp hsc_env pkgs pls