From b9827234d7a401a674981e3766b243affd70b14b Mon Sep 17 00:00:00 2001 From: sewardj <unknown> Date: Wed, 25 Oct 2000 16:44:28 +0000 Subject: [PATCH] [project @ 2000-10-25 16:44:28 by sewardj] Wibbles from Julian --- ghc/compiler/main/HscMain.lhs | 201 ++++++++------------------------- ghc/compiler/main/MkIface.lhs | 27 +++-- ghc/compiler/rename/Rename.lhs | 2 +- 3 files changed, 67 insertions(+), 163 deletions(-) diff --git a/ghc/compiler/main/HscMain.lhs b/ghc/compiler/main/HscMain.lhs index 8808ffc9a304..2b64b8363856 100644 --- a/ghc/compiler/main/HscMain.lhs +++ b/ghc/compiler/main/HscMain.lhs @@ -8,7 +8,8 @@ module HscMain ( hscMain ) where #include "HsVersions.h" -import IO ( hPutStr, stderr ) +import Monad ( when ) +import IO ( hPutStr, hClose, stderr, openFile, IOMode(..) ) import HsSyn import RdrHsSyn ( RdrNameHsModule ) @@ -18,11 +19,11 @@ import Parser ( parse ) import Lex ( PState(..), ParseResult(..) ) import SrcLoc ( mkSrcLoc ) -import Rename ( renameModule ) +import Rename ( renameModule, checkOldIface ) import PrelInfo ( wiredInThings ) import PrelRules ( builtinRules ) -import MkIface ( writeIface ) +import MkIface ( completeIface, mkModDetailsFromIface ) import TcModule ( TcResults(..), typecheckModule ) import Desugar ( deSugar ) import SimplCore ( core2core ) @@ -35,15 +36,29 @@ import SimplStg ( stg2stg ) import CodeGen ( codeGen ) import CodeOutput ( codeOutput ) -import Module ( ModuleName, moduleNameUserString ) +import Module ( ModuleName, moduleNameUserString, + moduleUserString, moduleName ) import CmdLineOpts import ErrUtils ( ghcExit, doIfSet, dumpIfSet ) import UniqSupply ( mkSplitUniqSupply ) +import Bag ( emptyBag ) import Outputable import Char ( isSpace ) -import StgInterp ( runStgI ) +import StgInterp ( stgToInterpSyn ) import HscStats ( ppSourceStats ) +import HscTypes ( ModDetails, ModIface, PersistentCompilerState(..), + PersistentRenamerState(..), WhatsImported(..), + HomeSymbolTable, PackageSymbolTable, ImportVersion, + GenAvailInfo(..), RdrAvailInfo, OrigNameEnv(..), + PackageRuleBase ) +import RnMonad ( ExportItem, ParsedIface(..) ) +import CmSummarise ( ModSummary ) +import InterpSyn ( UnlinkedIBind ) +import StgInterp ( ItblEnv ) +import FiniteMap ( FiniteMap, plusFM, emptyFM, addToFM ) +import OccName ( OccName, pprOccName ) +import Name ( Name, nameModule ) \end{code} @@ -69,7 +84,7 @@ data HscResult hscMain :: DynFlags -> ModSummary -- summary, including source filename - -> Maybe ModIFace -- old interface, if available + -> Maybe ModIface -- old interface, if available -> String -- file in which to put the output (.s, .hc, .java etc.) -> HomeSymbolTable -- for home module ModDetails -> PersistentCompilerState -- IN: persistent compiler state @@ -90,7 +105,7 @@ hscMain dflags core_cmds stg_cmds summary maybe_old_iface let no_old_iface = not (isJust maybe_checked_iface) what_next | recomp_reqd || no_old_iface = hscRecomp | otherwise = hscNoRecomp - + ; return (what_next dflags core_cmds stg_cmds summary hit hst pcs2 maybe_checked_iface) }} @@ -99,13 +114,13 @@ hscMain dflags core_cmds stg_cmds summary maybe_old_iface hscNoRecomp dflags core_cmds stg_cmds summary hit hst pcs maybe_old_iface = do { -- we definitely expect to have the old interface available - old_iface = case maybe_old_iface of - Just old_if -> old_if - Nothing -> panic "hscNoRecomp:old_iface" - + let old_iface = case maybe_old_iface of + Just old_if -> old_if + Nothing -> panic "hscNoRecomp:old_iface" + ; -- CLOSURE (pcs_cl, closure_errs, cl_hs_decls) - <- closeIfaceDecls dflags finder hit hst pcs old_iface + <- closeIfaceDecls dflags finder hit hst pcs old_iface ; if closure_errs then return (HscFail cl_pcs) else do { @@ -124,10 +139,10 @@ hscNoRecomp dflags core_cmds stg_cmds summary hit hst pcs maybe_old_iface local_classes = tc_classes tc_result local_insts = tc_insts tc_result local_rules = tc_rules tc_result - + ; -- create a new details from the closed, typechecked, old iface let new_details = mkModDetailsFromIface env_tc local_insts local_rules - + ; return (HscOK final_details Nothing -- tells CM to use old iface and linkables Nothing Nothing -- foreign export stuff @@ -139,8 +154,8 @@ hscNoRecomp dflags core_cmds stg_cmds summary hit hst pcs maybe_old_iface hscRecomp dflags core_cmds stg_cmds summary hit hst pcs maybe_old_iface = do { -- what target are we shooting for? - let toInterp = dopt_HscLang dflags == HscInterpreted; - + let toInterp = dopt_HscLang dflags == HscInterpreted + ; -- PARSE maybe_parsed <- myParseModule dflags summary; case maybe_parsed of { @@ -167,29 +182,29 @@ hscRecomp dflags core_cmds stg_cmds summary hit hst pcs maybe_old_iface local_tycons = tc_tycons tc_result local_classes = tc_classes tc_result local_insts = tc_insts tc_result - + ; -- DESUGAR, SIMPLIFY, TIDY-CORE -- We grab the the unfoldings at this point. (tidy_binds, orphan_rules, foreign_stuff) <- dsThenSimplThenTidy dflags mod tc_result ds_uniqs - + ; -- CONVERT TO STG (stg_binds, cost_centre_info, top_level_ids) <- myCoreToStg c2s_uniqs st_uniqs this_mod tidy_binds - + ; -- cook up a new ModDetails now we (finally) have all the bits let new_details = mkModDetails tc_env local_insts tidy_binds top_level_ids orphan_rules - + ; -- and possibly create a new ModIface let maybe_final_iface = completeIface maybe_old_iface new_iface new_details - + ; -- do the rest of code generation/emission (maybe_ibinds, maybe_stub_h_filename, maybe_stub_c_filename) <- restOfCodeGeneration toInterp this_mod imported_modules cost_centre_info fe_binders tc_env stg_binds - + ; -- and the answer is ... return (HscOK new_details maybe_final_iface maybe_stub_h_filename maybe_stub_c_filename @@ -203,10 +218,11 @@ myParseModule dflags summary -- _scc_ "Parser" let src_filename -- name of the preprocessed source file - = case ms_ppsource summary of - Just (filename, fingerprint) -> filename - Nothing -> pprPanic "myParseModule:summary is not of a source module" - (ppr summary) + = case ms_ppsource summary of + Just (filename, fingerprint) -> filename + Nothing -> pprPanic + "myParseModule:summary is not of a source module" + (ppr summary) buf <- hGetStringBuffer True{-expand tabs-} src_filename @@ -217,8 +233,8 @@ myParseModule dflags summary context = [], glasgow_exts = glaexts, loc = mkSrcLoc src_filename 1 } of { - PFailed err -> do hPutStrLn stderr (showSDoc err) - return Nothing + PFailed err -> do { hPutStrLn stderr (showSDoc err); + return Nothing }; POk _ rdr_module@(HsModule mod_name _ _ _ _ _ _) -> dumpIfSet_dyn dflags Opt_D_dump_parsed "Parser" (ppr rdr_module) @@ -226,6 +242,7 @@ myParseModule dflags summary (ppSourceStats False rdr_module) return (Just rdr_module) + } restOfCodeGeneration toInterp this_mod imported_modules cost_centre_info @@ -295,34 +312,6 @@ myCoreToStg c2s_uniqs st_uniqs this_mod tidy_binds #if 0 -- BEGIN old stuff - -------------------------- Reader ---------------- - show_pass "Parser" >> - _scc_ "Parser" - - let src_filename -- name of the preprocessed source file - = case ms_ppsource summary of - Just (filename, fingerprint) -> filename - Nothing -> pprPanic "hscMain:summary is not of a source module" - (ppr summary) - - buf <- hGetStringBuffer True{-expand tabs-} src_filename - - let glaexts | dopt Opt_GlasgowExts dflags = 1# - | otherwise = 0# - - case parse buf PState{ bol = 0#, atbol = 1#, - context = [], glasgow_exts = glaexts, - loc = mkSrcLoc src_filename 1 } of { - - PFailed err -> return (HscErrs pcs (unitBag err) emptyBag) - - POk _ rdr_module@(HsModule mod_name _ _ _ _ _ _) -> - - dumpIfSet (dopt_D_dump_parsed flags) "Parser" (ppr rdr_module) >> - - dumpIfSet (dopt_D_source_stats flags) "Source Statistics" - (ppSourceStats False rdr_module) >> - -- UniqueSupplies for later use (these are the only lower case uniques) mkSplitUniqSupply 'd' >>= \ ds_uniqs -> -- desugarer mkSplitUniqSupply 'r' >>= \ ru_uniqs -> -- rules @@ -330,87 +319,6 @@ myCoreToStg c2s_uniqs st_uniqs this_mod tidy_binds mkSplitUniqSupply 'g' >>= \ st_uniqs -> -- stg-to-stg passes mkSplitUniqSupply 'n' >>= \ ncg_uniqs -> -- native-code generator - -------------------------- Rename ---------------- - show_pass "Renamer" >> - _scc_ "Renamer" - - renameModule dflags finder pcs hst rdr_module - >>= \ (pcs_rn, maybe_rn_stuff) -> - case maybe_rn_stuff of { - Nothing -> -- Hurrah! Renamer reckons that there's no need to - -- go any further - reportCompile mod_name "Compilation NOT required!" >> - return (); - - Just (this_mod, rn_mod, - old_iface, new_iface, - rn_name_supply, fixity_env, - imported_modules) -> - -- Oh well, we've got to recompile for real - - - -------------------------- Typechecking ---------------- - show_pass "TypeCheck" >> - _scc_ "TypeCheck" - typecheckModule dflags mod pcs hst hit pit rn_mod - -- tc_uniqs rn_name_supply - -- fixity_env rn_mod - >>= \ maybe_tc_stuff -> - case maybe_tc_stuff of { - Nothing -> ghcExit 1; -- Type checker failed - - Just (tc_results@(TcResults {tc_tycons = local_tycons, - tc_classes = local_classes, - tc_insts = inst_info })) -> - - - -------------------------- Desugaring ---------------- - _scc_ "DeSugar" - deSugar this_mod ds_uniqs tc_results >>= \ (desugared, rules, h_code, c_code, fe_binders) -> - - - -------------------------- Main Core-language transformations ---------------- - _scc_ "Core2Core" - core2core core_cmds desugared rules >>= \ (simplified, orphan_rules) -> - - -- Do the final tidy-up - tidyCorePgm this_mod - simplified orphan_rules >>= \ (tidy_binds, tidy_orphan_rules) -> - - -- Run the occurrence analyser one last time, so that - -- dead binders get dead-binder info. This is exploited by - -- code generators to avoid spitting out redundant bindings. - -- The occurrence-zapping in Simplify.simplCaseBinder means - -- that the Simplifier nukes useful dead-var stuff especially - -- in case patterns. - let occ_anal_tidy_binds = occurAnalyseBinds tidy_binds in - - coreBindsSize occ_anal_tidy_binds `seq` --- TEMP: the above call zaps some space usage allocated by the --- simplifier, which for reasons I don't understand, persists --- thoroughout code generation - - - - -------------------------- Convert to STG code ------------------------------- - show_pass "Core2Stg" >> - _scc_ "Core2Stg" - let - stg_binds = topCoreBindsToStg c2s_uniqs occ_anal_tidy_binds - in - - -------------------------- Simplify STG code ------------------------------- - show_pass "Stg2Stg" >> - _scc_ "Stg2Stg" - stg2stg stg_cmds this_mod st_uniqs stg_binds >>= \ (stg_binds2, cost_centre_info) -> - -#ifdef GHCI - runStgI local_tycons local_classes - (map fst stg_binds2) >>= \ i_result -> - putStr ("\nANSWER = " ++ show i_result ++ "\n\n") - >> - -#else -------------------------- Interface file ------------------------------- -- Dump instance decls and type signatures into the interface file _scc_ "Interface" @@ -444,9 +352,6 @@ myCoreToStg c2s_uniqs st_uniqs this_mod tidy_binds -------------------------- Final report ------------------------------- reportCompile mod_name (showSDoc (ppSourceStats True rdr_module)) >> -#endif - - ghcExit 0 } } where @@ -471,21 +376,14 @@ myCoreToStg c2s_uniqs st_uniqs this_mod tidy_binds \begin{code} initPersistentCompilerState :: IO PersistentCompilerState initPersistentCompilerState -<<<<<<< HscMain.lhs = do prs <- initPersistentRenamerState return ( PCS { pcs_PST = initPackageDetails, pcs_insts = emptyInstEnv, pcs_rules = emptyRuleEnv, - pcs_PRS = initPersistentRenamerState + pcs_PRS = prs } ) -======= - = PCS { pcs_PST = initPackageDetails, - pcs_insts = emptyInstEnv, - pcs_rules = initRules, - pcs_PRS = initPersistentRenamerState } ->>>>>>> 1.12 initPackageDetails :: PackageSymbolTable initPackageDetails = extendTypeEnv emptyModuleEnv wiredInThings @@ -494,7 +392,7 @@ initPersistentRenamerState :: IO PersistentRenamerState = do ns <- mkSplitUniqSupply 'r' return ( PRS { prsOrig = Orig { origNames = initOrigNames, - origIParam = emptyFM }, + origIParam = emptyFM }, prsDecls = emptyNameEnv, prsInsts = emptyBag, prsRules = emptyBag, @@ -509,7 +407,7 @@ initOrigNames = grab knownKeyNames `plusFM` grab (map getName wiredInThings) add env name = addToFM env (moduleName (nameModule name), nameOccName name) name -initRules :: RuleEnv +initRules :: PackageRuleBase initRules = foldl add emptyVarEnv builtinRules where add env (name,rule) = extendNameEnv_C add1 env name [rule] @@ -560,6 +458,7 @@ writeIface this_mod old_iface new_iface full_new_iface = completeIface new_iface local_tycons local_classes inst_info final_ids tidy_binds tidy_orphan_rules + isNothing = not . isJust \end{code} @@ -624,7 +523,7 @@ pprExport (mod, items) \begin{code} pprUsage :: ImportVersion OccName -> SDoc pprUsage (m, has_orphans, is_boot, whats_imported) - = hsep [ptext SLIT("import"), pprModuleName m, + = hsep [ptext SLIT("import"), ppr (moduleName m), pp_orphan, pp_boot, upp_import_versions whats_imported ] <> semi diff --git a/ghc/compiler/main/MkIface.lhs b/ghc/compiler/main/MkIface.lhs index c9111329ae68..14abda7e4e9c 100644 --- a/ghc/compiler/main/MkIface.lhs +++ b/ghc/compiler/main/MkIface.lhs @@ -14,13 +14,15 @@ import HsSyn import HsCore ( HsIdInfo(..), UfExpr(..), toUfExpr, toUfBndr ) import HsTypes ( toHsTyVars ) import BasicTypes ( Fixity(..), NewOrData(..), - Version, bumpVersion, isLoopBreaker + Version, initialVersion, bumpVersion, isLoopBreaker ) import RnMonad import RnHsSyn ( RenamedInstDecl, RenamedTyClDecl ) import TcHsSyn ( TypecheckedRuleDecl ) import HscTypes ( VersionInfo(..), IfaceDecls(..), ModIface(..), ModDetails(..), - TyThing(..), DFunId, TypeEnv, isTyClThing + TyThing(..), DFunId, TypeEnv, isTyClThing, Avails, + WhatsImported(..), GenAvailInfo(..), RdrAvailInfo, + ImportVersion ) import CmdLineOpts @@ -42,6 +44,7 @@ import Name ( isLocallyDefined, getName, plusNameEnv, lookupNameEnv, emptyNameEnv, mkNameEnv, extendNameEnv, lookupNameEnv_NF, nameEnvElts ) +import OccName ( pprOccName ) import TyCon ( TyCon, getSynTyConDefn, isSynTyCon, isNewTyCon, isAlgTyCon, tyConTheta, tyConTyVars, tyConDataCons, tyConFamilySize ) @@ -50,8 +53,10 @@ import FieldLabel ( fieldLabelType ) import Type ( splitSigmaTy, tidyTopType, deNoteType ) import SrcLoc ( noSrcLoc ) import Outputable +import Module ( ModuleName, moduleName ) import List ( partition ) +import IO ( IOMode(..), openFile, hClose ) \end{code} @@ -597,8 +602,8 @@ diffDecls old_vers old_fixities new_fixities old new %************************************************************************ \begin{code} -writeIface :: Finder -> ModIface -> IO () -writeIface finder mod_iface +--writeIface :: Finder -> ModIface -> IO () +writeIface {-finder-} mod_iface = do { let filename = error "... find the right file..." ; if_hdl <- openFile filename WriteMode ; printForIface if_hdl (pprIface mod_iface) @@ -614,7 +619,7 @@ pprIface iface <+> int opt_HiVersion <+> ptext SLIT("where") - , pprExports (mi_exports iface) + , pprExport (mi_exports iface) , vcat (map pprUsage (mi_usages iface)) , pprIfaceDecls (vers_decls version_info) @@ -624,7 +629,7 @@ pprIface iface , pprDeprecs (mi_deprecs iface) ] where - version_info = mi_version mod_iface + version_info = mi_version iface exp_vers = vers_exports version_info rule_vers = vers_rules version_info @@ -640,12 +645,12 @@ When printing export lists, we print like this: \begin{code} pprExport :: (ModuleName, Avails) -> SDoc pprExport (mod, items) - = hsep [ ptext SLIT("__export "), ppr mod, hsep (map upp_avail items) ] <> semi + = hsep [ ptext SLIT("__export "), ppr mod, hsep (map pp_avail items) ] <> semi where pp_avail :: RdrAvailInfo -> SDoc pp_avail (Avail name) = pprOccName name pp_avail (AvailTC name []) = empty - pp_avail (AvailTC name ns) = hcat [pprOccName name, bang, upp_export ns'] + pp_avail (AvailTC name ns) = hcat [pprOccName name, bang, pp_export ns'] where bang | name `elem` ns = empty | otherwise = char '|' @@ -659,7 +664,7 @@ pprExport (mod, items) \begin{code} pprUsage :: ImportVersion Name -> SDoc pprUsage (m, has_orphans, is_boot, whats_imported) - = hsep [ptext SLIT("import"), pprModuleName m, + = hsep [ptext SLIT("import"), ppr (moduleName m), pp_orphan, pp_boot, pp_versions whats_imported ] <> semi @@ -696,8 +701,8 @@ pprIfaceDecls version_map fixity_map decls Just v -> int v -- Print fixities relevant to the decl - ppr_fixes d = vcat (map ppr_fix (fixities d)) - fixities d = [ ppr fix <+> ppr n <> semi + ppr_fixes d = vcat (map ppr_fix d) + ppr_fix d = [ ppr fix <+> ppr n <> semi | n <- tyClDeclNames d, [Just fix] <- lookupNameEnv fixity_map n ] diff --git a/ghc/compiler/rename/Rename.lhs b/ghc/compiler/rename/Rename.lhs index eb18d9d9a1a5..f246a55f92ed 100644 --- a/ghc/compiler/rename/Rename.lhs +++ b/ghc/compiler/rename/Rename.lhs @@ -4,7 +4,7 @@ \section[Rename]{Renaming and dependency analysis passes} \begin{code} -module Rename ( renameModule, closeIfaceDecls ) where +module Rename ( renameModule, closeIfaceDecls, checkOldIface ) where #include "HsVersions.h" -- GitLab