summaryrefslogtreecommitdiff
path: root/compiler/GHC/Unit/State.hs
diff options
context:
space:
mode:
authorSylvain Henry <sylvain@haskus.fr>2020-05-15 15:17:53 +0200
committerMarge Bot <ben+marge-bot@smart-cactus.org>2020-06-13 02:13:03 -0400
commit598cc1dde543807902fd502b5e2f8050ebac1fa5 (patch)
tree96e91ac66f959658361b5a251c5c7e395bbed49c /compiler/GHC/Unit/State.hs
parentae900605c4860684c51584dac271956635eb60cc (diff)
downloadhaskell-598cc1dde543807902fd502b5e2f8050ebac1fa5.tar.gz
Move wiring of homeUnitInstantiations outside of mkUnitState
Diffstat (limited to 'compiler/GHC/Unit/State.hs')
-rw-r--r--compiler/GHC/Unit/State.hs24
1 files changed, 16 insertions, 8 deletions
diff --git a/compiler/GHC/Unit/State.hs b/compiler/GHC/Unit/State.hs
index b13d5e00b3..537e375f9a 100644
--- a/compiler/GHC/Unit/State.hs
+++ b/compiler/GHC/Unit/State.hs
@@ -333,8 +333,10 @@ data UnitState = UnitState {
-- users refer to packages in Backpack includes.
packageNameMap :: Map PackageName IndefUnitId,
- -- | A mapping from wired in names to the original names from the
- -- package database.
+ -- | A mapping from database unit keys to wired in unit ids.
+ wireMap :: Map UnitId UnitId,
+
+ -- | A mapping from wired in unit ids to unit keys from the database.
unwireMap :: Map UnitId UnitId,
-- | The packages we're going to link in eagerly. This list
@@ -375,6 +377,7 @@ emptyUnitState = UnitState {
unitInfoMap = Map.empty,
preloadClosure = emptyUniqSet,
packageNameMap = Map.empty,
+ wireMap = Map.empty,
unwireMap = Map.empty,
preloadUnits = [],
explicitUnits = [],
@@ -512,15 +515,21 @@ initUnits dflags = withTiming dflags
| gopt Opt_DistrustAllPackages dflags = map distrust_all read_pkg_dbs
| otherwise = read_pkg_dbs
- (state, preload, insts) <- mkUnitState dflags pkg_dbs []
+ (state, preload) <- mkUnitState dflags pkg_dbs []
dumpIfSet_dyn (dflags { pprCols = 200 }) Opt_D_dump_mod_map "Mod Map"
FormatText
(pprModuleMap (moduleNameProvidersMap state))
+ -- Some wired units can be used to instantiate the home unit. We need to
+ -- replace their unit key by their wired unit id.
+ let wiringMap = wireMap state
+ unwiredInsts = homeUnitInstantiations dflags
+ wiredInsts = map (fmap (upd_wired_in_mod wiringMap)) unwiredInsts
+
return (dflags{ unitDatabases = Just read_pkg_dbs,
unitState = state,
- homeUnitInstantiations = insts },
+ homeUnitInstantiations = wiredInsts },
preload)
where
forcePkgDb (dflags, _) = unitInfoMap (unitState dflags) `seq` ()
@@ -1355,8 +1364,7 @@ mkUnitState
-> [UnitDatabase UnitId]
-> [UnitId] -- preloaded packages
-> IO (UnitState,
- [UnitId], -- new packages to preload
- [(ModuleName, Module)])
+ [UnitId]) -- new packages to preload
mkUnitState dflags dbs preload0 = do
{-
@@ -1593,6 +1601,7 @@ mkUnitState dflags dbs preload0 = do
, moduleNameProvidersMap = mod_map
, pluginModuleNameProvidersMap = mkModuleNameProvidersMap dflags pkg_db emptyUniqSet plugin_vis_map
, packageNameMap = pkgname_map
+ , wireMap = wired_map
, unwireMap = Map.fromList [ (v,k) | (k,v) <- Map.toList wired_map ]
, requirementContext = req_ctx
@@ -1601,8 +1610,7 @@ mkUnitState dflags dbs preload0 = do
-- instantiated on-the-fly (see Note [About units] in GHC.Unit)
, allowVirtualUnits = homeUnitIsIndefinite dflags
}
- let new_insts = map (fmap (upd_wired_in_mod wired_map)) (homeUnitInstantiations dflags)
- return (pstate, new_dep_preload, new_insts)
+ return (pstate, new_dep_preload)
-- | Given a wired-in 'Unit', "unwire" it into the 'Unit'
-- that it was recorded as in the package database.