Remove LazyUniqFM; fixes trac #3880
[ghc-hetmet.git] / compiler / main / HscMain.lhs
index 26247b1..5590744 100644 (file)
@@ -24,6 +24,7 @@ module HscMain
     , hscCompileBatch       -- :: Compiler (HscStatus, ModIface, ModDetails)
     , hscCompileNothing     -- :: Compiler (HscStatus, ModIface, ModDetails)
     , hscCompileInteractive -- :: Compiler (InteractiveStatus, ModIface, ModDetails)
+    , hscCheckRecompBackend
     , HscStatus' (..)
     , InteractiveStatus, HscStatus
 
@@ -108,7 +109,7 @@ import HscStats             ( ppSourceStats )
 import HscTypes
 import MkExternalCore  ( emitExternalCore )
 import FastString
-import LazyUniqFM              ( emptyUFM )
+import UniqFM          ( emptyUFM )
 import UniqSupply       ( initUs_ )
 import Bag             ( unitBag )
 import Exception
@@ -183,7 +184,7 @@ hscParse mod_summary = do
             Just b  -> return b
             Nothing -> liftIO $ hGetStringBuffer src_filename
 
-   let loc  = mkSrcLoc (mkFastString src_filename) 1 0
+   let loc  = mkSrcLoc (mkFastString src_filename) 1 1
 
    case unP parseModule (mkPState buf loc dflags) of
      PFailed span err ->
@@ -216,7 +217,7 @@ hscTypecheck mod_summary rdr_module = do
 -- exception/signal an error.
 type RenamedStuff = 
         (Maybe (HsGroup Name, [LImportDecl Name], Maybe [LIE Name],
-                Maybe (HsDoc Name), HaddockModInfo Name))
+                Maybe LHsDocString))
 
 -- | Rename and typecheck a module, additionally returning the renamed syntax
 hscTypecheckRename ::
@@ -233,9 +234,8 @@ hscTypecheckRename mod_summary rdr_module = do
         rn_info = do { decl <- tcg_rn_decls tc_result
                      ; let imports = tcg_rn_imports tc_result
                            exports = tcg_rn_exports tc_result
-                           doc            = tcg_doc tc_result
-                          hmi     = tcg_hmi tc_result
-                     ; return (decl,imports,exports,doc,hmi) }
+                           doc_hdr  = tcg_doc_hdr tc_result
+                     ; return (decl,imports,exports,doc_hdr) }
 
     return (tc_result, rn_info)
 
@@ -337,12 +337,6 @@ type Compiler result =  GhcMonad m =>
 
 data HsCompiler a
   = HsCompiler {
-    -- | The main interface.
-    hscCompile :: GhcMonad m =>
-                  HscEnv -> ModSummary -> Bool
-               -> Maybe ModIface -> Maybe (Int, Int)
-               -> m a,
-
     -- | Called when no recompilation is necessary.
     hscNoRecomp :: GhcMonad m =>
                    ModIface -> m a,
@@ -389,6 +383,22 @@ genericHscCompile compiler hscMessage
            -> do hscMessage mb_mod_index True mod_summary
                  hscRecompile compiler mod_summary mb_old_hash
 
+hscCheckRecompBackend :: HsCompiler a -> TcGblEnv -> Compiler a
+hscCheckRecompBackend compiler tc_result 
+                   hsc_env mod_summary source_unchanged mb_old_iface _m_of_n =
+   withTempSession (\_ -> hsc_env) $ do
+     (recomp_reqd, mb_checked_iface)
+         <- {-# SCC "checkOldIface" #-}
+            liftIO $ checkOldIface hsc_env mod_summary
+                                   source_unchanged mb_old_iface
+
+     let mb_old_hash = fmap mi_iface_hash mb_checked_iface
+     case mb_checked_iface of
+       Just iface | not recomp_reqd
+           -> hscNoRecomp compiler iface{ mi_globals = Just (tcg_rdr_env tc_result) }
+       _otherwise
+           -> hscBackend compiler tc_result mod_summary mb_old_hash
+
 genericHscRecompile :: GhcMonad m =>
                        HsCompiler a
                     -> ModSummary -> Maybe Fingerprint
@@ -419,19 +429,7 @@ hscOneShotCompiler :: HsCompiler OneShotResult
 hscOneShotCompiler =
   HsCompiler {
 
-    hscCompile = \hsc_env mod_summary src_changed mb_old_iface mb_i_of_n -> do
-       -- One-shot mode needs a knot-tying mutable variable for interface
-       -- files.  See TcRnTypes.TcGblEnv.tcg_type_env_var.
-      type_env_var <- liftIO $ newIORef emptyNameEnv
-      let
-         mod = ms_mod mod_summary
-         hsc_env' = hsc_env{ hsc_type_env_var = Just (mod, type_env_var) }
-      ---
-      genericHscCompile hscOneShotCompiler
-                        oneShotMsg hsc_env' mod_summary src_changed
-                        mb_old_iface mb_i_of_n
-
-  , hscNoRecomp = \_old_iface -> do
+    hscNoRecomp = \_old_iface -> do
       withSession (liftIO . dumpIfaceStats)
       return HscNoRecomp
 
@@ -455,7 +453,18 @@ hscOneShotCompiler =
 
 -- Compile Haskell, boot and extCore in OneShot mode.
 hscCompileOneShot :: Compiler OneShotResult
-hscCompileOneShot = hscCompile hscOneShotCompiler
+hscCompileOneShot hsc_env mod_summary src_changed mb_old_iface mb_i_of_n = do
+       -- One-shot mode needs a knot-tying mutable variable for interface
+       -- files.  See TcRnTypes.TcGblEnv.tcg_type_env_var.
+      type_env_var <- liftIO $ newIORef emptyNameEnv
+      let
+         mod = ms_mod mod_summary
+         hsc_env' = hsc_env{ hsc_type_env_var = Just (mod, type_env_var) }
+      ---
+      genericHscCompile hscOneShotCompiler
+                        oneShotMsg hsc_env' mod_summary src_changed
+                        mb_old_iface mb_i_of_n
+
 
 --------------------------------------------------------------
 
@@ -463,9 +472,7 @@ hscBatchCompiler :: HsCompiler BatchResult
 hscBatchCompiler =
   HsCompiler {
 
-    hscCompile = genericHscCompile hscBatchCompiler batchMsg
-
-  , hscNoRecomp = \iface -> do
+    hscNoRecomp = \iface -> do
        details <- genModDetails iface
        return (HscNoRecomp, iface, details)
 
@@ -490,16 +497,14 @@ hscBatchCompiler =
 
 -- Compile Haskell, boot and extCore in batch mode.
 hscCompileBatch :: Compiler (HscStatus, ModIface, ModDetails)
-hscCompileBatch = hscCompile hscBatchCompiler
+hscCompileBatch = genericHscCompile hscBatchCompiler batchMsg
 
 --------------------------------------------------------------
 
 hscInteractiveCompiler :: HsCompiler InteractiveResult
 hscInteractiveCompiler =
   HsCompiler {
-    hscCompile = genericHscCompile hscInteractiveCompiler batchMsg
-
-  , hscNoRecomp = \iface -> do
+    hscNoRecomp = \iface -> do
        details <- genModDetails iface
        return (HscNoRecomp, iface, details)
 
@@ -520,16 +525,14 @@ hscInteractiveCompiler =
 
 -- Compile Haskell, extCore to bytecode.
 hscCompileInteractive :: Compiler (InteractiveStatus, ModIface, ModDetails)
-hscCompileInteractive = hscCompile hscInteractiveCompiler
+hscCompileInteractive = genericHscCompile hscInteractiveCompiler batchMsg
 
 --------------------------------------------------------------
 
 hscNothingCompiler :: HsCompiler NothingResult
 hscNothingCompiler =
   HsCompiler {
-    hscCompile = genericHscCompile hscNothingCompiler batchMsg
-
-  , hscNoRecomp = \iface -> do
+    hscNoRecomp = \iface -> do
        details <- genModDetails iface
        return (HscNoRecomp, iface, details)
 
@@ -551,9 +554,10 @@ hscNothingCompiler =
   , hscGenOutput = \_ _ _ ->
         panic "hscCompileNothing: hscGenOutput should not be called"
   }
+
 -- Type-check Haskell and .hs-boot only (no external core)
 hscCompileNothing :: Compiler (HscStatus, ModIface, ModDetails)
-hscCompileNothing = hscCompile hscNothingCompiler
+hscCompileNothing = genericHscCompile hscNothingCompiler batchMsg
 
 --------------------------------------------------------------
 -- NoRecomp handlers
@@ -790,11 +794,8 @@ tryNewCodeGen      :: HscEnv -> Module -> [TyCon] -> [Module]
                -> HpcInfo
                -> IO [Cmm]
 tryNewCodeGen hsc_env this_mod data_tycons imported_mods 
-             cost_centre_info stg_binds hpc_info
-  | not (dopt Opt_TryNewCodeGen (hsc_dflags hsc_env))
-  = return []
-  | otherwise
-  = do { let dflags = hsc_dflags hsc_env
+             cost_centre_info stg_binds hpc_info =
+  do   { let dflags = hsc_dflags hsc_env
         ; prog <- StgCmm.codeGen dflags this_mod data_tycons imported_mods 
                         cost_centre_info stg_binds hpc_info
        ; dumpIfSet_dyn dflags Opt_D_dump_cmmz "Cmm produced by new codegen" 
@@ -803,8 +804,8 @@ tryNewCodeGen hsc_env this_mod data_tycons imported_mods
        ; prog <- return $ map (runTx $ runCmmOpts cmmCfgOptsZ) prog
                -- Control flow optimisation
 
-        -- Note: Have to thread the module's SRT through all the procedures
-        -- because we greedily build it as we go.
+        -- We are building a single SRT for the entire module, so
+        -- we must thread it through all the procedures as we cps-convert them.
         ; us <- mkSplitUniqSupply 'S'
         ; let topSRT = initUs_ us emptySRT
        ; (topSRT, prog) <- foldM (protoCmmCPSZ hsc_env) (topSRT, []) prog
@@ -988,7 +989,7 @@ hscParseThing parser dflags str
 
       buf <- liftIO $ stringToStringBuffer str
 
-      let loc  = mkSrcLoc (fsLit "<interactive>") 1 0
+      let loc  = mkSrcLoc (fsLit "<interactive>") 1 1
 
       case unP parser (mkPState buf loc dflags) of