2 % (c) The University of Glasgow 2006-2008
3 % (c) The GRASP/AQUA Project, Glasgow University, 1993-1998
10 mkIface, -- Build a ModIface from a ModGuts,
11 -- including computing version information
15 writeIfaceFile, -- Write the interface file
17 checkOldIface, -- See if recompilation is required, by
18 -- comparing version information
20 tyThingToIfaceDecl -- Converting things to their Iface equivalents
24 -----------------------------------------------
25 Recompilation checking
26 -----------------------------------------------
28 A complete description of how recompilation checking works can be
29 found in the wiki commentary:
31 http://hackage.haskell.org/trac/ghc/wiki/Commentary/Compiler/RecompilationAvoidance
33 Please read the above page for a top-down description of how this all
34 works. Notes below cover specific issues related to the implementation.
38 * In the mi_usages information in an interface, we record the
39 fingerprint of each free variable of the module
41 * In mkIface, we compute the fingerprint of each exported thing A.f.
42 For each external thing that A.f refers to, we include the fingerprint
43 of the external reference when computing the fingerprint of A.f. So
44 if anything that A.f depends on changes, then A.f's fingerprint will
47 * In checkOldIface we compare the mi_usages for the module with
48 the actual fingerprint for all each thing recorded in mi_usages
51 #include "HsVersions.h"
87 import BasicTypes hiding ( SuccessFlag(..) )
90 import Util hiding ( eqListBy )
100 import Data.Map (Map)
101 import qualified Data.Map as Map
103 import System.FilePath
108 %************************************************************************
110 \subsection{Completing an interface}
112 %************************************************************************
116 -> Maybe Fingerprint -- The old fingerprint, if we have it
117 -> ModDetails -- The trimmed, tidied interface
118 -> ModGuts -- Usages, deprecations, etc
120 Maybe (ModIface, -- The new one
121 Bool)) -- True <=> there was an old Iface, and the
122 -- new one is identical, so no need
125 mkIface hsc_env maybe_old_fingerprint mod_details
126 ModGuts{ mg_module = this_mod,
128 mg_used_names = used_names,
130 mg_dir_imps = dir_imp_mods,
131 mg_rdr_env = rdr_env,
132 mg_fix_env = fix_env,
134 mg_hpc_info = hpc_info }
135 = mkIface_ hsc_env maybe_old_fingerprint
136 this_mod is_boot used_names deps rdr_env
137 fix_env warns hpc_info dir_imp_mods mod_details
139 -- | make an interface from the results of typechecking only. Useful
140 -- for non-optimising compilation, or where we aren't generating any
141 -- object code at all ('HscNothing').
143 -> Maybe Fingerprint -- The old fingerprint, if we have it
144 -> ModDetails -- gotten from mkBootModDetails, probably
145 -> TcGblEnv -- Usages, deprecations, etc
146 -> IO (Messages, Maybe (ModIface, Bool))
147 mkIfaceTc hsc_env maybe_old_fingerprint mod_details
148 tc_result@TcGblEnv{ tcg_mod = this_mod,
150 tcg_imports = imports,
151 tcg_rdr_env = rdr_env,
152 tcg_fix_env = fix_env,
154 tcg_hpc = other_hpc_info
157 let used_names = mkUsedNames tc_result
158 deps <- mkDependencies tc_result
159 let hpc_info = emptyHpcInfo other_hpc_info
160 mkIface_ hsc_env maybe_old_fingerprint
161 this_mod (isHsBoot hsc_src) used_names deps rdr_env
162 fix_env warns hpc_info (imp_mods imports) mod_details
165 mkUsedNames :: TcGblEnv -> NameSet
166 mkUsedNames TcGblEnv{ tcg_dus = dus } = allUses dus
168 mkDependencies :: TcGblEnv -> IO Dependencies
170 TcGblEnv{ tcg_mod = mod,
171 tcg_imports = imports,
175 th_used <- readIORef th_var -- Whether TH is used
177 dep_mods = eltsUFM (delFromUFM (imp_dep_mods imports) (moduleName mod))
178 -- M.hi-boot can be in the imp_dep_mods, but we must remove
179 -- it before recording the modules on which this one depends!
180 -- (We want to retain M.hi-boot in imp_dep_mods so that
181 -- loadHiBootInterface can see if M's direct imports depend
182 -- on M.hi-boot, and hence that we should do the hi-boot consistency
185 pkgs | th_used = insertList thPackageId (imp_dep_pkgs imports)
186 | otherwise = imp_dep_pkgs imports
188 return Deps { dep_mods = sortBy (stableModuleNameCmp `on` fst) dep_mods,
189 dep_pkgs = sortBy stablePackageIdCmp pkgs,
190 dep_orphs = sortBy stableModuleCmp (imp_orphs imports),
191 dep_finsts = sortBy stableModuleCmp (imp_finsts imports) }
192 -- sort to get into canonical order
193 -- NB. remember to use lexicographic ordering
195 mkIface_ :: HscEnv -> Maybe Fingerprint -> Module -> IsBootInterface
196 -> NameSet -> Dependencies -> GlobalRdrEnv
197 -> NameEnv FixItem -> Warnings -> HpcInfo
200 -> IO (Messages, Maybe (ModIface, Bool))
201 mkIface_ hsc_env maybe_old_fingerprint
202 this_mod is_boot used_names deps rdr_env fix_env src_warns hpc_info
204 ModDetails{ md_insts = insts,
205 md_fam_insts = fam_insts,
208 md_vect_info = vect_info,
210 md_exports = exports }
211 -- NB: notice that mkIface does not look at the bindings
212 -- only at the TypeEnv. The previous Tidy phase has
213 -- put exactly the info into the TypeEnv that we want
214 -- to expose in the interface
216 = do { usages <- mkUsageInfo hsc_env this_mod dir_imp_mods used_names
218 ; let { entities = typeEnvElts type_env ;
219 decls = [ tyThingToIfaceDecl entity
220 | entity <- entities,
221 let name = getName entity,
222 not (isImplicitTyThing entity),
223 -- No implicit Ids and class tycons in the interface file
224 not (isWiredInName name),
225 -- Nor wired-in things; the compiler knows about them anyhow
226 nameIsLocalOrFrom this_mod name ]
227 -- Sigh: see Note [Root-main Id] in TcRnDriver
229 ; fixities = [(occ,fix) | FixItem occ fix <- nameEnvElts fix_env]
231 ; iface_rules = map (coreRuleToIfaceRule this_mod) rules
232 ; iface_insts = map instanceToIfaceInst insts
233 ; iface_fam_insts = map famInstToIfaceFamInst fam_insts
234 ; iface_vect_info = flattenVectInfo vect_info
236 ; intermediate_iface = ModIface {
237 mi_module = this_mod,
241 mi_exports = mkIfaceExports exports,
243 -- Sort these lexicographically, so that
244 -- the result is stable across compilations
245 mi_insts = sortLe le_inst iface_insts,
246 mi_fam_insts= sortLe le_fam_inst iface_fam_insts,
247 mi_rules = sortLe le_rule iface_rules,
249 mi_vect_info = iface_vect_info,
251 mi_fixities = fixities,
253 mi_anns = mkIfaceAnnotations anns,
254 mi_globals = Just rdr_env,
256 -- Left out deliberately: filled in by addVersionInfo
257 mi_iface_hash = fingerprint0,
258 mi_mod_hash = fingerprint0,
259 mi_exp_hash = fingerprint0,
260 mi_orphan_hash = fingerprint0,
261 mi_orphan = False, -- Always set by addVersionInfo, but
262 -- it's a strict field, so we can't omit it.
263 mi_finsts = False, -- Ditto
264 mi_decls = deliberatelyOmitted "decls",
265 mi_hash_fn = deliberatelyOmitted "hash_fn",
266 mi_hpc = isHpcUsed hpc_info,
268 -- And build the cached values
269 mi_warn_fn = mkIfaceWarnCache warns,
270 mi_fix_fn = mkIfaceFixCache fixities }
273 ; (new_iface, no_change_at_all)
274 <- {-# SCC "versioninfo" #-}
275 addFingerprints hsc_env maybe_old_fingerprint
276 intermediate_iface decls
278 -- Warn about orphans
279 ; let warn_orphs = dopt Opt_WarnOrphans dflags
280 warn_auto_orphs = dopt Opt_WarnAutoOrphans dflags
281 orph_warnings --- Laziness means no work done unless -fwarn-orphans
282 | warn_orphs || warn_auto_orphs = rule_warns `unionBags` inst_warns
283 | otherwise = emptyBag
284 errs_and_warns = (orph_warnings, emptyBag)
285 unqual = mkPrintUnqualified dflags rdr_env
286 inst_warns = listToBag [ instOrphWarn unqual d
287 | (d,i) <- insts `zip` iface_insts
288 , isNothing (ifInstOrph i) ]
289 rule_warns = listToBag [ ruleOrphWarn unqual this_mod r
291 , isNothing (ifRuleOrph r)
292 , if ifRuleAuto r then warn_auto_orphs
295 ; if errorsFound dflags errs_and_warns
296 then return ( errs_and_warns, Nothing )
299 -- XXX ; when (dopt Opt_D_dump_hi_diffs dflags) (printDump pp_diffs)
302 ; dumpIfSet_dyn dflags Opt_D_dump_hi "FINAL INTERFACE"
303 (pprModIface new_iface)
305 -- bug #1617: on reload we weren't updating the PrintUnqualified
306 -- correctly. This stems from the fact that the interface had
307 -- not changed, so addVersionInfo returns the old ModIface
308 -- with the old GlobalRdrEnv (mi_globals).
309 ; let final_iface = new_iface{ mi_globals = Just rdr_env }
311 ; return (errs_and_warns, Just (final_iface, no_change_at_all)) }}
313 r1 `le_rule` r2 = ifRuleName r1 <= ifRuleName r2
314 i1 `le_inst` i2 = ifDFun i1 `le_occ` ifDFun i2
315 i1 `le_fam_inst` i2 = ifFamInstTcName i1 `le_occ` ifFamInstTcName i2
317 le_occ :: Name -> Name -> Bool
318 -- Compare lexicographically by OccName, *not* by unique, because
319 -- the latter is not stable across compilations
320 le_occ n1 n2 = nameOccName n1 <= nameOccName n2
322 dflags = hsc_dflags hsc_env
324 deliberatelyOmitted :: String -> a
325 deliberatelyOmitted x = panic ("Deliberately omitted: " ++ x)
327 ifFamInstTcName = ifaceTyConName . ifFamInstTyCon
329 flattenVectInfo (VectInfo { vectInfoVar = vVar
330 , vectInfoTyCon = vTyCon
331 , vectInfoScalarVars = vScalarVars
332 , vectInfoScalarTyCons = vScalarTyCons
335 { ifaceVectInfoVar = [Var.varName v | (v, _ ) <- varEnvElts vVar]
336 , ifaceVectInfoTyCon = [tyConName t | (t, t_v) <- nameEnvElts vTyCon, t /= t_v]
337 , ifaceVectInfoTyConReuse = [tyConName t | (t, t_v) <- nameEnvElts vTyCon, t == t_v]
338 , ifaceVectInfoScalarVars = [Var.varName v | v <- varSetElems vScalarVars]
339 , ifaceVectInfoScalarTyCons = nameSetToList vScalarTyCons
342 -----------------------------
343 writeIfaceFile :: DynFlags -> ModLocation -> ModIface -> IO ()
344 writeIfaceFile dflags location new_iface
345 = do createDirectoryHierarchy (takeDirectory hi_file_path)
346 writeBinIface dflags hi_file_path new_iface
347 where hi_file_path = ml_hi_file location
350 -- -----------------------------------------------------------------------------
351 -- Look up parents and versions of Names
353 -- This is like a global version of the mi_hash_fn field in each ModIface.
354 -- Given a Name, it finds the ModIface, and then uses mi_hash_fn to get
355 -- the parent and version info.
358 :: HscEnv -- needed to look up versions
359 -> ExternalPackageState -- ditto
360 -> (Name -> Fingerprint)
361 mkHashFun hsc_env eps
364 mod = ASSERT2( isExternalName name, ppr name ) nameModule name
365 occ = nameOccName name
366 iface = lookupIfaceByModule (hsc_dflags hsc_env) hpt pit mod `orElse`
367 pprPanic "lookupVers2" (ppr mod <+> ppr occ)
369 snd (mi_hash_fn iface occ `orElse`
370 pprPanic "lookupVers1" (ppr mod <+> ppr occ))
372 hpt = hsc_HPT hsc_env
375 -- ---------------------------------------------------------------------------
376 -- Compute fingerprints for the interface
380 -> Maybe Fingerprint -- the old fingerprint, if any
381 -> ModIface -- The new interface (lacking decls)
382 -> [IfaceDecl] -- The new decls
383 -> IO (ModIface, -- Updated interface
384 Bool) -- True <=> no changes at all;
385 -- no need to write Iface
387 addFingerprints hsc_env mb_old_fingerprint iface0 new_decls
389 eps <- hscEPS hsc_env
391 -- The ABI of a declaration represents everything that is made
392 -- visible about the declaration that a client can depend on.
393 -- see IfaceDeclABI below.
394 declABI :: IfaceDecl -> IfaceDeclABI
395 declABI decl = (this_mod, decl, extras)
396 where extras = declExtras fix_fn non_orph_rules non_orph_insts decl
398 edges :: [(IfaceDeclABI, Unique, [Unique])]
399 edges = [ (abi, getUnique (ifName decl), out)
401 , let abi = declABI decl
402 , let out = localOccs $ freeNamesDeclABI abi
405 name_module n = ASSERT2( isExternalName n, ppr n ) nameModule n
406 localOccs = map (getUnique . getParent . getOccName)
407 . filter ((== this_mod) . name_module)
409 where getParent occ = lookupOccEnv parent_map occ `orElse` occ
411 -- maps OccNames to their parents in the current module.
412 -- e.g. a reference to a constructor must be turned into a reference
413 -- to the TyCon for the purposes of calculating dependencies.
414 parent_map :: OccEnv OccName
415 parent_map = foldr extend emptyOccEnv new_decls
417 extendOccEnvList env [ (b,n) | b <- ifaceDeclSubBndrs d ]
420 -- strongly-connected groups of declarations, in dependency order
421 groups = stronglyConnCompFromEdgedVertices edges
423 global_hash_fn = mkHashFun hsc_env eps
425 -- how to output Names when generating the data to fingerprint.
426 -- Here we want to output the fingerprint for each top-level
427 -- Name, whether it comes from the current module or another
428 -- module. In this way, the fingerprint for a declaration will
429 -- change if the fingerprint for anything it refers to (transitively)
431 mk_put_name :: (OccEnv (OccName,Fingerprint))
432 -> BinHandle -> Name -> IO ()
433 mk_put_name local_env bh name
434 | isWiredInName name = putNameLiterally bh name
435 -- wired-in names don't have fingerprints
437 = ASSERT2( isExternalName name, ppr name )
438 let hash | nameModule name /= this_mod = global_hash_fn name
440 snd (lookupOccEnv local_env (getOccName name)
441 `orElse` pprPanic "urk! lookup local fingerprint"
442 (ppr name)) -- (undefined,fingerprint0))
443 -- This panic indicates that we got the dependency
444 -- analysis wrong, because we needed a fingerprint for
445 -- an entity that wasn't in the environment. To debug
446 -- it, turn the panic into a trace, uncomment the
447 -- pprTraces below, run the compile again, and inspect
448 -- the output and the generated .hi file with
453 -- take a strongly-connected group of declarations and compute
456 fingerprint_group :: (OccEnv (OccName,Fingerprint),
457 [(Fingerprint,IfaceDecl)])
459 -> IO (OccEnv (OccName,Fingerprint),
460 [(Fingerprint,IfaceDecl)])
462 fingerprint_group (local_env, decls_w_hashes) (AcyclicSCC abi)
463 = do let hash_fn = mk_put_name local_env
465 -- pprTrace "fingerprinting" (ppr (ifName decl) ) $ do
466 hash <- computeFingerprint dflags hash_fn abi
467 return (extend_hash_env (hash,decl) local_env,
468 (hash,decl) : decls_w_hashes)
470 fingerprint_group (local_env, decls_w_hashes) (CyclicSCC abis)
471 = do let decls = map abiDecl abis
472 local_env' = foldr extend_hash_env local_env
473 (zip (repeat fingerprint0) decls)
474 hash_fn = mk_put_name local_env'
475 -- pprTrace "fingerprinting" (ppr (map ifName decls) ) $ do
476 let stable_abis = sortBy cmp_abiNames abis
477 -- put the cycle in a canonical order
478 hash <- computeFingerprint dflags hash_fn stable_abis
479 let pairs = zip (repeat hash) decls
480 return (foldr extend_hash_env local_env pairs,
481 pairs ++ decls_w_hashes)
483 extend_hash_env :: (Fingerprint,IfaceDecl)
484 -> OccEnv (OccName,Fingerprint)
485 -> OccEnv (OccName,Fingerprint)
486 extend_hash_env (hash,d) env0 = foldr add_imp env1 (ifaceDeclSubBndrs d)
489 item = (decl_name, hash)
490 env1 = extendOccEnv env0 decl_name item
491 add_imp bndr env = extendOccEnv env bndr item
494 (local_env, decls_w_hashes) <-
495 foldM fingerprint_group (emptyOccEnv, []) groups
497 -- when calculating fingerprints, we always need to use canonical
498 -- ordering for lists of things. In particular, the mi_deps has various
499 -- lists of modules and suchlike, so put these all in canonical order:
500 let sorted_deps = sortDependencies (mi_deps iface0)
502 -- the export hash of a module depends on the orphan hashes of the
503 -- orphan modules below us in the dependency tree. This is the way
504 -- that changes in orphans get propagated all the way up the
505 -- dependency tree. We only care about orphan modules in the current
506 -- package, because changes to orphans outside this package will be
507 -- tracked by the usage on the ABI hash of package modules that we import.
508 let orph_mods = filter ((== this_pkg) . modulePackageId)
509 $ dep_orphs sorted_deps
510 dep_orphan_hashes <- getOrphanHashes hsc_env orph_mods
512 orphan_hash <- computeFingerprint dflags (mk_put_name local_env)
513 (map ifDFun orph_insts, orph_rules, fam_insts)
515 -- the export list hash doesn't depend on the fingerprints of
516 -- the Names it mentions, only the Names themselves, hence putNameLiterally.
517 export_hash <- computeFingerprint dflags putNameLiterally
521 dep_pkgs (mi_deps iface0))
522 -- dep_pkgs: see "Package Version Changes" on
523 -- wiki/Commentary/Compiler/RecompilationAvoidance
525 -- put the declarations in a canonical order, sorted by OccName
526 let sorted_decls = Map.elems $ Map.fromList $
527 [(ifName d, e) | e@(_, d) <- decls_w_hashes]
529 -- the ABI hash depends on:
535 mod_hash <- computeFingerprint dflags putNameLiterally
536 (map fst sorted_decls,
541 -- The interface hash depends on:
542 -- - the ABI hash, plus
546 iface_hash <- computeFingerprint dflags putNameLiterally
553 no_change_at_all = Just iface_hash == mb_old_fingerprint
555 final_iface = iface0 {
556 mi_mod_hash = mod_hash,
557 mi_iface_hash = iface_hash,
558 mi_exp_hash = export_hash,
559 mi_orphan_hash = orphan_hash,
560 mi_orphan = not (null orph_rules && null orph_insts),
561 mi_finsts = not . null $ mi_fam_insts iface0,
562 mi_decls = sorted_decls,
563 mi_hash_fn = lookupOccEnv local_env }
565 return (final_iface, no_change_at_all)
568 this_mod = mi_module iface0
569 dflags = hsc_dflags hsc_env
570 this_pkg = thisPackage dflags
571 (non_orph_insts, orph_insts) = mkOrphMap ifInstOrph (mi_insts iface0)
572 (non_orph_rules, orph_rules) = mkOrphMap ifRuleOrph (mi_rules iface0)
573 -- ToDo: shouldn't we be splitting fam_insts into orphans and
575 fam_insts = mi_fam_insts iface0
576 fix_fn = mi_fix_fn iface0
579 getOrphanHashes :: HscEnv -> [Module] -> IO [Fingerprint]
580 getOrphanHashes hsc_env mods = do
581 eps <- hscEPS hsc_env
583 hpt = hsc_HPT hsc_env
585 dflags = hsc_dflags hsc_env
587 case lookupIfaceByModule dflags hpt pit mod of
588 Nothing -> pprPanic "moduleOrphanHash" (ppr mod)
589 Just iface -> mi_orphan_hash iface
591 return (map get_orph_hash mods)
594 sortDependencies :: Dependencies -> Dependencies
596 = Deps { dep_mods = sortBy (compare `on` (moduleNameFS.fst)) (dep_mods d),
597 dep_pkgs = sortBy (compare `on` packageIdFS) (dep_pkgs d),
598 dep_orphs = sortBy stableModuleCmp (dep_orphs d),
599 dep_finsts = sortBy stableModuleCmp (dep_finsts d) }
603 %************************************************************************
605 The ABI of an IfaceDecl
607 %************************************************************************
609 Note [The ABI of an IfaceDecl]
610 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
611 The ABI of a declaration consists of:
613 (a) the full name of the identifier (inc. module and package,
614 because these are used to construct the symbol name by which
615 the identifier is known externally).
617 (b) the declaration itself, as exposed to clients. That is, the
618 definition of an Id is included in the fingerprint only if
619 it is made available as as unfolding in the interface.
621 (c) the fixity of the identifier
623 (e) for classes: instances, fixity & rules for methods
624 (f) for datatypes: instances, fixity & rules for constrs
626 Items (c)-(f) are not stored in the IfaceDecl, but instead appear
627 elsewhere in the interface file. But they are *fingerprinted* with
628 the declaration itself. This is done by grouping (c)-(f) in IfaceDeclExtras,
629 and fingerprinting that as part of the declaration.
632 type IfaceDeclABI = (Module, IfaceDecl, IfaceDeclExtras)
635 = IfaceIdExtras Fixity [IfaceRule]
636 | IfaceDataExtras Fixity [IfaceInstABI] [(Fixity,[IfaceRule])]
637 | IfaceClassExtras Fixity [IfaceInstABI] [(Fixity,[IfaceRule])]
638 | IfaceSynExtras Fixity
639 | IfaceOtherDeclExtras
641 abiDecl :: IfaceDeclABI -> IfaceDecl
642 abiDecl (_, decl, _) = decl
644 cmp_abiNames :: IfaceDeclABI -> IfaceDeclABI -> Ordering
645 cmp_abiNames abi1 abi2 = ifName (abiDecl abi1) `compare`
646 ifName (abiDecl abi2)
648 freeNamesDeclABI :: IfaceDeclABI -> NameSet
649 freeNamesDeclABI (_mod, decl, extras) =
650 freeNamesIfDecl decl `unionNameSets` freeNamesDeclExtras extras
652 freeNamesDeclExtras :: IfaceDeclExtras -> NameSet
653 freeNamesDeclExtras (IfaceIdExtras _ rules)
654 = unionManyNameSets (map freeNamesIfRule rules)
655 freeNamesDeclExtras (IfaceDataExtras _ insts subs)
656 = unionManyNameSets (mkNameSet insts : map freeNamesSub subs)
657 freeNamesDeclExtras (IfaceClassExtras _ insts subs)
658 = unionManyNameSets (mkNameSet insts : map freeNamesSub subs)
659 freeNamesDeclExtras (IfaceSynExtras _)
661 freeNamesDeclExtras IfaceOtherDeclExtras
664 freeNamesSub :: (Fixity,[IfaceRule]) -> NameSet
665 freeNamesSub (_,rules) = unionManyNameSets (map freeNamesIfRule rules)
667 instance Outputable IfaceDeclExtras where
668 ppr IfaceOtherDeclExtras = empty
669 ppr (IfaceIdExtras fix rules) = ppr_id_extras fix rules
670 ppr (IfaceSynExtras fix) = ppr fix
671 ppr (IfaceDataExtras fix insts stuff) = vcat [ppr fix, ppr_insts insts,
672 ppr_id_extras_s stuff]
673 ppr (IfaceClassExtras fix insts stuff) = vcat [ppr fix, ppr_insts insts,
674 ppr_id_extras_s stuff]
676 ppr_insts :: [IfaceInstABI] -> SDoc
677 ppr_insts _ = ptext (sLit "<insts>")
679 ppr_id_extras_s :: [(Fixity, [IfaceRule])] -> SDoc
680 ppr_id_extras_s stuff = vcat [ppr_id_extras f r | (f,r)<- stuff]
682 ppr_id_extras :: Fixity -> [IfaceRule] -> SDoc
683 ppr_id_extras fix rules = ppr fix $$ vcat (map ppr rules)
685 -- This instance is used only to compute fingerprints
686 instance Binary IfaceDeclExtras where
687 get _bh = panic "no get for IfaceDeclExtras"
688 put_ bh (IfaceIdExtras fix rules) = do
689 putByte bh 1; put_ bh fix; put_ bh rules
690 put_ bh (IfaceDataExtras fix insts cons) = do
691 putByte bh 2; put_ bh fix; put_ bh insts; put_ bh cons
692 put_ bh (IfaceClassExtras fix insts methods) = do
693 putByte bh 3; put_ bh fix; put_ bh insts; put_ bh methods
694 put_ bh (IfaceSynExtras fix) = do
695 putByte bh 4; put_ bh fix
696 put_ bh IfaceOtherDeclExtras = do
699 declExtras :: (OccName -> Fixity)
700 -> OccEnv [IfaceRule]
701 -> OccEnv [IfaceInst]
705 declExtras fix_fn rule_env inst_env decl
707 IfaceId{} -> IfaceIdExtras (fix_fn n)
708 (lookupOccEnvL rule_env n)
709 IfaceData{ifCons=cons} ->
710 IfaceDataExtras (fix_fn n)
711 (map ifDFun $ lookupOccEnvL inst_env n)
712 (map (id_extras . ifConOcc) (visibleIfConDecls cons))
713 IfaceClass{ifSigs=sigs} ->
714 IfaceClassExtras (fix_fn n)
715 (map ifDFun $ lookupOccEnvL inst_env n)
716 [id_extras op | IfaceClassOp op _ _ <- sigs]
717 IfaceSyn{} -> IfaceSynExtras (fix_fn n)
718 _other -> IfaceOtherDeclExtras
721 id_extras occ = (fix_fn occ, lookupOccEnvL rule_env occ)
724 -- When hashing an instance, we hash only the DFunId, because that
725 -- depends on all the information about the instance.
727 type IfaceInstABI = IfExtName
729 lookupOccEnvL :: OccEnv [v] -> OccName -> [v]
730 lookupOccEnvL env k = lookupOccEnv env k `orElse` []
732 -- used when we want to fingerprint a structure without depending on the
733 -- fingerprints of external Names that it refers to.
734 putNameLiterally :: BinHandle -> Name -> IO ()
735 putNameLiterally bh name = ASSERT( isExternalName name )
736 do { put_ bh $! nameModule name
737 ; put_ bh $! nameOccName name }
739 computeFingerprint :: Binary a
741 -> (BinHandle -> Name -> IO ())
745 computeFingerprint _dflags put_name a = do
746 bh <- openBinMem (3*1024) -- just less than a block
747 ud <- newWriteState put_name putFS
748 bh <- return $ setUserData bh ud
753 -- for testing: use the md5sum command to generate fingerprints and
754 -- compare the results against our built-in version.
755 fp' <- oldMD5 dflags bh
756 if fp /= fp' then pprPanic "computeFingerprint" (ppr fp <+> ppr fp')
759 oldMD5 dflags bh = do
760 tmp <- newTempName dflags "bin"
762 tmp2 <- newTempName dflags "md5"
763 let cmd = "md5sum " ++ tmp ++ " >" ++ tmp2
766 ExitFailure _ -> ghcError (PhaseFailed cmd r)
768 hash_str <- readFile tmp2
769 return $! readHexFingerprint hash_str
772 instOrphWarn :: PrintUnqualified -> Instance -> WarnMsg
773 instOrphWarn unqual inst
774 = mkWarnMsg (getSrcSpan inst) unqual $
775 hang (ptext (sLit "Warning: orphan instance:")) 2 (pprInstanceHdr inst)
777 ruleOrphWarn :: PrintUnqualified -> Module -> IfaceRule -> WarnMsg
778 ruleOrphWarn unqual mod rule
779 = mkWarnMsg silly_loc unqual $
780 ptext (sLit "Orphan rule:") <+> ppr rule
782 silly_loc = srcLocSpan (mkSrcLoc (moduleNameFS (moduleName mod)) 1 1)
783 -- We don't have a decent SrcSpan for a Rule, not even the CoreRule
784 -- Could readily be fixed by adding a SrcSpan to CoreRule, if we wanted to
786 ----------------------
787 -- mkOrphMap partitions instance decls or rules into
788 -- (a) an OccEnv for ones that are not orphans,
789 -- mapping the local OccName to a list of its decls
790 -- (b) a list of orphan decls
791 mkOrphMap :: (decl -> Maybe OccName) -- (Just occ) for a non-orphan decl, keyed by occ
792 -- Nothing for an orphan decl
793 -> [decl] -- Sorted into canonical order
794 -> (OccEnv [decl], -- Non-orphan decls associated with their key;
795 -- each sublist in canonical order
796 [decl]) -- Orphan decls; in canonical order
797 mkOrphMap get_key decls
798 = foldl go (emptyOccEnv, []) decls
800 go (non_orphs, orphs) d
801 | Just occ <- get_key d
802 = (extendOccEnv_Acc (:) singleton non_orphs occ d, orphs)
803 | otherwise = (non_orphs, d:orphs)
807 %************************************************************************
809 Keeping track of what we've slurped, and fingerprints
811 %************************************************************************
814 mkUsageInfo :: HscEnv -> Module -> ImportedMods -> NameSet -> IO [Usage]
815 mkUsageInfo hsc_env this_mod dir_imp_mods used_names
816 = do { eps <- hscEPS hsc_env
817 ; let usages = mk_usage_info (eps_PIT eps) hsc_env this_mod
818 dir_imp_mods used_names
819 ; usages `seqList` return usages }
820 -- seq the list of Usages returned: occasionally these
821 -- don't get evaluated for a while and we can end up hanging on to
822 -- the entire collection of Ifaces.
824 mk_usage_info :: PackageIfaceTable
830 mk_usage_info pit hsc_env this_mod direct_imports used_names
831 = mapCatMaybes mkUsage usage_mods
833 hpt = hsc_HPT hsc_env
834 dflags = hsc_dflags hsc_env
835 this_pkg = thisPackage dflags
837 used_mods = moduleEnvKeys ent_map
838 dir_imp_mods = (moduleEnvKeys direct_imports)
839 all_mods = used_mods ++ filter (`notElem` used_mods) dir_imp_mods
840 usage_mods = sortBy stableModuleCmp all_mods
841 -- canonical order is imported, to avoid interface-file
844 -- ent_map groups together all the things imported and used
845 -- from a particular module
846 ent_map :: ModuleEnv [OccName]
847 ent_map = foldNameSet add_mv emptyModuleEnv used_names
850 | isWiredInName name = mv_map -- ignore wired-in names
852 = case nameModule_maybe name of
853 Nothing -> pprPanic "mkUsageInfo: internal name?" (ppr name)
854 Just mod -> -- This lambda function is really just a
855 -- specialised (++); originally came about to
856 -- avoid quadratic behaviour (trac #2680)
857 extendModuleEnvWith (\_ xs -> occ:xs) mv_map mod [occ]
858 where occ = nameOccName name
860 -- We want to create a Usage for a home module if
861 -- a) we used something from it; has something in used_names
862 -- b) we imported it, even if we used nothing from it
863 -- (need to recompile if its export list changes: export_fprint)
864 mkUsage :: Module -> Maybe Usage
866 | isNothing maybe_iface -- We can't depend on it if we didn't
867 -- load its interface.
868 || mod == this_mod -- We don't care about usages of
869 -- things in *this* module
872 | modulePackageId mod /= this_pkg
873 = Just UsagePackageModule{ usg_mod = mod,
874 usg_mod_hash = mod_hash }
875 -- for package modules, we record the module hash only
878 && isNothing export_hash
879 && not is_direct_import
881 = Nothing -- Record no usage info
882 -- for directly-imported modules, we always want to record a usage
883 -- on the orphan hash. This is what triggers a recompilation if
884 -- an orphan is added or removed somewhere below us in the future.
887 = Just UsageHomeModule {
888 usg_mod_name = moduleName mod,
889 usg_mod_hash = mod_hash,
890 usg_exports = export_hash,
891 usg_entities = Map.toList ent_hashs }
893 maybe_iface = lookupIfaceByModule dflags hpt pit mod
894 -- In one-shot mode, the interfaces for home-package
895 -- modules accumulate in the PIT not HPT. Sigh.
897 is_direct_import = mod `elemModuleEnv` direct_imports
899 Just iface = maybe_iface
900 finsts_mod = mi_finsts iface
901 hash_env = mi_hash_fn iface
902 mod_hash = mi_mod_hash iface
903 export_hash | depend_on_exports = Just (mi_exp_hash iface)
904 | otherwise = Nothing
906 used_occs = lookupModuleEnv ent_map mod `orElse` []
908 -- Making a Map here ensures that (a) we remove duplicates
909 -- when we have usages on several subordinates of a single parent,
910 -- and (b) that the usages emerge in a canonical order, which
911 -- is why we use Map rather than OccEnv: Map works
912 -- using Ord on the OccNames, which is a lexicographic ordering.
913 ent_hashs :: Map OccName Fingerprint
914 ent_hashs = Map.fromList (map lookup_occ used_occs)
918 Nothing -> pprPanic "mkUsage" (ppr mod <+> ppr occ <+> ppr used_names)
921 depend_on_exports = is_direct_import
923 Even if we used 'import M ()', we have to register a
924 usage on the export list because we are sensitive to
925 changes in orphan instances/rules.
927 In GHC 6.8.x we always returned true, and in
928 fact it recorded a dependency on *all* the
929 modules underneath in the dependency tree. This
930 happens to make orphans work right, but is too
931 expensive: it'll read too many interface files.
932 The 'isNothing maybe_iface' check above saved us
933 from generating many of these usages (at least in
934 one-shot mode), but that's even more bogus!
939 mkIfaceAnnotations :: [Annotation] -> [IfaceAnnotation]
940 mkIfaceAnnotations = map mkIfaceAnnotation
942 mkIfaceAnnotation :: Annotation -> IfaceAnnotation
943 mkIfaceAnnotation (Annotation { ann_target = target, ann_value = serialized }) = IfaceAnnotation {
944 ifAnnotatedTarget = fmap nameOccName target,
945 ifAnnotatedValue = serialized
950 mkIfaceExports :: [AvailInfo]
951 -> [(Module, [GenAvailInfo OccName])]
952 -- Group by module and sort by occurrence
953 mkIfaceExports exports
954 = [ (mod, Map.elems avails)
955 | (mod, avails) <- sortBy (stableModuleCmp `on` fst)
956 (moduleEnvToList groupFM)
957 -- NB. the Map.toList is in a random order,
958 -- because Ord Module is not a predictable
959 -- ordering. Hence we perform a final sort
960 -- using the stable Module ordering.
963 -- Group by the module where the exported entities are defined
964 -- (which may not be the same for all Names in an Avail)
965 -- Deliberately use Map rather than UniqFM so we
966 -- get a canonical ordering
967 groupFM :: ModuleEnv (Map FastString (GenAvailInfo OccName))
968 groupFM = foldl add emptyModuleEnv exports
970 add_one :: ModuleEnv (Map FastString (GenAvailInfo OccName))
971 -> Module -> GenAvailInfo OccName
972 -> ModuleEnv (Map FastString (GenAvailInfo OccName))
973 add_one env mod avail
974 -- XXX Is there a need to flip Map.union here?
975 = extendModuleEnvWith (flip Map.union) env mod
976 (Map.singleton (occNameFS (availName avail)) avail)
978 -- NB: we should not get T(X) and T(Y) in the export list
979 -- else the Map.union will simply discard one! They
980 -- should have been combined by now.
982 = ASSERT( isExternalName n )
983 add_one env (nameModule n) (Avail (nameOccName n))
985 add env (AvailTC tc ns)
986 = ASSERT( all isExternalName ns )
987 foldl add_for_mod env mods
989 tc_occ = nameOccName tc
990 mods = nub (map nameModule ns)
991 -- Usually just one, but see Note [Original module]
994 = add_one env mod (AvailTC tc_occ (sort names_from_mod))
995 -- NB. sort the children, we need a canonical order
997 names_from_mod = [nameOccName n | n <- ns, nameModule n == mod]
1000 Note [Orignal module]
1001 ~~~~~~~~~~~~~~~~~~~~~
1003 module X where { data family T }
1004 module Y( T(..) ) where { import X; data instance T Int = MkT Int }
1005 The exported Avail from Y will look like
1008 - only MkT is brought into scope by the data instance;
1009 - but the parent (used for grouping and naming in T(..) exports) is X.T
1010 - and in this case we export X.T too
1012 In the result of MkIfaceExports, the names are grouped by defining module,
1013 so we may need to split up a single Avail into multiple ones.
1016 %************************************************************************
1018 Load the old interface file for this module (unless
1019 we have it aleady), and check whether it is up to date
1022 %************************************************************************
1025 checkOldIface :: HscEnv
1027 -> Bool -- Source unchanged
1028 -> Maybe ModIface -- Old interface from compilation manager, if any
1029 -> IO (RecompileRequired, Maybe ModIface)
1031 checkOldIface hsc_env mod_summary source_unchanged maybe_iface
1032 = do { showPass (hsc_dflags hsc_env)
1033 ("Checking old interface for " ++
1034 showSDoc (ppr (ms_mod mod_summary))) ;
1036 ; initIfaceCheck hsc_env $
1037 check_old_iface hsc_env mod_summary source_unchanged maybe_iface
1040 check_old_iface :: HscEnv -> ModSummary -> Bool -> Maybe ModIface
1041 -> IfG (Bool, Maybe ModIface)
1042 check_old_iface hsc_env mod_summary source_unchanged maybe_iface
1043 = do -- CHECK WHETHER THE SOURCE HAS CHANGED
1044 { when (not source_unchanged)
1045 (traceHiDiffs (nest 4 (text "Source file changed or recompilation check turned off")))
1047 -- If the source has changed and we're in interactive mode, avoid reading
1048 -- an interface; just return the one we might have been supplied with.
1049 ; let dflags = hsc_dflags hsc_env
1050 ; if not (isObjectTarget (hscTarget dflags)) && not source_unchanged then
1051 return (outOfDate, maybe_iface)
1053 case maybe_iface of {
1054 Just old_iface -> do -- Use the one we already have
1055 { traceIf (text "We already have the old interface for" <+> ppr (ms_mod mod_summary))
1056 ; recomp <- checkVersions hsc_env source_unchanged mod_summary old_iface
1057 ; return (recomp, Just old_iface) }
1061 -- Try and read the old interface for the current module
1062 -- from the .hi file left from the last time we compiled it
1063 { let iface_path = msHiFilePath mod_summary
1064 ; read_result <- readIface (ms_mod mod_summary) iface_path False
1065 ; case read_result of {
1066 Failed err -> do -- Old interface file not found, or garbled; give up
1067 { traceIf (text "FYI: cannot read old interface file:"
1069 ; return (outOfDate, Nothing) }
1071 ; Succeeded iface -> do
1073 -- We have got the old iface; check its versions
1074 { traceIf (text "Read the interface file" <+> text iface_path)
1075 ; recomp <- checkVersions hsc_env source_unchanged mod_summary iface
1076 ; return (recomp, Just iface)
1081 @recompileRequired@ is called from the HscMain. It checks whether
1082 a recompilation is required. It needs access to the persistent state,
1083 finder, etc, because it may have to load lots of interface files to
1084 check their versions.
1087 type RecompileRequired = Bool
1088 upToDate, outOfDate :: Bool
1089 upToDate = False -- Recompile not required
1090 outOfDate = True -- Recompile required
1092 checkVersions :: HscEnv
1093 -> Bool -- True <=> source unchanged
1095 -> ModIface -- Old interface
1096 -> IfG RecompileRequired
1097 checkVersions hsc_env source_unchanged mod_summary iface
1098 | not source_unchanged
1101 = do { traceHiDiffs (text "Considering whether compilation is required for" <+>
1102 ppr (mi_module iface) <> colon)
1104 ; recomp <- checkDependencies hsc_env mod_summary iface
1105 ; if recomp then return outOfDate else do {
1107 -- Source code unchanged and no errors yet... carry on
1109 -- First put the dependent-module info, read from the old
1110 -- interface, into the envt, so that when we look for
1111 -- interfaces we look for the right one (.hi or .hi-boot)
1113 -- It's just temporary because either the usage check will succeed
1114 -- (in which case we are done with this module) or it'll fail (in which
1115 -- case we'll compile the module from scratch anyhow).
1117 -- We do this regardless of compilation mode, although in --make mode
1118 -- all the dependent modules should be in the HPT already, so it's
1120 updateEps_ $ \eps -> eps { eps_is_boot = mod_deps }
1122 ; let this_pkg = thisPackage (hsc_dflags hsc_env)
1123 ; checkList [checkModUsage this_pkg u | u <- mi_usages iface]
1126 -- This is a bit of a hack really
1127 mod_deps :: ModuleNameEnv (ModuleName, IsBootInterface)
1128 mod_deps = mkModDeps (dep_mods (mi_deps iface))
1131 -- If the direct imports of this module are resolved to targets that
1132 -- are not among the dependencies of the previous interface file,
1133 -- then we definitely need to recompile. This catches cases like
1134 -- - an exposed package has been upgraded
1135 -- - we are compiling with different package flags
1136 -- - a home module that was shadowing a package module has been removed
1137 -- - a new home module has been added that shadows a package module
1140 -- Returns True if recompilation is required.
1141 checkDependencies :: HscEnv -> ModSummary -> ModIface -> IfG RecompileRequired
1142 checkDependencies hsc_env summary iface
1143 = orM (map dep_missing (ms_imps summary ++ ms_srcimps summary))
1145 prev_dep_mods = dep_mods (mi_deps iface)
1146 prev_dep_pkgs = dep_pkgs (mi_deps iface)
1148 this_pkg = thisPackage (hsc_dflags hsc_env)
1150 orM = foldr f (return False)
1151 where f m rest = do b <- m; if b then return True else rest
1153 dep_missing (L _ (ImportDecl (L _ mod) pkg _ _ _ _)) = do
1154 find_res <- liftIO $ findImportedModule hsc_env mod pkg
1158 -> if moduleName mod `notElem` map fst prev_dep_mods
1159 then do traceHiDiffs $
1160 text "imported module " <> quotes (ppr mod) <>
1161 text " not among previous dependencies"
1166 -> if pkg `notElem` prev_dep_pkgs
1167 then do traceHiDiffs $
1168 text "imported module " <> quotes (ppr mod) <>
1169 text " is from package " <> quotes (ppr pkg) <>
1170 text ", which is not among previous dependencies"
1174 where pkg = modulePackageId mod
1175 _otherwise -> return outOfDate
1177 needInterface :: Module -> (ModIface -> IfG RecompileRequired)
1178 -> IfG RecompileRequired
1179 needInterface mod continue
1180 = do -- Load the imported interface if possible
1181 let doc_str = sep [ptext (sLit "need version info for"), ppr mod]
1182 traceHiDiffs (text "Checking usages for module" <+> ppr mod)
1184 mb_iface <- loadInterface doc_str mod ImportBySystem
1185 -- Load the interface, but don't complain on failure;
1186 -- Instead, get an Either back which we can test
1189 Failed _ -> (out_of_date (sep [ptext (sLit "Couldn't load interface for module"),
1191 -- Couldn't find or parse a module mentioned in the
1192 -- old interface file. Don't complain: it might
1193 -- just be that the current module doesn't need that
1194 -- import and it's been deleted
1195 Succeeded iface -> continue iface
1198 checkModUsage :: PackageId ->Usage -> IfG RecompileRequired
1199 -- Given the usage information extracted from the old
1200 -- M.hi file for the module being compiled, figure out
1201 -- whether M needs to be recompiled.
1203 checkModUsage _this_pkg UsagePackageModule{
1205 usg_mod_hash = old_mod_hash }
1206 = needInterface mod $ \iface -> do
1207 checkModuleFingerprint old_mod_hash (mi_mod_hash iface)
1208 -- We only track the ABI hash of package modules, rather than
1209 -- individual entity usages, so if the ABI hash changes we must
1210 -- recompile. This is safe but may entail more recompilation when
1211 -- a dependent package has changed.
1213 checkModUsage this_pkg UsageHomeModule{
1214 usg_mod_name = mod_name,
1215 usg_mod_hash = old_mod_hash,
1216 usg_exports = maybe_old_export_hash,
1217 usg_entities = old_decl_hash }
1219 let mod = mkModule this_pkg mod_name
1220 needInterface mod $ \iface -> do
1223 new_mod_hash = mi_mod_hash iface
1224 new_decl_hash = mi_hash_fn iface
1225 new_export_hash = mi_exp_hash iface
1228 recompile <- checkModuleFingerprint old_mod_hash new_mod_hash
1229 if not recompile then return upToDate else do
1231 -- CHECK EXPORT LIST
1232 checkMaybeHash maybe_old_export_hash new_export_hash
1233 (ptext (sLit " Export list changed")) $ do
1235 -- CHECK ITEMS ONE BY ONE
1236 recompile <- checkList [ checkEntityUsage new_decl_hash u
1237 | u <- old_decl_hash]
1239 then return outOfDate -- This one failed, so just bail out now
1240 else up_to_date (ptext (sLit " Great! The bits I use are up to date"))
1242 ------------------------
1243 checkModuleFingerprint :: Fingerprint -> Fingerprint -> IfG Bool
1244 checkModuleFingerprint old_mod_hash new_mod_hash
1245 | new_mod_hash == old_mod_hash
1246 = up_to_date (ptext (sLit "Module fingerprint unchanged"))
1249 = out_of_date_hash (ptext (sLit " Module fingerprint has changed"))
1250 old_mod_hash new_mod_hash
1252 ------------------------
1253 checkMaybeHash :: Maybe Fingerprint -> Fingerprint -> SDoc
1254 -> IfG RecompileRequired -> IfG RecompileRequired
1255 checkMaybeHash maybe_old_hash new_hash doc continue
1256 | Just hash <- maybe_old_hash, hash /= new_hash
1257 = out_of_date_hash doc hash new_hash
1261 ------------------------
1262 checkEntityUsage :: (OccName -> Maybe (OccName, Fingerprint))
1263 -> (OccName, Fingerprint)
1265 checkEntityUsage new_hash (name,old_hash)
1266 = case new_hash name of
1268 Nothing -> -- We used it before, but it ain't there now
1269 out_of_date (sep [ptext (sLit "No longer exported:"), ppr name])
1271 Just (_, new_hash) -- It's there, but is it up to date?
1272 | new_hash == old_hash -> do traceHiDiffs (text " Up to date" <+> ppr name <+> parens (ppr new_hash))
1274 | otherwise -> out_of_date_hash (ptext (sLit " Out of date:") <+> ppr name)
1277 up_to_date, out_of_date :: SDoc -> IfG Bool
1278 up_to_date msg = traceHiDiffs msg >> return upToDate
1279 out_of_date msg = traceHiDiffs msg >> return outOfDate
1281 out_of_date_hash :: SDoc -> Fingerprint -> Fingerprint -> IfG Bool
1282 out_of_date_hash msg old_hash new_hash
1283 = out_of_date (hsep [msg, ppr old_hash, ptext (sLit "->"), ppr new_hash])
1285 ----------------------
1286 checkList :: [IfG RecompileRequired] -> IfG RecompileRequired
1287 -- This helper is used in two places
1288 checkList [] = return upToDate
1289 checkList (check:checks) = do recompile <- check
1291 then return outOfDate
1292 else checkList checks
1295 %************************************************************************
1297 Converting things to their Iface equivalents
1299 %************************************************************************
1302 tyThingToIfaceDecl :: TyThing -> IfaceDecl
1303 -- Assumption: the thing is already tidied, so that locally-bound names
1304 -- (lambdas, for-alls) already have non-clashing OccNames
1305 -- Reason: Iface stuff uses OccNames, and the conversion here does
1306 -- not do tidying on the way
1307 tyThingToIfaceDecl (AnId id)
1308 = IfaceId { ifName = getOccName id,
1309 ifType = toIfaceType (idType id),
1310 ifIdDetails = toIfaceIdDetails (idDetails id),
1311 ifIdInfo = toIfaceIdInfo (idInfo id) }
1313 tyThingToIfaceDecl (AClass clas)
1314 = IfaceClass { ifCtxt = toIfaceContext sc_theta,
1315 ifName = getOccName clas,
1316 ifTyVars = toIfaceTvBndrs clas_tyvars,
1317 ifFDs = map toIfaceFD clas_fds,
1318 ifATs = map (tyThingToIfaceDecl . ATyCon) clas_ats,
1319 ifSigs = map toIfaceClassOp op_stuff,
1320 ifRec = boolToRecFlag (isRecursiveTyCon tycon) }
1322 (clas_tyvars, clas_fds, sc_theta, _, clas_ats, op_stuff)
1323 = classExtraBigSig clas
1324 tycon = classTyCon clas
1326 toIfaceClassOp (sel_id, def_meth)
1327 = ASSERT(sel_tyvars == clas_tyvars)
1328 IfaceClassOp (getOccName sel_id) (toDmSpec def_meth) (toIfaceType op_ty)
1330 -- Be careful when splitting the type, because of things
1331 -- like class Foo a where
1332 -- op :: (?x :: String) => a -> a
1333 -- and class Baz a where
1334 -- op :: (Ord a) => a -> a
1335 (sel_tyvars, rho_ty) = splitForAllTys (idType sel_id)
1336 op_ty = funResultTy rho_ty
1338 toDmSpec NoDefMeth = NoDM
1339 toDmSpec (GenDefMeth _) = GenericDM
1340 toDmSpec (DefMeth _) = VanillaDM
1342 toIfaceFD (tvs1, tvs2) = (map getFS tvs1, map getFS tvs2)
1344 tyThingToIfaceDecl (ATyCon tycon)
1346 = IfaceSyn { ifName = getOccName tycon,
1347 ifTyVars = toIfaceTvBndrs tyvars,
1350 ifFamInst = famInstToIface (tyConFamInst_maybe tycon)
1354 = IfaceData { ifName = getOccName tycon,
1355 ifTyVars = toIfaceTvBndrs tyvars,
1356 ifCtxt = toIfaceContext (tyConStupidTheta tycon),
1357 ifCons = ifaceConDecls (algTyConRhs tycon),
1358 ifRec = boolToRecFlag (isRecursiveTyCon tycon),
1359 ifGadtSyntax = isGadtSyntaxTyCon tycon,
1360 ifFamInst = famInstToIface (tyConFamInst_maybe tycon)}
1362 | isForeignTyCon tycon
1363 = IfaceForeign { ifName = getOccName tycon,
1364 ifExtName = tyConExtName tycon }
1366 | otherwise = pprPanic "toIfaceDecl" (ppr tycon)
1368 tyvars = tyConTyVars tycon
1370 = case synTyConRhs tycon of
1371 SynFamilyTyCon -> (Nothing, toIfaceType (synTyConResKind tycon))
1372 SynonymTyCon ty -> (Just (toIfaceType ty), toIfaceType (typeKind ty))
1374 ifaceConDecls (NewTyCon { data_con = con }) =
1375 IfNewTyCon (ifaceConDecl con)
1376 ifaceConDecls (DataTyCon { data_cons = cons }) =
1377 IfDataTyCon (map ifaceConDecl cons)
1378 ifaceConDecls DataFamilyTyCon {} = IfOpenDataTyCon
1379 ifaceConDecls AbstractTyCon = IfAbstractTyCon
1380 -- The last case happens when a TyCon has been trimmed during tidying
1381 -- Furthermore, tyThingToIfaceDecl is also used
1382 -- in TcRnDriver for GHCi, when browsing a module, in which case the
1383 -- AbstractTyCon case is perfectly sensible.
1385 ifaceConDecl data_con
1386 = IfCon { ifConOcc = getOccName (dataConName data_con),
1387 ifConInfix = dataConIsInfix data_con,
1388 ifConWrapper = isJust (dataConWrapId_maybe data_con),
1389 ifConUnivTvs = toIfaceTvBndrs univ_tvs,
1390 ifConExTvs = toIfaceTvBndrs ex_tvs,
1391 ifConEqSpec = to_eq_spec eq_spec,
1392 ifConCtxt = toIfaceContext theta,
1393 ifConArgTys = map toIfaceType arg_tys,
1394 ifConFields = map getOccName
1395 (dataConFieldLabels data_con),
1396 ifConStricts = dataConStrictMarks data_con }
1398 (univ_tvs, ex_tvs, eq_spec, theta, arg_tys, _) = dataConFullSig data_con
1400 to_eq_spec spec = [(getOccName tv, toIfaceType ty) | (tv,ty) <- spec]
1402 famInstToIface Nothing = Nothing
1403 famInstToIface (Just (famTyCon, instTys)) =
1404 Just (toIfaceTyCon famTyCon, map toIfaceType instTys)
1406 tyThingToIfaceDecl c@(ACoAxiom _) = pprPanic "tyThingToIfaceDecl (ACoCon _)" (ppr c)
1408 tyThingToIfaceDecl (ADataCon dc)
1409 = pprPanic "toIfaceDecl" (ppr dc) -- Should be trimmed out earlier
1412 getFS :: NamedThing a => a -> FastString
1413 getFS x = occNameFS (getOccName x)
1415 --------------------------
1416 instanceToIfaceInst :: Instance -> IfaceInst
1417 instanceToIfaceInst (Instance { is_dfun = dfun_id, is_flag = oflag,
1418 is_cls = cls_name, is_tcs = mb_tcs })
1419 = ASSERT( cls_name == className cls )
1420 IfaceInst { ifDFun = dfun_name,
1422 ifInstCls = cls_name,
1423 ifInstTys = map do_rough mb_tcs,
1426 do_rough Nothing = Nothing
1427 do_rough (Just n) = Just (toIfaceTyCon_name n)
1429 dfun_name = idName dfun_id
1430 mod = ASSERT( isExternalName dfun_name ) nameModule dfun_name
1431 is_local name = nameIsLocalOrFrom mod name
1433 -- Compute orphanhood. See Note [Orphans] in IfaceSyn
1434 (_, _, cls, tys) = tcSplitDFunTy (idType dfun_id)
1435 -- Slightly awkward: we need the Class to get the fundeps
1436 (tvs, fds) = classTvsFds cls
1437 arg_names = [filterNameSet is_local (orphNamesOfType ty) | ty <- tys]
1438 orph | is_local cls_name = Just (nameOccName cls_name)
1439 | all isJust mb_ns = ASSERT( not (null mb_ns) ) head mb_ns
1440 | otherwise = Nothing
1442 mb_ns :: [Maybe OccName] -- One for each fundep; a locally-defined name
1443 -- that is not in the "determined" arguments
1444 mb_ns | null fds = [choose_one arg_names]
1445 | otherwise = map do_one fds
1446 do_one (_ltvs, rtvs) = choose_one [ns | (tv,ns) <- tvs `zip` arg_names
1447 , not (tv `elem` rtvs)]
1449 choose_one :: [NameSet] -> Maybe OccName
1450 choose_one nss = case nameSetToList (unionManyNameSets nss) of
1452 (n : _) -> Just (nameOccName n)
1454 --------------------------
1455 famInstToIfaceFamInst :: FamInst -> IfaceFamInst
1456 famInstToIfaceFamInst (FamInst { fi_tycon = tycon,
1459 = IfaceFamInst { ifFamInstTyCon = toIfaceTyCon tycon
1460 , ifFamInstFam = fam
1461 , ifFamInstTys = map do_rough mb_tcs }
1463 do_rough Nothing = Nothing
1464 do_rough (Just n) = Just (toIfaceTyCon_name n)
1466 --------------------------
1467 toIfaceLetBndr :: Id -> IfaceLetBndr
1468 toIfaceLetBndr id = IfLetBndr (occNameFS (getOccName id))
1469 (toIfaceType (idType id))
1470 (toIfaceIdInfo (idInfo id))
1471 -- Put into the interface file any IdInfo that CoreTidy.tidyLetBndr
1472 -- has left on the Id. See Note [IdInfo on nested let-bindings] in IfaceSyn
1474 --------------------------
1475 toIfaceIdDetails :: IdDetails -> IfaceIdDetails
1476 toIfaceIdDetails VanillaId = IfVanillaId
1477 toIfaceIdDetails (DFunId ns _) = IfDFunId ns
1478 toIfaceIdDetails (RecSelId { sel_naughty = n
1479 , sel_tycon = tc }) = IfRecSelId (toIfaceTyCon tc) n
1480 toIfaceIdDetails other = pprTrace "toIfaceIdDetails" (ppr other)
1481 IfVanillaId -- Unexpected
1483 toIfaceIdInfo :: IdInfo -> IfaceIdInfo
1484 toIfaceIdInfo id_info
1485 = case catMaybes [arity_hsinfo, caf_hsinfo, strict_hsinfo,
1486 inline_hsinfo, unfold_hsinfo] of
1488 infos -> HasInfo infos
1489 -- NB: strictness must appear in the list before unfolding
1490 -- See TcIface.tcUnfolding
1492 ------------ Arity --------------
1493 arity_info = arityInfo id_info
1494 arity_hsinfo | arity_info == 0 = Nothing
1495 | otherwise = Just (HsArity arity_info)
1497 ------------ Caf Info --------------
1498 caf_info = cafInfo id_info
1499 caf_hsinfo = case caf_info of
1500 NoCafRefs -> Just HsNoCafRefs
1503 ------------ Strictness --------------
1504 -- No point in explicitly exporting TopSig
1505 strict_hsinfo = case strictnessInfo id_info of
1506 Just sig | not (isTopSig sig) -> Just (HsStrictness sig)
1509 ------------ Unfolding --------------
1510 unfold_hsinfo = toIfUnfolding loop_breaker (unfoldingInfo id_info)
1511 loop_breaker = isNonRuleLoopBreaker (occInfo id_info)
1513 ------------ Inline prag --------------
1514 inline_prag = inlinePragInfo id_info
1515 inline_hsinfo | isDefaultInlinePragma inline_prag = Nothing
1516 | otherwise = Just (HsInline inline_prag)
1518 --------------------------
1519 toIfUnfolding :: Bool -> Unfolding -> Maybe IfaceInfoItem
1520 toIfUnfolding lb (CoreUnfolding { uf_tmpl = rhs, uf_arity = arity
1521 , uf_src = src, uf_guidance = guidance })
1522 = Just $ HsUnfold lb $
1526 UnfWhen unsat_ok boring_ok -> IfInlineRule arity unsat_ok boring_ok if_rhs
1527 _other -> IfCoreUnfold True if_rhs
1528 InlineWrapper w | isExternalName n -> IfExtWrapper arity n
1529 | otherwise -> IfLclWrapper arity (getFS n)
1532 InlineCompulsory -> IfCompulsory if_rhs
1533 InlineRhs -> IfCoreUnfold False if_rhs
1534 -- Yes, even if guidance is UnfNever, expose the unfolding
1535 -- If we didn't want to expose the unfolding, TidyPgm would
1536 -- have stuck in NoUnfolding. For supercompilation we want
1537 -- to see that unfolding!
1539 if_rhs = toIfaceExpr rhs
1541 toIfUnfolding lb (DFunUnfolding _ar _con ops)
1542 = Just (HsUnfold lb (IfDFunUnfold (map (fmap toIfaceExpr) ops)))
1543 -- No need to serialise the data constructor;
1544 -- we can recover it from the type of the dfun
1549 --------------------------
1550 coreRuleToIfaceRule :: Module -> CoreRule -> IfaceRule
1551 coreRuleToIfaceRule _ (BuiltinRule { ru_fn = fn})
1552 = pprTrace "toHsRule: builtin" (ppr fn) $
1555 coreRuleToIfaceRule mod rule@(Rule { ru_name = name, ru_fn = fn,
1556 ru_act = act, ru_bndrs = bndrs,
1557 ru_args = args, ru_rhs = rhs,
1559 = IfaceRule { ifRuleName = name, ifActivation = act,
1560 ifRuleBndrs = map toIfaceBndr bndrs,
1562 ifRuleArgs = map do_arg args,
1563 ifRuleRhs = toIfaceExpr rhs,
1567 -- For type args we must remove synonyms from the outermost
1568 -- level. Reason: so that when we read it back in we'll
1569 -- construct the same ru_rough field as we have right now;
1571 do_arg (Type ty) = IfaceType (toIfaceType (deNoteType ty))
1572 do_arg (Coercion co) = IfaceType (coToIfaceType co)
1574 do_arg arg = toIfaceExpr arg
1576 -- Compute orphanhood. See Note [Orphans] in IfaceSyn
1577 -- A rule is an orphan only if none of the variables
1578 -- mentioned on its left-hand side are locally defined
1579 lhs_names = nameSetToList (ruleLhsOrphNames rule)
1581 orph = case filter (nameIsLocalOrFrom mod) lhs_names of
1582 (n : _) -> Just (nameOccName n)
1585 bogusIfaceRule :: Name -> IfaceRule
1586 bogusIfaceRule id_name
1587 = IfaceRule { ifRuleName = fsLit "bogus", ifActivation = NeverActive,
1588 ifRuleBndrs = [], ifRuleHead = id_name, ifRuleArgs = [],
1589 ifRuleRhs = IfaceExt id_name, ifRuleOrph = Nothing, ifRuleAuto = True }
1591 ---------------------
1592 toIfaceExpr :: CoreExpr -> IfaceExpr
1593 toIfaceExpr (Var v) = toIfaceVar v
1594 toIfaceExpr (Lit l) = IfaceLit l
1595 toIfaceExpr (Type ty) = IfaceType (toIfaceType ty)
1596 toIfaceExpr (Coercion co) = IfaceCo (coToIfaceType co)
1597 toIfaceExpr (Lam x b) = IfaceLam (toIfaceBndr x) (toIfaceExpr b)
1598 toIfaceExpr (App f a) = toIfaceApp f [a]
1599 toIfaceExpr (Case s x _ as) = IfaceCase (toIfaceExpr s) (getFS x) (map toIfaceAlt as)
1600 toIfaceExpr (Let b e) = IfaceLet (toIfaceBind b) (toIfaceExpr e)
1601 toIfaceExpr (Cast e co) = IfaceCast (toIfaceExpr e) (coToIfaceType co)
1602 toIfaceExpr (Note n e) = IfaceNote (toIfaceNote n) (toIfaceExpr e)
1604 ---------------------
1605 toIfaceNote :: Note -> IfaceNote
1606 toIfaceNote (SCC cc) = IfaceSCC cc
1607 toIfaceNote (CoreNote s) = IfaceCoreNote s
1609 ---------------------
1610 toIfaceBind :: Bind Id -> IfaceBinding
1611 toIfaceBind (NonRec b r) = IfaceNonRec (toIfaceLetBndr b) (toIfaceExpr r)
1612 toIfaceBind (Rec prs) = IfaceRec [(toIfaceLetBndr b, toIfaceExpr r) | (b,r) <- prs]
1614 ---------------------
1615 toIfaceAlt :: (AltCon, [Var], CoreExpr)
1616 -> (IfaceConAlt, [FastString], IfaceExpr)
1617 toIfaceAlt (c,bs,r) = (toIfaceCon c, map getFS bs, toIfaceExpr r)
1619 ---------------------
1620 toIfaceCon :: AltCon -> IfaceConAlt
1621 toIfaceCon (DataAlt dc) | isTupleTyCon tc = IfaceTupleAlt (tupleTyConBoxity tc)
1622 | otherwise = IfaceDataAlt (getName dc)
1624 tc = dataConTyCon dc
1626 toIfaceCon (LitAlt l) = IfaceLitAlt l
1627 toIfaceCon DEFAULT = IfaceDefault
1629 ---------------------
1630 toIfaceApp :: Expr CoreBndr -> [Arg CoreBndr] -> IfaceExpr
1631 toIfaceApp (App f a) as = toIfaceApp f (a:as)
1632 toIfaceApp (Var v) as
1633 = case isDataConWorkId_maybe v of
1634 -- We convert the *worker* for tuples into IfaceTuples
1635 Just dc | isTupleTyCon tc && saturated
1636 -> IfaceTuple (tupleTyConBoxity tc) tup_args
1638 val_args = dropWhile isTypeArg as
1639 saturated = val_args `lengthIs` idArity v
1640 tup_args = map toIfaceExpr val_args
1641 tc = dataConTyCon dc
1643 _ -> mkIfaceApps (toIfaceVar v) as
1645 toIfaceApp e as = mkIfaceApps (toIfaceExpr e) as
1647 mkIfaceApps :: IfaceExpr -> [CoreExpr] -> IfaceExpr
1648 mkIfaceApps f as = foldl (\f a -> IfaceApp f (toIfaceExpr a)) f as
1650 ---------------------
1651 toIfaceVar :: Id -> IfaceExpr
1653 | Just fcall <- isFCallId_maybe v = IfaceFCall fcall (toIfaceType (idType v))
1654 -- Foreign calls have special syntax
1655 | isExternalName name = IfaceExt name
1656 | Just (TickBox m ix) <- isTickBoxOp_maybe v
1658 | otherwise = IfaceLcl (getFS name)