Cheng Shao pushed to branch wip/hiddenmodules-uniqset at Glasgow Haskell Compiler / GHC Commits: b09b64e8 by Cheng Shao at 2025-08-16T16:38:29+02:00 driver: use UniqSet for hiddenModules in DynFlags/FinderOpts This patch replaces Set ModuleName with UniqSet ModuleName in DynFlags.hiddenModules and FinderOpts.finder_hiddenModules for improved efficiency. Co-authored-by: Codex <codex@openai.com> - - - - - 5 changed files: - compiler/GHC/Driver/DynFlags.hs - compiler/GHC/Driver/Make.hs - compiler/GHC/Driver/Session.hs - compiler/GHC/Unit/Finder.hs - compiler/GHC/Unit/Finder/Types.hs Changes: ===================================== compiler/GHC/Driver/DynFlags.hs ===================================== @@ -143,6 +143,7 @@ import System.Directory import GHC.Foreign (withCString, peekCString) import qualified Data.Set as Set +import GHC.Types.Unique.Set import qualified GHC.LanguageExtensions as LangExt @@ -261,7 +262,7 @@ data DynFlags = DynFlags { -- Note [Filepaths and Multiple Home Units] workingDirectory :: Maybe FilePath, thisPackageName :: Maybe String, -- ^ What the package is called, use with multiple home units - hiddenModules :: Set.Set ModuleName, + hiddenModules :: !(UniqSet ModuleName), reexportedModules :: [ReexportedModule], -- ways @@ -597,7 +598,7 @@ defaultDynFlags mySettings = workingDirectory = Nothing, thisPackageName = Nothing, - hiddenModules = Set.empty, + hiddenModules = emptyUniqSet, reexportedModules = [], objectDir = Nothing, ===================================== compiler/GHC/Driver/Make.hs ===================================== @@ -109,13 +109,14 @@ import GHC.Unit.Module.ModDetails import qualified Data.Map as Map import qualified Data.Set as Set +import GHC.Types.Unique.Set import Control.Concurrent.MVar import Control.Monad import qualified Control.Monad.Catch as MC import Data.IORef import Data.Maybe -import Data.List (sortOn, groupBy, sortBy) +import Data.List (sort, sortOn, groupBy, sortBy) import qualified Data.List as List import System.FilePath @@ -313,14 +314,15 @@ warnUnknownModules hsc_env dflags mod_graph = do where diag_opts = initDiagOpts dflags - unit_mods = Set.fromList (map ms_mod_name + unit_mods :: UniqSet ModuleName + unit_mods = mkUniqSet (map ms_mod_name (filter (\ms -> ms_unitid ms == homeUnitId_ dflags) (mgModSummaries mod_graph))) reexported_mods = reexportedModules dflags hidden_mods = hiddenModules dflags - hidden_warns = hidden_mods `Set.difference` unit_mods + hidden_warns = hidden_mods `minusUniqSet` unit_mods lookupModule mn = findImportedModule hsc_env mn NoPkgQual @@ -337,7 +339,7 @@ warnUnknownModules hsc_env dflags mod_graph = do final_msgs hidden_warns reexported_warns = unionManyMessages $ - [warn (DriverUnknownHiddenModules (homeUnitId_ dflags) (Set.toList hidden_warns)) | not (Set.null hidden_warns)] + [warn (DriverUnknownHiddenModules (homeUnitId_ dflags) (sort $ nonDetEltsUniqSet hidden_warns)) | not (isEmptyUniqSet hidden_warns)] ++ [warn (DriverUnknownReexportedModules (homeUnitId_ dflags) reexported_warns) | not (null reexported_warns)] -- | Describes which modules of the module graph need to be loaded. ===================================== compiler/GHC/Driver/Session.hs ===================================== @@ -293,6 +293,7 @@ import Data.List.NonEmpty (NonEmpty (..)) import qualified Data.List.NonEmpty as NE import qualified Data.Map as Map import qualified Data.Set as Set +import GHC.Types.Unique.Set import Data.Word import System.FilePath import Text.ParserCombinators.ReadP hiding (char) @@ -3153,7 +3154,7 @@ setPackageName p d = d { thisPackageName = Just p } addHiddenModule :: String -> DynP () addHiddenModule p = - upd (\s -> s{ hiddenModules = Set.insert (mkModuleName p) (hiddenModules s) }) + upd (\s -> s{ hiddenModules = addOneToUniqSet (hiddenModules s) (mkModuleName p) }) addReexportedModule :: String -> DynP () addReexportedModule p = ===================================== compiler/GHC/Unit/Finder.hs ===================================== @@ -67,7 +67,7 @@ import Data.Time import qualified Data.Map as M import GHC.Driver.Env import GHC.Driver.Config.Finder -import qualified Data.Set as Set +import GHC.Types.Unique.Set import Data.List.NonEmpty ( NonEmpty (..) ) import qualified System.OsPath as OsPath import qualified Data.List.NonEmpty as NE @@ -196,7 +196,7 @@ findImportedModuleNoHsc fc fopts ue mhome_unit mod_name mb_pkg = -- of that package which reexports it. | Just real_mod_name <- mod_name `M.lookup` finder_reexportedModules opts = findImportedModuleNoHsc fc opts ue (Just $ DefiniteHomeUnit uid Nothing) real_mod_name NoPkgQual - | mod_name `Set.member` finder_hiddenModules opts = + | elementOfUniqSet mod_name (finder_hiddenModules opts) = return (mkHomeHidden uid) | otherwise = findHomePackageModule fc opts uid mod_name @@ -794,4 +794,3 @@ findObjectLinkable mod obj_fn obj_time = pure (Linkable obj_time mod (NE.singleton (DotO obj_fn ModuleObject))) -- We used to look for _stub.o files here, but that was a bug (#706) -- Now GHC merges the stub.o into the main .o (#3687) - ===================================== compiler/GHC/Unit/Finder/Types.hs ===================================== @@ -17,7 +17,7 @@ import GHC.Platform.Ways import GHC.Unit.Env import GHC.Data.FastString -import qualified Data.Set as Set +import GHC.Types.Unique.Set -- | The 'FinderCache' maps modules to the result of -- searching for that module. It records the results of searching for @@ -101,7 +101,7 @@ data FinderOpts = FinderOpts -- that have a similar name. , finder_workingDirectory :: Maybe OsPath , finder_thisPackageName :: Maybe FastString - , finder_hiddenModules :: Set.Set ModuleName + , finder_hiddenModules :: UniqSet ModuleName , finder_reexportedModules :: M.Map ModuleName ModuleName -- Reverse mapping, if you are looking for this name then look for this module. , finder_hieDir :: Maybe OsPath , finder_hieSuf :: OsString View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/b09b64e884f6f3943d803b0e21540fa8... -- View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/b09b64e884f6f3943d803b0e21540fa8... You're receiving this email because of your account on gitlab.haskell.org.