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
|