From 5f9909528a61d57609fcb7394be969cef7525e27 Mon Sep 17 00:00:00 2001 From: simonpj Date: Fri, 7 Apr 2000 15:24:15 +0000 Subject: [PATCH] [project @ 2000-04-07 15:24:15 by simonpj] * Make it so that interface files track dependencies on all modules except Prelude modules. (Was "library" modules, distinguished by a gross hack but that messed up StgHugs.) --- ghc/compiler/basicTypes/Module.lhs | 53 ++++++++++++++++++------------------ ghc/compiler/rename/RnEnv.lhs | 4 +-- ghc/compiler/rename/RnIfaces.lhs | 12 ++++---- ghc/docs/users_guide/using.sgml | 8 +++++- 4 files changed, 41 insertions(+), 36 deletions(-) diff --git a/ghc/compiler/basicTypes/Module.lhs b/ghc/compiler/basicTypes/Module.lhs index ee14e8d..9fcf38c 100644 --- a/ghc/compiler/basicTypes/Module.lhs +++ b/ghc/compiler/basicTypes/Module.lhs @@ -23,7 +23,7 @@ module Module , mkPrelModule -- :: UserString -> Module , isDynamicModule -- :: Module -> Bool - , isLibModule + , isPrelModule , mkSrcModule @@ -36,7 +36,7 @@ module Module , DllFlavour, dll, notDll -- ModFlavour - , ModFlavour, libMod, userMod + , ModFlavour, -- Where to find a .hi file , WhereFrom(..), SearchPath, mkSearchPath @@ -101,12 +101,14 @@ We also track whether an imported module is from a 'system-ish' place. In this we don't record the fact that this module depends on it, nor usages of things inside it. +Apr 00: We want to record dependencies on all modules other than +prelude modules else STG Hugs gets confused because it uses this +info to know what modules to link. (Compiled GHC uses command line +options to specify this.) + \begin{code} -data ModFlavour = LibMod -- A library-ish module +data ModFlavour = PrelMod -- A Prelude module | UserMod -- Not library-ish - -libMod = LibMod -userMod = UserMod \end{code} @@ -143,6 +145,9 @@ type ModuleName = EncodedFS -- Haskell module names can include the quote character ', -- so the module names have the z-encoding applied to them +isPrelModuleName :: ModuleName -> Bool + -- True for names of prelude modules +isPrelModuleName m = take 4 (_UNPK_ m) == "Prel" pprModuleName :: ModuleName -> SDoc pprModuleName nm = pprEncodedFS nm @@ -193,7 +198,16 @@ pprModule (Module mod _ _) = getPprStyle $ \ sty -> \begin{code} -mkModule = Module +mkModule :: FilePath -- Directory in which this module is + -> ModuleName -- Name of the module + -> DllFlavour + -> Module +mkModule dir_path mod_nm is_dll + | isPrelModuleName mod_nm = mkPrelModule mod_nm + | otherwise = Module mod_nm UserMod is_dll + -- Make every module into a 'user module' + -- except those constructed by mkPrelModule + mkVanillaModule :: ModuleName -> Module mkVanillaModule name = Module name UserMod dell @@ -217,7 +231,7 @@ mkPrelModule :: ModuleName -> Module mkPrelModule name = Module name sys dll where sys | opt_CompilingPrelude = UserMod - | otherwise = LibMod + | otherwise = PrelMod dll | opt_Static || opt_CompilingPrelude = NotDll | otherwise = Dll @@ -237,9 +251,9 @@ isDynamicModule :: Module -> Bool isDynamicModule (Module _ _ Dll) = True isDynamicModule _ = False -isLibModule :: Module -> Bool -isLibModule (Module _ LibMod _) = True -isLibModule _ = False +isPrelModule :: Module -> Bool +isPrelModule (Module _ PrelMod _) = True +isPrelModule _ = False \end{code} @@ -310,21 +324,6 @@ getAllFilesMatching dirs hims (dir_path, suffix) = ( do return hims ) where - - is_sys | isLibraryPath dir_path = LibMod - | otherwise = UserMod - - -- Dreadfully crude way to tell whether a module is a "library" - -- module or not. The current story is simply that if path is - -- absolute we treat it as a library. Specifically: - -- /usr/lib/ghc/ - -- C:/usr/lib/ghc - -- C:\user\lib - isLibraryPath ('/' : _ ) = True - isLibraryPath (_ : ':' : '/' : _) = True - isLibraryPath (_ : ':' : '\\' : _) = True - isLibraryPath other = False - xiffus = reverse dotted_suffix dotted_suffix = case suffix of [] -> [] @@ -355,7 +354,7 @@ getAllFilesMatching dirs hims (dir_path, suffix) = ( do add_hib file_nm = (hi_env, add_to_map addNewOne hib_env file_nm) add_to_map combiner env file_nm - = addToFM_C combiner env mod_nm (path, mkModule mod_nm is_sys is_dll) + = addToFM_C combiner env mod_nm (path, mkModule dir_path mod_nm is_dll) where mod_nm = mkSrcModuleFS file_nm diff --git a/ghc/compiler/rename/RnEnv.lhs b/ghc/compiler/rename/RnEnv.lhs index 4bd6122..b47ecdb 100644 --- a/ghc/compiler/rename/RnEnv.lhs +++ b/ghc/compiler/rename/RnEnv.lhs @@ -35,7 +35,7 @@ import OccName ( OccName, ) import TysWiredIn ( tupleTyCon, unboxedTupleTyCon, listTyCon ) import Type ( funTyCon ) -import Module ( ModuleName, mkThisModule, mkVanillaModule, moduleName ) +import Module ( ModuleName, mkThisModule, moduleName ) import TyCon ( TyCon ) import FiniteMap import Unique ( Unique, Uniquable(..) ) @@ -93,7 +93,7 @@ newImportedBinder mod rdr_name mkImportedGlobalName :: ModuleName -> OccName -> RnM d Name mkImportedGlobalName mod_name occ = lookupModuleRn mod_name `thenRn` \ mod -> - newImportedGlobalName mod_name occ mod --(mkVanillaModule mod_name) + newImportedGlobalName mod_name occ mod mkImportedGlobalFromRdrName :: RdrName -> RnM d Name mkImportedGlobalFromRdrName rdr_name diff --git a/ghc/compiler/rename/RnIfaces.lhs b/ghc/compiler/rename/RnIfaces.lhs index 8ff191f..7368d34 100644 --- a/ghc/compiler/rename/RnIfaces.lhs +++ b/ghc/compiler/rename/RnIfaces.lhs @@ -50,7 +50,7 @@ import Name ( Name {-instance NamedThing-}, ) import Module ( Module, moduleString, pprModule, mkVanillaModule, pprModuleName, - moduleUserString, moduleName, isLibModule, + moduleUserString, moduleName, isPrelModule, ModuleName, WhereFrom(..), ) import RdrName ( RdrName, rdrNameOcc ) @@ -187,7 +187,7 @@ addModDeps :: Module -> ImportedModuleInfo addModDeps mod mod_deps new_deps = foldr add mod_deps new_deps where - is_lib = isLibModule mod -- Don't record dependencies when importing a library module + is_lib = isPrelModule mod -- Don't record dependencies when importing a prelude module add (imp_mod, version, has_orphans, is_boot, _) deps | is_lib && not has_orphans = deps | otherwise = addToFM_C combine deps imp_mod (version, has_orphans, is_boot, Nothing) @@ -795,7 +795,7 @@ getImportVersions this_mod (ExportEnv _ _ export_all_mods) -- but don't actually *use* anything from Foo -- In which case record an empty dependency list where - is_lib_module = isLibModule mod + is_lib_module = isPrelModule mod in @@ -982,11 +982,11 @@ findAndReadIface doc_str mod_name from hi_file (False, lookupFM hi_map mod_name) | otherwise - -- Check if there's a library module of that name + -- Check if there's a prelude module of that name -- If not, look for an hi-boot file = case lookupFM hi_map mod_name of - stuff@(Just (_, mod)) | isLibModule mod -> (False, stuff) - other -> (True, lookupFM hiboot_map mod_name) + stuff@(Just (_, mod)) | isPrelModule mod -> (False, stuff) + other -> (True, lookupFM hiboot_map mod_name) trace_msg = sep [hsep [ptext SLIT("Reading"), ppr from, diff --git a/ghc/docs/users_guide/using.sgml b/ghc/docs/users_guide/using.sgml index 4358ac8..595e13d 100644 --- a/ghc/docs/users_guide/using.sgml +++ b/ghc/docs/users_guide/using.sgml @@ -991,7 +991,12 @@ sight! GHC only keeps detailed dependency information -for “user” modules, not for “library” modules. +for “user” modules, not for “Prelude” modules. +It distinguishes Prelude modules because their names start with +"Prel", so don't start your modules that way! + + Patrick Sansom had a workshop paper about how all this is done (though -- 1.7.10.4