Cheng Shao pushed to branch wip/hiddenmodules-uniqset at Glasgow Haskell Compiler / GHC
Commits:
-
fbf8d52b
by Cheng Shao at 2025-08-16T19:39:35+02:00
-
96513732
by Cheng Shao at 2025-08-16T19:42:26+02:00
7 changed files:
- compiler/GHC/Driver/Config/Finder.hs
- compiler/GHC/Driver/DynFlags.hs
- compiler/GHC/Driver/Make.hs
- compiler/GHC/Driver/Session.hs
- compiler/GHC/HsToCore/Docs.hs
- compiler/GHC/Unit/Finder.hs
- compiler/GHC/Unit/Finder/Types.hs
Changes:
... | ... | @@ -9,7 +9,7 @@ import GHC.Driver.DynFlags |
9 | 9 | import GHC.Unit.Finder.Types
|
10 | 10 | import GHC.Data.FastString
|
11 | 11 | import GHC.Data.OsPath
|
12 | -import qualified Data.Map as Map
|
|
12 | +import GHC.Types.Unique.Map
|
|
13 | 13 | |
14 | 14 | -- | Create a new 'FinderOpts' from DynFlags.
|
15 | 15 | initFinderOpts :: DynFlags -> FinderOpts
|
... | ... | @@ -22,7 +22,7 @@ initFinderOpts flags = FinderOpts |
22 | 22 | , finder_workingDirectory = fmap unsafeEncodeUtf $ workingDirectory flags
|
23 | 23 | , finder_thisPackageName = mkFastString <$> thisPackageName flags
|
24 | 24 | , finder_hiddenModules = hiddenModules flags
|
25 | - , finder_reexportedModules = Map.fromList [(known_as, is_as) | ReexportedModule is_as known_as <- reverse (reexportedModules flags)]
|
|
25 | + , finder_reexportedModules = listToUniqMap [(known_as, is_as) | ReexportedModule is_as known_as <- reverse (reexportedModules flags)]
|
|
26 | 26 | , finder_hieDir = fmap unsafeEncodeUtf $ hieDir flags
|
27 | 27 | , finder_hieSuf = unsafeEncodeUtf $ hieSuf flags
|
28 | 28 | , finder_hiDir = fmap unsafeEncodeUtf $ hiDir flags
|
... | ... | @@ -143,6 +143,7 @@ import System.Directory |
143 | 143 | import GHC.Foreign (withCString, peekCString)
|
144 | 144 | |
145 | 145 | import qualified Data.Set as Set
|
146 | +import GHC.Types.Unique.Set
|
|
146 | 147 | |
147 | 148 | import qualified GHC.LanguageExtensions as LangExt
|
148 | 149 | |
... | ... | @@ -261,7 +262,7 @@ data DynFlags = DynFlags { |
261 | 262 | -- Note [Filepaths and Multiple Home Units]
|
262 | 263 | workingDirectory :: Maybe FilePath,
|
263 | 264 | thisPackageName :: Maybe String, -- ^ What the package is called, use with multiple home units
|
264 | - hiddenModules :: Set.Set ModuleName,
|
|
265 | + hiddenModules :: !(UniqSet ModuleName),
|
|
265 | 266 | reexportedModules :: [ReexportedModule],
|
266 | 267 | |
267 | 268 | -- ways
|
... | ... | @@ -597,7 +598,7 @@ defaultDynFlags mySettings = |
597 | 598 | |
598 | 599 | workingDirectory = Nothing,
|
599 | 600 | thisPackageName = Nothing,
|
600 | - hiddenModules = Set.empty,
|
|
601 | + hiddenModules = emptyUniqSet,
|
|
601 | 602 | reexportedModules = [],
|
602 | 603 | |
603 | 604 | objectDir = Nothing,
|
... | ... | @@ -109,13 +109,14 @@ import GHC.Unit.Module.ModDetails |
109 | 109 | |
110 | 110 | import qualified Data.Map as Map
|
111 | 111 | import qualified Data.Set as Set
|
112 | +import GHC.Types.Unique.Set
|
|
112 | 113 | |
113 | 114 | import Control.Concurrent.MVar
|
114 | 115 | import Control.Monad
|
115 | 116 | import qualified Control.Monad.Catch as MC
|
116 | 117 | import Data.IORef
|
117 | 118 | import Data.Maybe
|
118 | -import Data.List (sortOn, groupBy, sortBy)
|
|
119 | +import Data.List (sort, sortOn, groupBy, sortBy)
|
|
119 | 120 | import qualified Data.List as List
|
120 | 121 | import System.FilePath
|
121 | 122 | |
... | ... | @@ -313,14 +314,15 @@ warnUnknownModules hsc_env dflags mod_graph = do |
313 | 314 | where
|
314 | 315 | diag_opts = initDiagOpts dflags
|
315 | 316 | |
316 | - unit_mods = Set.fromList (map ms_mod_name
|
|
317 | + unit_mods :: UniqSet ModuleName
|
|
318 | + unit_mods = mkUniqSet (map ms_mod_name
|
|
317 | 319 | (filter (\ms -> ms_unitid ms == homeUnitId_ dflags)
|
318 | 320 | (mgModSummaries mod_graph)))
|
319 | 321 | |
320 | 322 | reexported_mods = reexportedModules dflags
|
321 | 323 | hidden_mods = hiddenModules dflags
|
322 | 324 | |
323 | - hidden_warns = hidden_mods `Set.difference` unit_mods
|
|
325 | + hidden_warns = hidden_mods `minusUniqSet` unit_mods
|
|
324 | 326 | |
325 | 327 | lookupModule mn = findImportedModule hsc_env mn NoPkgQual
|
326 | 328 | |
... | ... | @@ -337,7 +339,7 @@ warnUnknownModules hsc_env dflags mod_graph = do |
337 | 339 | final_msgs hidden_warns reexported_warns
|
338 | 340 | =
|
339 | 341 | unionManyMessages $
|
340 | - [warn (DriverUnknownHiddenModules (homeUnitId_ dflags) (Set.toList hidden_warns)) | not (Set.null hidden_warns)]
|
|
342 | + [warn (DriverUnknownHiddenModules (homeUnitId_ dflags) (sort $ nonDetEltsUniqSet hidden_warns)) | not (isEmptyUniqSet hidden_warns)]
|
|
341 | 343 | ++ [warn (DriverUnknownReexportedModules (homeUnitId_ dflags) reexported_warns) | not (null reexported_warns)]
|
342 | 344 | |
343 | 345 | -- | Describes which modules of the module graph need to be loaded.
|
... | ... | @@ -293,6 +293,7 @@ import Data.List.NonEmpty (NonEmpty (..)) |
293 | 293 | import qualified Data.List.NonEmpty as NE
|
294 | 294 | import qualified Data.Map as Map
|
295 | 295 | import qualified Data.Set as Set
|
296 | +import GHC.Types.Unique.Set
|
|
296 | 297 | import Data.Word
|
297 | 298 | import System.FilePath
|
298 | 299 | import Text.ParserCombinators.ReadP hiding (char)
|
... | ... | @@ -3153,7 +3154,7 @@ setPackageName p d = d { thisPackageName = Just p } |
3153 | 3154 | |
3154 | 3155 | addHiddenModule :: String -> DynP ()
|
3155 | 3156 | addHiddenModule p =
|
3156 | - upd (\s -> s{ hiddenModules = Set.insert (mkModuleName p) (hiddenModules s) })
|
|
3157 | + upd (\s -> s{ hiddenModules = addOneToUniqSet (hiddenModules s) (mkModuleName p) })
|
|
3157 | 3158 | |
3158 | 3159 | addReexportedModule :: String -> DynP ()
|
3159 | 3160 | addReexportedModule p =
|
... | ... | @@ -175,7 +175,7 @@ mkDocStructureFromExportList mdl import_avails export_list = |
175 | 175 | moduleExport alias avails =
|
176 | 176 | DsiModExport (nubSortNE orig_names) (sortAvails (nubAvails avails))
|
177 | 177 | where
|
178 | - orig_names = M.findWithDefault aliasErr alias aliasMap
|
|
178 | + orig_names = fromMaybe aliasErr (lookupUniqMap aliasMap alias)
|
|
179 | 179 | aliasErr = error $ "mkDocStructureFromExportList: "
|
180 | 180 | ++ (moduleNameString . moduleName) mdl
|
181 | 181 | ++ ": Can't find alias " ++ moduleNameString alias
|
... | ... | @@ -185,9 +185,9 @@ mkDocStructureFromExportList mdl import_avails export_list = |
185 | 185 | NonEmpty.toList
|
186 | 186 | |
187 | 187 | -- Map from aliases to true module names.
|
188 | - aliasMap :: Map ModuleName (NonEmpty ModuleName)
|
|
188 | + aliasMap :: UniqMap ModuleName (NonEmpty ModuleName)
|
|
189 | 189 | aliasMap =
|
190 | - M.fromListWith (S.<>) $
|
|
190 | + listToUniqMap_C (S.<>) $
|
|
191 | 191 | (this_mdl_name, this_mdl_name :| [])
|
192 | 192 | : (flip concatMap (M.toList imported) $ \(mdl, imvs) ->
|
193 | 193 | [(imv_name imv, moduleName mdl :| []) | imv <- imvs])
|
... | ... | @@ -65,9 +65,10 @@ import Control.Applicative ((<|>)) |
65 | 65 | import Control.Monad
|
66 | 66 | import Data.Time
|
67 | 67 | import qualified Data.Map as M
|
68 | +import GHC.Types.Unique.Map
|
|
68 | 69 | import GHC.Driver.Env
|
69 | 70 | import GHC.Driver.Config.Finder
|
70 | -import qualified Data.Set as Set
|
|
71 | +import GHC.Types.Unique.Set
|
|
71 | 72 | import Data.List.NonEmpty ( NonEmpty (..) )
|
72 | 73 | import qualified System.OsPath as OsPath
|
73 | 74 | import qualified Data.List.NonEmpty as NE
|
... | ... | @@ -194,9 +195,9 @@ findImportedModuleNoHsc fc fopts ue mhome_unit mod_name mb_pkg = |
194 | 195 | home_pkg_import (uid, opts)
|
195 | 196 | -- If the module is reexported, then look for it as if it was from the perspective
|
196 | 197 | -- of that package which reexports it.
|
197 | - | Just real_mod_name <- mod_name `M.lookup` finder_reexportedModules opts =
|
|
198 | + | Just real_mod_name <- lookupUniqMap (finder_reexportedModules opts) mod_name =
|
|
198 | 199 | findImportedModuleNoHsc fc opts ue (Just $ DefiniteHomeUnit uid Nothing) real_mod_name NoPkgQual
|
199 | - | mod_name `Set.member` finder_hiddenModules opts =
|
|
200 | + | elementOfUniqSet mod_name (finder_hiddenModules opts) =
|
|
200 | 201 | return (mkHomeHidden uid)
|
201 | 202 | | otherwise =
|
202 | 203 | findHomePackageModule fc opts uid mod_name
|
... | ... | @@ -794,4 +795,3 @@ findObjectLinkable mod obj_fn obj_time = |
794 | 795 | pure (Linkable obj_time mod (NE.singleton (DotO obj_fn ModuleObject)))
|
795 | 796 | -- We used to look for _stub.o files here, but that was a bug (#706)
|
796 | 797 | -- Now GHC merges the stub.o into the main .o (#3687) |
797 | - |
... | ... | @@ -12,12 +12,13 @@ import GHC.Prelude |
12 | 12 | import GHC.Unit
|
13 | 13 | import GHC.Data.OsPath
|
14 | 14 | import qualified Data.Map as M
|
15 | +import GHC.Types.Unique.Map
|
|
15 | 16 | import GHC.Fingerprint
|
16 | 17 | import GHC.Platform.Ways
|
17 | 18 | import GHC.Unit.Env
|
18 | 19 | |
19 | 20 | import GHC.Data.FastString
|
20 | -import qualified Data.Set as Set
|
|
21 | +import GHC.Types.Unique.Set
|
|
21 | 22 | |
22 | 23 | -- | The 'FinderCache' maps modules to the result of
|
23 | 24 | -- searching for that module. It records the results of searching for
|
... | ... | @@ -101,8 +102,8 @@ data FinderOpts = FinderOpts |
101 | 102 | -- that have a similar name.
|
102 | 103 | , finder_workingDirectory :: Maybe OsPath
|
103 | 104 | , finder_thisPackageName :: Maybe FastString
|
104 | - , finder_hiddenModules :: Set.Set ModuleName
|
|
105 | - , finder_reexportedModules :: M.Map ModuleName ModuleName -- Reverse mapping, if you are looking for this name then look for this module.
|
|
105 | + , finder_hiddenModules :: !(UniqSet ModuleName)
|
|
106 | + , finder_reexportedModules :: !(UniqMap ModuleName ModuleName) -- Reverse mapping, if you are looking for this name then look for this module.
|
|
106 | 107 | , finder_hieDir :: Maybe OsPath
|
107 | 108 | , finder_hieSuf :: OsString
|
108 | 109 | , finder_hiDir :: Maybe OsPath
|