[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
     , mkPrelModule          -- :: UserString -> Module
     
     , isDynamicModule       -- :: Module -> Bool
-    , isLibModule
+    , isPrelModule
 
     , mkSrcModule
 
 
     , mkSrcModule
 
@@ -36,7 +36,7 @@ module Module
     , DllFlavour, dll, notDll
 
        -- ModFlavour
     , DllFlavour, dll, notDll
 
        -- ModFlavour
-    , ModFlavour, libMod, userMod
+    , ModFlavour,
 
        -- Where to find a .hi file
     , WhereFrom(..), SearchPath, mkSearchPath
 
        -- 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.  
 
 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}
 \begin{code}
-data ModFlavour = LibMod       -- A library-ish module
+data ModFlavour = PrelMod      -- A Prelude module
                | UserMod       -- Not library-ish
                | UserMod       -- Not library-ish
-
-libMod  = LibMod
-userMod = UserMod
 \end{code}
 
 
 \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
 
        -- 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
 
 pprModuleName :: ModuleName -> SDoc
 pprModuleName nm = pprEncodedFS nm
@@ -193,7 +198,16 @@ pprModule (Module mod _ _) = getPprStyle $ \ sty ->
 
 
 \begin{code}
 
 
 \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
 
 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
 mkPrelModule name = Module name sys dll
  where 
   sys | opt_CompilingPrelude = UserMod
-      | otherwise           = LibMod
+      | otherwise           = PrelMod
 
   dll | opt_Static || opt_CompilingPrelude = NotDll
       | otherwise                         = Dll
 
   dll | opt_Static || opt_CompilingPrelude = NotDll
       | otherwise                         = Dll
@@ -237,9 +251,9 @@ isDynamicModule :: Module -> Bool
 isDynamicModule (Module _ _ Dll)  = True
 isDynamicModule _                = False
 
 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}
 
 
 \end{code}
 
 
@@ -310,21 +324,6 @@ getAllFilesMatching dirs hims (dir_path, suffix) = ( do
               return hims
        )
  where
               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
                      []       -> []
    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 
        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
 
          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 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(..) )
 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 ->
 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
        
 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,
                         )
 import Module          ( Module, moduleString, pprModule,
                          mkVanillaModule, pprModuleName,
-                         moduleUserString, moduleName, isLibModule,
+                         moduleUserString, moduleName, isPrelModule,
                          ModuleName, WhereFrom(..),
                        )
 import RdrName         ( RdrName, rdrNameOcc )
                          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
 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)
     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
                                                -- 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
 
             
     in
 
@@ -982,11 +982,11 @@ findAndReadIface doc_str mod_name from hi_file
          (False, lookupFM hi_map mod_name)
 
       | otherwise
          (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
                -- 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,
 
     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
 
 <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.
 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>
 &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
 
 <Para>
 Patrick Sansom had a workshop paper about how all this is done (though