X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fmain%2FHscTypes.lhs;h=00e1b4951d19c15cb98702243c53fe0ee5749a05;hb=1187e57fab2b5904a808ac973e5d04b91f880920;hp=ce54d8d1fa0e856545d3dc496f2c686b324b39ba;hpb=208a3cfbc321879e8a521cf89555d846ff7ab928;p=ghc-hetmet.git diff --git a/ghc/compiler/main/HscTypes.lhs b/ghc/compiler/main/HscTypes.lhs index ce54d8d..00e1b49 100644 --- a/ghc/compiler/main/HscTypes.lhs +++ b/ghc/compiler/main/HscTypes.lhs @@ -84,7 +84,8 @@ import Type ( TyThing(..) ) import Class ( Class, classSelIds, classTyCon ) import TyCon ( TyCon, tyConSelIds, tyConDataCons ) import DataCon ( dataConImplicitIds ) -import Packages ( PackageIdH, PackageId, PackageConfig ) +import PrelNames ( gHC_PRIM ) +import Packages ( PackageIdH, PackageId, PackageConfig, HomeModules ) import DynFlags ( DynFlags(..), isOneShot ) import DriverPhases ( HscSource(..), isHsBoot, hscSourceString, Phase ) import BasicTypes ( Version, initialVersion, IPName, @@ -94,9 +95,9 @@ import IfaceSyn ( IfaceInst, IfaceRule, IfaceDecl(ifName) ) import FiniteMap ( FiniteMap ) import CoreSyn ( CoreRule ) -import Maybes ( orElse, fromJust, expectJust ) +import Maybes ( orElse, expectJust, expectJust ) import Outputable -import SrcLoc ( SrcSpan ) +import SrcLoc ( SrcSpan, Located ) import UniqSupply ( UniqSupply ) import FastString ( FastString ) @@ -275,9 +276,17 @@ hptRules hsc_env deps | -- Find each non-hi-boot module below me (mod, False) <- deps + -- unsavoury: when compiling the base package with --make, we + -- sometimes try to look up RULES for GHC.Prim. GHC.Prim won't + -- be in the HPT, because we never compile it; it's in the EPT + -- instead. ToDo: clean up, and remove this slightly bogus + -- filter: + , mod /= gHC_PRIM + -- Look it up in the HPT - , let mod_info = ASSERT( mod `elemModuleEnv` hpt ) - fromJust (lookupModuleEnv hpt mod) + , let mod_info = case lookupModuleEnv hpt mod of + Nothing -> pprPanic "hptRules" (ppr mod <+> ppr deps) + Just x -> x -- And get its dfuns , rule <- md_rules (hm_details mod_info) ] @@ -397,6 +406,7 @@ data ModGuts mg_boot :: IsBootInterface, -- Whether it's an hs-boot module mg_exports :: !NameSet, -- What it exports mg_deps :: !Dependencies, -- What is below it, directly or otherwise + mg_home_mods :: !HomeModules, -- For calling isHomeModule etc. mg_dir_imps :: ![Module], -- Directly-imported modules; used to -- generate initialisation code mg_usages :: ![Usage], -- Version info for what it needed @@ -428,20 +438,25 @@ data CgGuts = CgGuts { cg_module :: !Module, - cg_tycons :: [TyCon], -- Algebraic data types (including ones that started life - -- as classes); generate constructors and info tables - -- Includes newtypes, just for the benefit of External Core + cg_tycons :: [TyCon], + -- Algebraic data types (including ones that started + -- life as classes); generate constructors and info + -- tables Includes newtypes, just for the benefit of + -- External Core - cg_binds :: [CoreBind], -- The tidied main bindings, including previously-implicit - -- bindings for record and class selectors, and - -- data construtor wrappers. - -- But *not* data constructor workers; reason: we - -- we regard them as part of the code-gen of tycons + cg_binds :: [CoreBind], + -- The tidied main bindings, including + -- previously-implicit bindings for record and class + -- selectors, and data construtor wrappers. But *not* + -- data constructor workers; reason: we we regard them + -- as part of the code-gen of tycons - cg_dir_imps :: ![Module], -- Directly-imported modules; used to generate - -- initialisation code + cg_dir_imps :: ![Module], + -- Directly-imported modules; used to generate + -- initialisation code cg_foreign :: !ForeignStubs, + cg_home_mods :: !HomeModules, -- for calling isHomeModule etc. cg_dep_pkgs :: ![PackageId] -- Used to generate #includes for C code gen } @@ -816,9 +831,16 @@ data Usage -- time round, but if someone has added a new rule you might need it this time -- The export list field is (Just v) if we depend on the export list: - -- i.e. we imported the module without saying exactly what we imported - -- We need to recompile if the module exports changes, because we might - -- now have a name clash in the importing module. + -- i.e. we imported the module directly, whether or not we + -- enumerated the things we imported, or just imported everything + -- We need to recompile if M's exports change, because + -- if the import was import M, we might now have a name clash in the + -- importing module. + -- if the import was import M(x) M might no longer export x + -- The only way we don't depend on the export list is if we have + -- import M() + -- And of course, for modules that aren't imported directly we don't + -- depend on their export lists \end{code} @@ -938,8 +960,8 @@ data ModSummary ms_location :: ModLocation, -- Location ms_hs_date :: ClockTime, -- Timestamp of source file ms_obj_date :: Maybe ClockTime, -- Timestamp of object, maybe - ms_srcimps :: [Module], -- Source imports - ms_imps :: [Module], -- Non-source imports + ms_srcimps :: [Located Module], -- Source imports + ms_imps :: [Located Module], -- Non-source imports ms_hspp_file :: Maybe FilePath, -- Filename of preprocessed source, -- once we have preprocessed it. ms_hspp_buf :: Maybe StringBuffer -- The actual preprocessed source, maybe. @@ -983,7 +1005,7 @@ showModMsg use_object mod_summary char ')']) where mod = ms_mod mod_summary - mod_str = moduleUserString mod ++ hscSourceString (ms_hsc_src mod_summary) + mod_str = moduleString mod ++ hscSourceString (ms_hsc_src mod_summary) \end{code} @@ -1006,7 +1028,12 @@ data Linkable = LM { } isObjectLinkable :: Linkable -> Bool -isObjectLinkable l = all isObject (linkableUnlinked l) +isObjectLinkable l = not (null unlinked) && all isObject unlinked + where unlinked = linkableUnlinked l + -- A linkable with no Unlinked's is treated as a BCO. We can + -- generate a linkable with no Unlinked's as a result of + -- compiling a module in HscNothing mode, and this choice + -- happens to work well with checkStability in module GHC. instance Outputable Linkable where ppr (LM when_made mod unlinkeds)