X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Frename%2FRnHiFiles.lhs;h=d9fec6eb5b3e65aebbdfd6c4f47a1e2fd8dbd778;hb=caac75c6a454396dadff0323162ed14adb4893cd;hp=fbf9e790a5b9665b4e4c01adf891371580905ac4;hpb=91c750cbd18e3d610b0db498ded38d5b3c5adfac;p=ghc-hetmet.git diff --git a/ghc/compiler/rename/RnHiFiles.lhs b/ghc/compiler/rename/RnHiFiles.lhs index fbf9e79..d9fec6e 100644 --- a/ghc/compiler/rename/RnHiFiles.lhs +++ b/ghc/compiler/rename/RnHiFiles.lhs @@ -16,20 +16,20 @@ module RnHiFiles ( #include "HsVersions.h" -import DriverState ( GhcMode(..), v_GhcMode ) +import DriverState ( v_GhcMode, isCompManagerMode ) import DriverUtil ( splitFilename ) import CmdLineOpts ( opt_IgnoreIfacePragmas ) import HscTypes ( ModuleLocation(..), ModIface(..), emptyModIface, VersionInfo(..), ImportedModuleInfo, - lookupIfaceByModName, + lookupIfaceByModName, RdrExportItem, ImportVersion, WhetherHasOrphans, IsBootInterface, DeclsMap, GatedDecl, IfaceInsts, IfaceRules, AvailInfo, GenAvailInfo(..), Avails, Deprecations(..) ) -import HsSyn ( TyClDecl(..), InstDecl(..), - HsType(..), HsPred(..), FixitySig(..), RuleDecl(..), - tyClDeclNames, tyClDeclSysNames, hsTyVarNames, getHsInstHead, +import HsSyn ( TyClDecl(..), InstDecl(..), RuleDecl(..), + tyClDeclNames, tyClDeclSysNames, hsTyVarNames, + getHsInstHead, ) import RdrHsSyn ( RdrNameTyClDecl, RdrNameInstDecl, RdrNameRuleDecl ) import RnHsSyn ( extractHsTyNames_s ) @@ -39,6 +39,7 @@ import RnEnv import RnMonad import ParseIface ( parseIface ) +import PrelNames ( gHC_PRIM_Name, gHC_PRIM ) import Name ( Name {-instance NamedThing-}, nameModule, isLocalName, nameIsLocalOrFrom ) @@ -57,10 +58,16 @@ import FiniteMap import ListSetOps ( minusList ) import Outputable import Bag +import BinIface ( {- just instances -} ) +import qualified Binary +import Panic import Config import IOExts +import Exception ( tryAllIO, Exception(DynException) ) +import Dynamic ( fromDynamic ) import Directory +import List ( isSuffixOf ) \end{code} @@ -221,13 +228,14 @@ tryLoadInterface doc_str mod_name from -- Now add info about this module to the PIT has_orphans = pi_orphan iface new_pit = extendModuleEnv pit mod mod_iface - mod_iface = ModIface { mi_module = mod, mi_version = version, + mod_iface = ModIface { mi_module = mod, mi_package = pi_pkg iface, + mi_version = version, mi_orphan = has_orphans, mi_boot = hi_boot_file, mi_exports = avails, mi_fixities = fix_env, mi_deprecs = deprec_env, mi_usages = [], -- Will be filled in later mi_decls = panic "No mi_decls in PIT", - mi_globals = mkIfaceGlobalRdrEnv avails + mi_globals = Nothing } new_ifaces = ifaces { iPIT = new_pit, @@ -277,13 +285,13 @@ addModDeps mod is_loaded new_deps mod_deps -- Loading the export list ----------------------------------------------------- -loadExports :: (Version, [ExportItem]) -> RnM d (Version, [(ModuleName,Avails)]) +loadExports :: (Version, [RdrExportItem]) -> RnM d (Version, [(ModuleName,Avails)]) loadExports (vers, items) = mapRn loadExport items `thenRn` \ avails_s -> returnRn (vers, avails_s) -loadExport :: ExportItem -> RnM d (ModuleName, Avails) +loadExport :: RdrExportItem -> RnM d (ModuleName, Avails) loadExport (mod, entities) = mapRn (load_entity mod) entities `thenRn` \ avails -> returnRn (mod, avails) @@ -335,7 +343,7 @@ loadFixDecls mod decls where mod_name = moduleName mod -loadFixDecl mod_name sig@(FixitySig rdr_name fixity loc) +loadFixDecl mod_name (rdr_name, fixity) = newGlobalName mod_name (rdrNameOcc rdr_name) `thenRn` \ name -> returnRn (name, fixity) @@ -491,14 +499,18 @@ findAndReadIface :: SDoc -> ModuleName findAndReadIface doc_str mod_name hi_boot_file = traceRn trace_msg `thenRn_` + -- Check for GHC.Prim, and return its static interface + if mod_name == gHC_PRIM_Name + then returnRn (Right (gHC_PRIM, ghcPrimIface)) + else + -- In interactive or --make mode, we are *not allowed* to demand-load -- a home package .hi file. So don't even look for them. -- This helps in the case where you are sitting in eg. ghc/lib/std -- and start up GHCi - it won't complain that all the modules it tries -- to load are found in the home location. ioToRnM_no_fail (readIORef v_GhcMode) `thenRn` \ mode -> - let home_allowed = hi_boot_file || - mode `notElem` [ DoInteractive, DoMake ] + let home_allowed = hi_boot_file || not (isCompManagerMode mode) in ioToRnM (if home_allowed @@ -512,18 +524,14 @@ findAndReadIface doc_str mod_name hi_boot_file readIface file `thenRn` \ read_result -> case read_result of Left bad -> returnRn (Left bad) - Right iface - -> let read_mod = pi_mod iface - in -- check that the module names agree - checkRn - (wanted_mod == read_mod) - (hiModuleNameMismatchWarn wanted_mod read_mod) + Right iface -> -- check that the module names agree + let read_mod_name = pi_mod iface + wanted_mod_name = moduleName wanted_mod + in + checkRn + (wanted_mod_name == read_mod_name) + (hiModuleNameMismatchWarn wanted_mod_name read_mod_name) `thenRn_` - -- check that the package names agree - warnCheckRn - (modulePackage wanted_mod == modulePackage read_mod) - (packageNameMismatchWarn wanted_mod read_mod) - `thenRn_` returnRn (Right (wanted_mod, iface)) -- Can't find it other -> traceRn (ptext SLIT("...not found")) `thenRn_` @@ -558,20 +566,35 @@ readIface file_path = --ioToRnM (putStrLn ("reading iface " ++ file_path)) `thenRn_` traceRn (ptext SLIT("readIFace") <+> text file_path) `thenRn_` - ioToRnM (hGetStringBuffer False file_path) `thenRn` \ read_result -> - case read_result of { - Left io_error -> bale_out (text (show io_error)) ; + let hi_boot_ver = "hi-boot-" ++ cHscIfaceFileVersion in + if ".hi-boot" `isSuffixOf` file_path + || hi_boot_ver `isSuffixOf` file_path then + + ioToRnM (hGetStringBuffer False file_path) `thenRn` \ read_result -> + case read_result of { + Left io_error -> bale_out (text (show io_error)); Right contents -> - case parseIface contents init_parser_state of - POk _ iface -> returnRn (Right iface) + case parseIface contents (mkPState loc exts) of { + POk _ iface -> returnRn (Right iface); PFailed err -> bale_out err - } + }} + + else + ioToRnM_no_fail (tryAllIO (Binary.getBinFileWithDict file_path)) + `thenRn` \ either_iface -> + + case either_iface of + Right iface -> returnRn (Right iface) + Left (DynException d) | Just e <- fromDynamic d + -> bale_out (text (show (e :: GhcException))) + + Left err -> bale_out (text (show err)) + where - init_parser_state = PState{ bol = 0#, atbol = 1#, - context = [], - glasgow_exts = 1#, - loc = mkSrcLoc (mkFastString file_path) 1 } + exts = ExtFlags {glasgowExtsEF = True, + parrEF = True} + loc = mkSrcLoc (mkFastString file_path) 1 bale_out err = returnRn (Left (badIfaceFile file_path err)) \end{code} @@ -645,23 +668,14 @@ badIfaceFile file err = vcat [ptext SLIT("Bad interface file:") <+> text file, nest 4 err] -hiModuleNameMismatchWarn :: Module -> Module -> Message +hiModuleNameMismatchWarn :: ModuleName -> ModuleName -> Message hiModuleNameMismatchWarn requested_mod read_mod = hsep [ ptext SLIT("Something is amiss; requested module name") - , ppr (moduleName requested_mod) + , ppr requested_mod , ptext SLIT("differs from name found in the interface file") , ppr read_mod ] -packageNameMismatchWarn :: Module -> Module -> Message -packageNameMismatchWarn requested_mod read_mod = - fsep [ ptext SLIT("Module"), quotes (ppr requested_mod), - ptext SLIT("is located in package"), - quotes (ptext (modulePackage requested_mod)), - ptext SLIT("but its interface file claims it is part of package"), - quotes (ptext (modulePackage read_mod)) - ] - warnRedundantSourceImport mod_name = ptext SLIT("Unnecessary {- SOURCE -} in the import of module") <+> quotes (ppr mod_name)