[project @ 2000-04-07 15:24:15 by simonpj]
authorsimonpj <unknown>
Fri, 7 Apr 2000 15:24:15 +0000 (15:24 +0000)
committersimonpj <unknown>
Fri, 7 Apr 2000 15:24:15 +0000 (15:24 +0000)
* 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
ghc/compiler/rename/RnEnv.lhs
ghc/compiler/rename/RnIfaces.lhs
ghc/docs/users_guide/using.sgml

index ee14e8d..9fcf38c 100644 (file)
@@ -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
 
index 4bd6122..b47ecdb 100644 (file)
@@ -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
index 8ff191f..7368d34 100644 (file)
@@ -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,
index 4358ac8..595e13d 100644 (file)
@@ -991,7 +991,12 @@ sight!
 
 <Para>
 GHC <Emphasis>only</Emphasis> keeps detailed dependency information
-for &ldquo;user&rdquo; modules, not for &ldquo;library&rdquo; modules.
+for &ldquo;user&rdquo; modules, not for &ldquo;Prelude&rdquo; modules.
+It distinguishes Prelude modules because their names start with
+"Prel", so don't start your modules that way!
+
+<!--       April 2000: hack disabled.  Now we use a different hack!
+
 It distinguishes the two by a hack: a module whose
 <Filename>.hi</Filename> file has an absolute path name is considered
 a library module, while a relative path name indicates a user module.
@@ -1010,6 +1015,7 @@ A path is considered &ldquo;absolute&rdquo; if it starts with
 &ldquo;<Filename>B:/</Filename>&rdquo;,
 &ldquo;<Filename>B:\</Filename>&rdquo; etc).
 </Para>
+-->
 
 <Para>
 Patrick Sansom had a workshop paper about how all this is done (though