diff options
author | Matthew Pickering <matthewtpickering@gmail.com> | 2021-05-04 07:51:48 +0100 |
---|---|---|
committer | Matthew Pickering <matthewtpickering@gmail.com> | 2021-05-04 07:51:48 +0100 |
commit | d3ad7a94ecb4037278826eb599b2de0d19b900e9 (patch) | |
tree | ca5fc4fd82a9f4adec630af7395e9247c2785dd9 | |
parent | 0b06da03c4a24b098f8b6cf07b48f683ce0f167e (diff) | |
download | haskell-d3ad7a94ecb4037278826eb599b2de0d19b900e9.tar.gz |
Small improvements to getLinkDeps
-rw-r--r-- | compiler/GHC/Driver/Dependencies.hs | 24 | ||||
-rw-r--r-- | compiler/GHC/HsToCore/Usage.hs | 2 | ||||
-rw-r--r-- | compiler/GHC/Linker/Loader.hs | 5 |
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 |