Add data type information to VectInfo
[ghc-hetmet.git] / compiler / iface / LoadIface.lhs
index cfb8f12..8ca7b41 100644 (file)
@@ -19,7 +19,7 @@ module LoadIface (
 #include "HsVersions.h"
 
 import {-# SOURCE #-}  TcIface( tcIfaceDecl, tcIfaceRules, tcIfaceInst, 
-                                tcIfaceFamInst )
+                                tcIfaceFamInst, tcIfaceVectInfo )
 
 import DynFlags
 import IfaceSyn
@@ -175,9 +175,9 @@ loadInterface doc_str mod from
                        -- The (src_imp == mi_boot iface) test checks that the already-loaded
                        -- interface isn't a boot iface.  This can conceivably happen,
                        -- if an earlier import had a before we got to real imports.   I think.
-           other -> do
+           other -> do {
 
-       { let { hi_boot_file = case from of
+          let { hi_boot_file = case from of
                                ImportByUser usr_boot -> usr_boot
                                ImportBySystem        -> sys_boot
 
@@ -224,7 +224,7 @@ loadInterface doc_str mod from
        --
        -- The main thing is to add the ModIface to the PIT, but
        -- we also take the
-       --      IfaceDecls, IfaceInst, IfaceRules
+       --      IfaceDecls, IfaceInst, IfaceFamInst, IfaceRules, IfaceVectInfo
        -- out of the ModIface and put them into the big EPS pools
 
        -- NB: *first* we do loadDecl, so that the provenance of all the locally-defined
@@ -237,13 +237,16 @@ loadInterface doc_str mod from
        ; new_eps_insts     <- mapM tcIfaceInst (mi_insts iface)
        ; new_eps_fam_insts <- mapM tcIfaceFamInst (mi_fam_insts iface)
        ; new_eps_rules     <- tcIfaceRules ignore_prags (mi_rules iface)
+        ; new_eps_vect_info <- tcIfaceVectInfo mod (mkNameEnv new_eps_decls) 
+                                               (mi_vect_info iface)
 
        ; let { final_iface = iface {   
                                mi_decls     = panic "No mi_decls in PIT",
                                mi_insts     = panic "No mi_insts in PIT",
                                mi_fam_insts = panic "No mi_fam_insts in PIT",
                                mi_rules     = panic "No mi_rules in PIT"
-                              } }
+                              }
+               }
 
        ; updateEps_  $ \ eps -> 
            eps { 
@@ -255,6 +258,8 @@ loadInterface doc_str mod from
                                                   new_eps_insts,
              eps_fam_inst_env = extendFamInstEnvList (eps_fam_inst_env eps)
                                                      new_eps_fam_insts,
+              eps_vect_info    = plusVectInfo (eps_vect_info eps) 
+                                              new_eps_vect_info,
               eps_mod_fam_inst_env
                               = let
                                   fam_inst_env = 
@@ -362,8 +367,7 @@ loadDecl ignore_prags mod (_version, decl)
        --      * location
        -- imported name, to fix the module correctly in the cache
     mk_new_bndr mod occ 
-       = newGlobalBinder mod occ 
-                         (importedSrcLoc (showSDoc (ppr (moduleName mod))))
+       = newGlobalBinder mod occ (importedSrcSpan (moduleNameFS (moduleName mod)))
                        -- ToDo: qualify with the package name if necessary
 
     doc = ptext SLIT("Declaration for") <+> ppr (ifName decl)
@@ -412,18 +416,25 @@ findAndReadIface doc_str mod hi_boot_file
 
        -- Look for the file
        ; hsc_env <- getTopEnv
-       ; mb_found <- ioToIOEnv (findHiFile hsc_env mod hi_boot_file)
+       ; mb_found <- ioToIOEnv (findExactModule hsc_env mod)
        ; case mb_found of {
-             Failed err -> do
+              
+             err | notFound err -> do
                { traceIf (ptext SLIT("...not found"))
                ; dflags <- getDOpts
                ; returnM (Failed (cannotFindInterface dflags 
                                        (moduleName mod) err)) } ;
-
-             Succeeded file_path -> do 
+             Found loc mod -> do 
 
        -- Found file, so read it
-       { traceIf (ptext SLIT("readIFace") <+> text file_path)
+       { let { file_path = addBootSuffix_maybe hi_boot_file (ml_hi_file loc) }
+
+        ; if thisPackage dflags == modulePackageId mod
+                && not (isOneShot (ghcMode dflags))
+            then returnM (Failed (homeModError mod loc))
+            else do {
+
+        ; traceIf (ptext SLIT("readIFace") <+> text file_path)
        ; read_result <- readIface mod file_path hi_boot_file
        ; case read_result of
            Failed err -> returnM (Failed (badIfaceFile file_path err))
@@ -433,18 +444,10 @@ findAndReadIface doc_str mod hi_boot_file
                | otherwise ->
                  returnM (Succeeded (iface, file_path))
                        -- Don't forget to fill in the package name...
-       }}}
-
-findHiFile :: HscEnv -> Module -> IsBootInterface
-          -> IO (MaybeErr FindResult FilePath)
-findHiFile hsc_env mod hi_boot_file
-  = do
-      maybe_found <- findExactModule hsc_env mod
-      case maybe_found of
-       Found loc mod -> return (Succeeded path)
-               where
-                  path = addBootSuffix_maybe hi_boot_file (ml_hi_file loc)
-       err -> return (Failed err)
+       }}}}
+
+notFound (Found _ _) = False
+notFound _ = True
 \end{code}
 
 @readIface@ tries just the one file.
@@ -490,6 +493,7 @@ initExternalPackageState
        -- Initialise the EPS rule pool with the built-in rules
       eps_mod_fam_inst_env
                        = emptyModuleEnv,
+      eps_vect_info    = noVectInfo,
       eps_stats = EpsStats { n_ifaces_in = 0, n_decls_in = 0, n_decls_out = 0
                           , n_insts_in = 0, n_insts_out = 0
                           , n_rules_in = length builtinRules, n_rules_out = 0 }
@@ -567,7 +571,7 @@ pprModIface iface
                <+> ppr (mi_mod_vers iface) <+> pp_sub_vers
                <+> (if mi_orphan iface then ptext SLIT("[orphan module]") else empty)
                <+> (if mi_finsts iface then ptext SLIT("[family instance module]") else empty)
-               <+> int opt_HiVersion
+               <+> integer opt_HiVersion
                <+> ptext SLIT("where")
        , vcat (map pprExport (mi_exports iface))
        , pprDeps (mi_deps iface)
@@ -577,6 +581,7 @@ pprModIface iface
        , vcat (map ppr (mi_insts iface))
        , vcat (map ppr (mi_fam_insts iface))
        , vcat (map ppr (mi_rules iface))
+        , pprVectInfo (mi_vect_info iface)
        , pprDeprecs (mi_deprecs iface)
        ]
   where
@@ -649,6 +654,17 @@ pprFixities fixes = ptext SLIT("fixities") <+> pprWithCommas pprFix fixes
                  where
                    pprFix (occ,fix) = ppr fix <+> ppr occ 
 
+pprVectInfo :: IfaceVectInfo -> SDoc
+pprVectInfo (IfaceVectInfo { ifaceVectInfoCCVar        = vars
+                           , ifaceVectInfoCCTyCon      = tycons
+                           , ifaceVectInfoCCTyConReuse = tyconsReuse
+                           }) = 
+  vcat 
+  [ ptext SLIT("CC'ed variables:") <+> hsep (map ppr vars)
+  , ptext SLIT("CC'ed tycons:") <+> hsep (map ppr tycons)
+  , ptext SLIT("CC reused tycons:") <+> hsep (map ppr tyconsReuse)
+  ]
+
 pprDeprecs NoDeprecs       = empty
 pprDeprecs (DeprecAll txt)  = ptext SLIT("Deprecate all") <+> doubleQuotes (ftext txt)
 pprDeprecs (DeprecSome prs) = ptext SLIT("Deprecate") <+> vcat (map pprDeprec prs)
@@ -689,5 +705,12 @@ wrongIfaceModErr iface mod_name file_path
            ]
        ]
   where iface_file = doubleQuotes (text file_path)
+
+homeModError mod location
+  = ptext SLIT("attempting to use module ") <> quotes (ppr mod)
+    <> (case ml_hs_file location of
+           Just file -> space <> parens (text file)
+           Nothing   -> empty)
+    <+> ptext SLIT("which is not loaded")
 \end{code}