X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fmain%2FHscMain.lhs;h=933503e4915742d14184463212503051a61a4b62;hp=26247b143ad2279b27df7be5ca5d2da7675011fa;hb=b017f34bebf1588e5e579d7c653413e2a4c2d170;hpb=7bb3d1fc79521d591cd9f824893963141a7997b6 diff --git a/compiler/main/HscMain.lhs b/compiler/main/HscMain.lhs index 26247b1..933503e 100644 --- a/compiler/main/HscMain.lhs +++ b/compiler/main/HscMain.lhs @@ -14,7 +14,7 @@ module HscMain , hscSimplify , hscNormalIface, hscWriteIface, hscGenHardCode #ifdef GHCI - , hscStmt, hscTcExpr, hscKcType + , hscStmt, hscTcExpr, hscImport, hscKcType , compileExpr #endif , HsCompiler(..) @@ -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 @@ -50,7 +51,7 @@ import PrelNames ( iNTERACTIVE ) import {- Kind parts of -} Type ( Kind ) import CoreLint ( lintUnfolding ) import DsMeta ( templateHaskellNames ) -import SrcLoc ( SrcSpan, noSrcLoc, interactiveSrcLoc, srcLocSpan, noSrcSpan ) +import SrcLoc ( SrcSpan, noSrcLoc, interactiveSrcLoc, srcLocSpan, noSrcSpan, unLoc ) import VarSet import VarEnv ( emptyTidyEnv ) #endif @@ -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,9 +184,9 @@ 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 + case unP parseModule (mkPState dflags buf loc) of PFailed span err -> throwOneError (mkPlainErrMsg 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,25 +429,18 @@ 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 , hscRecompile = genericHscRecompile hscOneShotCompiler - , hscBackend = genericHscBackend hscOneShotCompiler + , hscBackend = \ tc_result mod_summary mb_old_hash -> do + hsc_env <- getSession + case hscTarget (hsc_dflags hsc_env) of + HscNothing -> return (HscRecomp False ()) + _otherw -> genericHscBackend hscOneShotCompiler + tc_result mod_summary mb_old_hash , hscGenBootOutput = \tc_result mod_summary mb_old_iface -> do (iface, changed, _) <- hscSimpleIface tc_result mb_old_iface @@ -455,7 +458,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 +477,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 +502,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,26 +530,18 @@ 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) - , hscRecompile = \mod_summary mb_old_hash -> - case ms_hsc_src mod_summary of - ExtCoreFile -> - panic "hscCompileNothing: cannot do external core" - _otherwise -> do - tc_result <- hscFileFrontEnd mod_summary - hscBackend hscNothingCompiler tc_result mod_summary mb_old_hash + , hscRecompile = genericHscRecompile hscNothingCompiler , hscBackend = \tc_result _mod_summary mb_old_iface -> do (iface, _changed, details) <- hscSimpleIface tc_result mb_old_iface @@ -551,9 +553,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 +793,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 +803,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 @@ -931,6 +931,12 @@ hscStmt hsc_env stmt = do return $ Just (ids, hval) +hscImport :: GhcMonad m => HscEnv -> String -> m (ImportDecl RdrName) +hscImport hsc_env str = do + (L _ (HsModule{hsmodImports=is})) <- hscParseThing parseModule (hsc_dflags hsc_env) str + case is of + [i] -> return (unLoc i) + _ -> throwOneError (mkPlainErrMsg noSrcSpan (ptext (sLit "parse error in import declaration"))) hscTcExpr -- Typecheck an expression (but don't run it) :: GhcMonad m => @@ -988,9 +994,9 @@ hscParseThing parser dflags str buf <- liftIO $ stringToStringBuffer str - let loc = mkSrcLoc (fsLit "") 1 0 + let loc = mkSrcLoc (fsLit "") 1 1 - case unP parser (mkPState buf loc dflags) of + case unP parser (mkPState dflags buf loc) of PFailed span err -> do let msg = mkPlainErrMsg span err