3 -- We always optimise this, otherwise performance of a non-optimised
4 -- compiler is severely affected
7 -- (c) The University of Glasgow 2002-2006
9 -- Binary interface file support.
11 module BinIface ( writeBinIface, readBinIface,
12 CheckHiWay(..), TraceBinIFaceReading(..) ) where
14 #include "HsVersions.h"
48 data CheckHiWay = CheckHiWay | IgnoreHiWay
51 data TraceBinIFaceReading = TraceBinIFaceReading | QuietBinIFaceReading
54 -- ---------------------------------------------------------------------------
55 -- Reading and writing binary interface files
57 readBinIface :: CheckHiWay -> TraceBinIFaceReading -> FilePath
58 -> TcRnIf a b ModIface
59 readBinIface checkHiWay traceBinIFaceReading hi_path = do
60 update_nc <- mkNameCacheUpdater
62 liftIO $ readBinIface_ dflags checkHiWay traceBinIFaceReading hi_path update_nc
64 readBinIface_ :: DynFlags -> CheckHiWay -> TraceBinIFaceReading -> FilePath
65 -> NameCacheUpdater (Array Int Name)
67 readBinIface_ dflags checkHiWay traceBinIFaceReading hi_path update_nc = do
68 let printer :: SDoc -> IO ()
69 printer = case traceBinIFaceReading of
70 TraceBinIFaceReading -> \sd -> printSDoc sd defaultDumpStyle
71 QuietBinIFaceReading -> \_ -> return ()
72 wantedGot :: Outputable a => String -> a -> a -> IO ()
73 wantedGot what wanted got
74 = printer (text what <> text ": " <>
75 vcat [text "Wanted " <> ppr wanted <> text ",",
76 text "got " <> ppr got])
78 errorOnMismatch :: (Eq a, Show a) => String -> a -> a -> IO ()
79 errorOnMismatch what wanted got
80 -- This will be caught by readIface which will emit an error
81 -- msg containing the iface module name.
82 = when (wanted /= got) $ ghcError $ ProgramError
83 (what ++ " (wanted " ++ show wanted
84 ++ ", got " ++ show got ++ ")")
85 bh <- Binary.readBinMem hi_path
87 -- Read the magic number to check that this really is a GHC .hi file
88 -- (This magic number does not change when we change
89 -- GHC interface file format)
91 wantedGot "Magic" binaryInterfaceMagic magic
92 errorOnMismatch "magic number mismatch: old/corrupt interface file?"
93 binaryInterfaceMagic magic
95 -- Get the dictionary pointer. We won't attempt to actually
96 -- read the dictionary until we've done the version checks below,
97 -- just in case this isn't a valid interface. In retrospect the
98 -- version should have come before the dictionary pointer, but this
99 -- is the way it was done originally, and we can't change it now.
100 dict_p <- Binary.get bh -- Get the dictionary ptr
102 -- Check the interface file version and ways.
104 let our_ver = show opt_HiVersion
105 wantedGot "Version" our_ver check_ver
106 errorOnMismatch "mismatched interface file versions" our_ver check_ver
109 let way_descr = getWayDescr dflags
110 wantedGot "Way" way_descr check_way
111 when (checkHiWay == CheckHiWay) $
112 errorOnMismatch "mismatched interface file ways" way_descr check_way
114 -- Read the dictionary
115 -- The next word in the file is a pointer to where the dictionary is
116 -- (probably at the end of the file)
117 data_p <- tellBin bh -- Remember where we are now
119 dict <- getDictionary bh
120 seekBin bh data_p -- Back to where we were before
122 -- Initialise the user-data field of bh
123 ud <- newReadState dict
124 bh <- return (setUserData bh ud)
126 symtab_p <- Binary.get bh -- Get the symtab ptr
127 data_p <- tellBin bh -- Remember where we are now
129 symtab <- getSymbolTable bh update_nc
130 seekBin bh data_p -- Back to where we were before
131 let ud = getUserData bh
132 bh <- return $! setUserData bh ud{ud_symtab = symtab}
137 writeBinIface :: DynFlags -> FilePath -> ModIface -> IO ()
138 writeBinIface dflags hi_path mod_iface = do
139 bh <- openBinMem initBinMemSize
140 put_ bh binaryInterfaceMagic
142 -- Remember where the dictionary pointer will go
143 dict_p_p <- tellBin bh
144 put_ bh dict_p_p -- Placeholder for ptr to dictionary
146 -- The version and way descriptor go next
147 put_ bh (show opt_HiVersion)
148 let way_descr = getWayDescr dflags
151 -- Remember where the symbol table pointer will go
152 symtab_p_p <- tellBin bh
155 -- Make some intial state
156 symtab_next <- newFastMutInt
157 writeFastMutInt symtab_next 0
158 symtab_map <- newIORef emptyUFM
159 let bin_symtab = BinSymbolTable {
160 bin_symtab_next = symtab_next,
161 bin_symtab_map = symtab_map }
162 dict_next_ref <- newFastMutInt
163 writeFastMutInt dict_next_ref 0
164 dict_map_ref <- newIORef emptyUFM
165 let bin_dict = BinDictionary {
166 bin_dict_next = dict_next_ref,
167 bin_dict_map = dict_map_ref }
168 ud <- newWriteState (putName bin_symtab) (putFastString bin_dict)
170 -- Put the main thing,
171 bh <- return $ setUserData bh ud
174 -- Write the symtab pointer at the fornt of the file
175 symtab_p <- tellBin bh -- This is where the symtab will start
176 putAt bh symtab_p_p symtab_p -- Fill in the placeholder
177 seekBin bh symtab_p -- Seek back to the end of the file
179 -- Write the symbol table itself
180 symtab_next <- readFastMutInt symtab_next
181 symtab_map <- readIORef symtab_map
182 putSymbolTable bh symtab_next symtab_map
183 debugTraceMsg dflags 3 (text "writeBinIface:" <+> int symtab_next
186 -- NB. write the dictionary after the symbol table, because
187 -- writing the symbol table may create more dictionary entries.
189 -- Write the dictionary pointer at the fornt of the file
190 dict_p <- tellBin bh -- This is where the dictionary will start
191 putAt bh dict_p_p dict_p -- Fill in the placeholder
192 seekBin bh dict_p -- Seek back to the end of the file
194 -- Write the dictionary itself
195 dict_next <- readFastMutInt dict_next_ref
196 dict_map <- readIORef dict_map_ref
197 putDictionary bh dict_next dict_map
198 debugTraceMsg dflags 3 (text "writeBinIface:" <+> int dict_next
199 <+> text "dict entries")
201 -- And send the result to the file
202 writeBinMem bh hi_path
204 initBinMemSize :: Int
205 initBinMemSize = 1024 * 1024
207 -- The *host* architecture version:
208 #include "../includes/MachDeps.h"
210 binaryInterfaceMagic :: Word32
211 #if WORD_SIZE_IN_BITS == 32
212 binaryInterfaceMagic = 0x1face
213 #elif WORD_SIZE_IN_BITS == 64
214 binaryInterfaceMagic = 0x1face64
217 -- -----------------------------------------------------------------------------
220 putSymbolTable :: BinHandle -> Int -> UniqFM (Int,Name) -> IO ()
221 putSymbolTable bh next_off symtab = do
223 let names = elems (array (0,next_off-1) (eltsUFM symtab))
224 mapM_ (\n -> serialiseName bh n symtab) names
226 getSymbolTable :: BinHandle -> NameCacheUpdater (Array Int Name)
227 -> IO (Array Int Name)
228 getSymbolTable bh update_namecache = do
230 od_names <- sequence (replicate sz (get bh))
231 update_namecache $ \namecache ->
233 arr = listArray (0,sz-1) names
234 (namecache', names) =
235 mapAccumR (fromOnDiskName arr) namecache od_names
238 type OnDiskName = (PackageId, ModuleName, OccName)
245 fromOnDiskName _ nc (pid, mod_name, occ) =
247 mod = mkModule pid mod_name
250 case lookupOrigNameCache cache mod occ of
251 Just name -> (nc, name)
255 uniq = uniqFromSupply us
256 name = mkExternalName uniq mod occ noSrcSpan
257 new_cache = extendNameCache cache mod occ name
259 case splitUniqSupply us of { (us',_) ->
260 ( nc{ nsUniqs = us', nsNames = new_cache }, name )
263 serialiseName :: BinHandle -> Name -> UniqFM (Int,Name) -> IO ()
264 serialiseName bh name _ = do
265 let mod = ASSERT2( isExternalName name, ppr name ) nameModule name
266 put_ bh (modulePackageId mod, moduleName mod, nameOccName name)
269 putName :: BinSymbolTable -> BinHandle -> Name -> IO ()
270 putName BinSymbolTable{
271 bin_symtab_map = symtab_map_ref,
272 bin_symtab_next = symtab_next } bh name
274 symtab_map <- readIORef symtab_map_ref
275 case lookupUFM symtab_map name of
276 Just (off,_) -> put_ bh off
278 off <- readFastMutInt symtab_next
279 writeFastMutInt symtab_next (off+1)
280 writeIORef symtab_map_ref
281 $! addToUFM symtab_map name (off,name)
285 data BinSymbolTable = BinSymbolTable {
286 bin_symtab_next :: !FastMutInt, -- The next index to use
287 bin_symtab_map :: !(IORef (UniqFM (Int,Name)))
292 putFastString :: BinDictionary -> BinHandle -> FastString -> IO ()
293 putFastString BinDictionary { bin_dict_next = j_r,
294 bin_dict_map = out_r} bh f
296 out <- readIORef out_r
297 let uniq = getUnique f
298 case lookupUFM out uniq of
299 Just (j, _) -> put_ bh j
301 j <- readFastMutInt j_r
303 writeFastMutInt j_r (j + 1)
304 writeIORef out_r $! addToUFM out uniq (j, f)
307 data BinDictionary = BinDictionary {
308 bin_dict_next :: !FastMutInt, -- The next index to use
309 bin_dict_map :: !(IORef (UniqFM (Int,FastString)))
310 -- indexed by FastString
313 -- -----------------------------------------------------------------------------
314 -- All the binary instances
317 {-! for IPName derive: Binary !-}
318 {-! for Fixity derive: Binary !-}
319 {-! for FixityDirection derive: Binary !-}
320 {-! for Boxity derive: Binary !-}
321 {-! for StrictnessMark derive: Binary !-}
322 {-! for Activation derive: Binary !-}
325 {-! for Demand derive: Binary !-}
326 {-! for Demands derive: Binary !-}
327 {-! for DmdResult derive: Binary !-}
328 {-! for StrictSig derive: Binary !-}
331 {-! for DefMeth derive: Binary !-}
334 {-! for HsPred derive: Binary !-}
335 {-! for HsType derive: Binary !-}
336 {-! for TupCon derive: Binary !-}
337 {-! for HsTyVarBndr derive: Binary !-}
340 {-! for UfExpr derive: Binary !-}
341 {-! for UfConAlt derive: Binary !-}
342 {-! for UfBinding derive: Binary !-}
343 {-! for UfBinder derive: Binary !-}
344 {-! for HsIdInfo derive: Binary !-}
345 {-! for UfNote derive: Binary !-}
348 {-! for ConDetails derive: Binary !-}
349 {-! for BangType derive: Binary !-}
352 {-! for IsCafCC derive: Binary !-}
353 {-! for IsDupdCC derive: Binary !-}
354 {-! for CostCentre derive: Binary !-}
358 -- ---------------------------------------------------------------------------
359 -- Reading a binary interface into ParsedIface
361 instance Binary ModIface where
365 mi_iface_hash= iface_hash,
366 mi_mod_hash = mod_hash,
368 mi_finsts = hasFamInsts,
371 mi_exports = exports,
372 mi_exp_hash = exp_hash,
373 mi_fixities = fixities,
378 mi_fam_insts = fam_insts,
380 mi_orphan_hash = orphan_hash,
381 mi_vect_info = vect_info,
382 mi_hpc = hpc_info }) = do
410 hasFamInsts <- get bh
412 usages <- {-# SCC "bin_usages" #-} lazyGet bh
413 exports <- {-# SCC "bin_exports" #-} get bh
415 fixities <- {-# SCC "bin_fixities" #-} get bh
416 warns <- {-# SCC "bin_warns" #-} lazyGet bh
417 anns <- {-# SCC "bin_anns" #-} lazyGet bh
418 decls <- {-# SCC "bin_tycldecls" #-} get bh
419 insts <- {-# SCC "bin_insts" #-} get bh
420 fam_insts <- {-# SCC "bin_fam_insts" #-} get bh
421 rules <- {-# SCC "bin_rules" #-} lazyGet bh
422 orphan_hash <- get bh
426 mi_module = mod_name,
428 mi_iface_hash = iface_hash,
429 mi_mod_hash = mod_hash,
431 mi_finsts = hasFamInsts,
434 mi_exports = exports,
435 mi_exp_hash = exp_hash,
437 mi_fixities = fixities,
440 mi_globals = Nothing,
442 mi_fam_insts = fam_insts,
444 mi_orphan_hash = orphan_hash,
445 mi_vect_info = vect_info,
447 -- And build the cached values
448 mi_warn_fn = mkIfaceWarnCache warns,
449 mi_fix_fn = mkIfaceFixCache fixities,
450 mi_hash_fn = mkIfaceHashCache decls })
452 getWayDescr :: DynFlags -> String
454 | cGhcUnregisterised == "YES" = 'u':tag
456 where tag = buildTag dflags
457 -- if this is an unregisterised build, make sure our interfaces
458 -- can't be used by a registerised build.
460 -------------------------------------------------------------------------
461 -- Types from: HscTypes
462 -------------------------------------------------------------------------
464 instance Binary Dependencies where
465 put_ bh deps = do put_ bh (dep_mods deps)
466 put_ bh (dep_pkgs deps)
467 put_ bh (dep_orphs deps)
468 put_ bh (dep_finsts deps)
470 get bh = do ms <- get bh
474 return (Deps { dep_mods = ms, dep_pkgs = ps, dep_orphs = os,
477 instance (Binary name) => Binary (GenAvailInfo name) where
478 put_ bh (Avail aa) = do
481 put_ bh (AvailTC ab ac) = do
492 return (AvailTC ab ac)
494 instance Binary Usage where
495 put_ bh usg@UsagePackageModule{} = do
497 put_ bh (usg_mod usg)
498 put_ bh (usg_mod_hash usg)
499 put_ bh usg@UsageHomeModule{} = do
501 put_ bh (usg_mod_name usg)
502 put_ bh (usg_mod_hash usg)
503 put_ bh (usg_exports usg)
504 put_ bh (usg_entities usg)
512 return UsagePackageModule { usg_mod = nm, usg_mod_hash = mod }
518 return UsageHomeModule { usg_mod_name = nm, usg_mod_hash = mod,
519 usg_exports = exps, usg_entities = ents }
521 instance Binary Warnings where
522 put_ bh NoWarnings = putByte bh 0
523 put_ bh (WarnAll t) = do
526 put_ bh (WarnSome ts) = do
533 0 -> return NoWarnings
539 instance Binary WarningTxt where
540 put_ bh (WarningTxt w) = do
543 put_ bh (DeprecatedTxt d) = do
551 return (WarningTxt w)
553 return (DeprecatedTxt d)
555 -------------------------------------------------------------------------
556 -- Types from: BasicTypes
557 -------------------------------------------------------------------------
559 instance Binary Activation where
560 put_ bh NeverActive = do
562 put_ bh AlwaysActive = do
564 put_ bh (ActiveBefore aa) = do
567 put_ bh (ActiveAfter ab) = do
573 0 -> do return NeverActive
574 1 -> do return AlwaysActive
576 return (ActiveBefore aa)
578 return (ActiveAfter ab)
580 instance Binary RuleMatchInfo where
581 put_ bh FunLike = putByte bh 0
582 put_ bh ConLike = putByte bh 1
585 if h == 1 then return ConLike
588 instance Binary InlinePragma where
589 put_ bh (InlinePragma activation match_info) = do
596 return (InlinePragma act info)
598 instance Binary StrictnessMark where
599 put_ bh MarkedStrict = putByte bh 0
600 put_ bh MarkedUnboxed = putByte bh 1
601 put_ bh NotMarkedStrict = putByte bh 2
605 0 -> do return MarkedStrict
606 1 -> do return MarkedUnboxed
607 _ -> do return NotMarkedStrict
609 instance Binary Boxity where
610 put_ bh Boxed = putByte bh 0
611 put_ bh Unboxed = putByte bh 1
616 _ -> do return Unboxed
618 instance Binary TupCon where
619 put_ bh (TupCon ab ac) = do
625 return (TupCon ab ac)
627 instance Binary RecFlag where
628 put_ bh Recursive = do
630 put_ bh NonRecursive = do
635 0 -> do return Recursive
636 _ -> do return NonRecursive
638 instance Binary DefMeth where
639 put_ bh NoDefMeth = putByte bh 0
640 put_ bh DefMeth = putByte bh 1
641 put_ bh GenDefMeth = putByte bh 2
645 0 -> return NoDefMeth
647 _ -> return GenDefMeth
649 instance Binary FixityDirection where
659 0 -> do return InfixL
660 1 -> do return InfixR
661 _ -> do return InfixN
663 instance Binary Fixity where
664 put_ bh (Fixity aa ab) = do
670 return (Fixity aa ab)
672 instance (Binary name) => Binary (IPName name) where
673 put_ bh (IPName aa) = put_ bh aa
674 get bh = do aa <- get bh
677 -------------------------------------------------------------------------
678 -- Types from: Demand
679 -------------------------------------------------------------------------
681 instance Binary DmdType where
682 -- Ignore DmdEnv when spitting out the DmdType
683 put bh (DmdType _ ds dr) = do p <- put bh ds; put_ bh dr; return (castBin p)
684 get bh = do ds <- get bh; dr <- get bh; return (DmdType emptyVarEnv ds dr)
686 instance Binary Demand where
691 put_ bh (Call aa) = do
694 put_ bh (Eval ab) = do
697 put_ bh (Defer ac) = do
700 put_ bh (Box ad) = do
720 instance Binary Demands where
721 put_ bh (Poly aa) = do
724 put_ bh (Prod ab) = do
735 instance Binary DmdResult where
745 0 -> do return TopRes
746 1 -> do return RetCPR -- Really use RetCPR even if -fcpr-off
747 -- The wrapper was generated for CPR in
748 -- the imported module!
749 _ -> do return BotRes
751 instance Binary StrictSig where
752 put_ bh (StrictSig aa) = do
756 return (StrictSig aa)
759 -------------------------------------------------------------------------
760 -- Types from: CostCentre
761 -------------------------------------------------------------------------
763 instance Binary IsCafCC where
766 put_ bh NotCafCC = do
772 _ -> do return NotCafCC
774 instance Binary IsDupdCC where
775 put_ bh OriginalCC = do
782 0 -> do return OriginalCC
783 _ -> do return DupdCC
785 instance Binary CostCentre where
786 put_ bh NoCostCentre = do
788 put_ bh (NormalCC aa ab ac ad) = do
794 put_ bh (AllCafsCC ae) = do
800 0 -> do return NoCostCentre
805 return (NormalCC aa ab ac ad)
807 return (AllCafsCC ae)
809 -------------------------------------------------------------------------
810 -- IfaceTypes and friends
811 -------------------------------------------------------------------------
813 instance Binary IfaceBndr where
814 put_ bh (IfaceIdBndr aa) = do
817 put_ bh (IfaceTvBndr ab) = do
824 return (IfaceIdBndr aa)
826 return (IfaceTvBndr ab)
828 instance Binary IfaceLetBndr where
829 put_ bh (IfLetBndr a b c) = do
833 get bh = do a <- get bh
836 return (IfLetBndr a b c)
838 instance Binary IfaceType where
839 put_ bh (IfaceForAllTy aa ab) = do
843 put_ bh (IfaceTyVar ad) = do
846 put_ bh (IfaceAppTy ae af) = do
850 put_ bh (IfaceFunTy ag ah) = do
854 put_ bh (IfacePredTy aq) = do
858 -- Simple compression for common cases of TyConApp
859 put_ bh (IfaceTyConApp IfaceIntTc []) = putByte bh 6
860 put_ bh (IfaceTyConApp IfaceCharTc []) = putByte bh 7
861 put_ bh (IfaceTyConApp IfaceBoolTc []) = putByte bh 8
862 put_ bh (IfaceTyConApp IfaceListTc [ty]) = do { putByte bh 9; put_ bh ty }
863 -- Unit tuple and pairs
864 put_ bh (IfaceTyConApp (IfaceTupTc Boxed 0) []) = putByte bh 10
865 put_ bh (IfaceTyConApp (IfaceTupTc Boxed 2) [t1,t2]) = do { putByte bh 11; put_ bh t1; put_ bh t2 }
867 put_ bh (IfaceTyConApp IfaceLiftedTypeKindTc []) = putByte bh 12
868 put_ bh (IfaceTyConApp IfaceOpenTypeKindTc []) = putByte bh 13
869 put_ bh (IfaceTyConApp IfaceUnliftedTypeKindTc []) = putByte bh 14
870 put_ bh (IfaceTyConApp IfaceUbxTupleKindTc []) = putByte bh 15
871 put_ bh (IfaceTyConApp IfaceArgTypeKindTc []) = putByte bh 16
875 put_ bh (IfaceTyConApp (IfaceTc tc) tys) = do { putByte bh 18; put_ bh tc; put_ bh tys }
876 put_ bh (IfaceTyConApp tc tys) = do { putByte bh 19; put_ bh tc; put_ bh tys }
883 return (IfaceForAllTy aa ab)
885 return (IfaceTyVar ad)
888 return (IfaceAppTy ae af)
891 return (IfaceFunTy ag ah)
893 return (IfacePredTy ap)
895 -- Now the special cases for TyConApp
896 6 -> return (IfaceTyConApp IfaceIntTc [])
897 7 -> return (IfaceTyConApp IfaceCharTc [])
898 8 -> return (IfaceTyConApp IfaceBoolTc [])
899 9 -> do { ty <- get bh; return (IfaceTyConApp IfaceListTc [ty]) }
900 10 -> return (IfaceTyConApp (IfaceTupTc Boxed 0) [])
901 11 -> do { t1 <- get bh; t2 <- get bh; return (IfaceTyConApp (IfaceTupTc Boxed 2) [t1,t2]) }
902 12 -> return (IfaceTyConApp IfaceLiftedTypeKindTc [])
903 13 -> return (IfaceTyConApp IfaceOpenTypeKindTc [])
904 14 -> return (IfaceTyConApp IfaceUnliftedTypeKindTc [])
905 15 -> return (IfaceTyConApp IfaceUbxTupleKindTc [])
906 16 -> return (IfaceTyConApp IfaceArgTypeKindTc [])
908 18 -> do { tc <- get bh; tys <- get bh; return (IfaceTyConApp (IfaceTc tc) tys) }
909 _ -> do { tc <- get bh; tys <- get bh; return (IfaceTyConApp tc tys) }
911 instance Binary IfaceTyCon where
912 -- Int,Char,Bool can't show up here because they can't not be saturated
914 put_ bh IfaceIntTc = putByte bh 1
915 put_ bh IfaceBoolTc = putByte bh 2
916 put_ bh IfaceCharTc = putByte bh 3
917 put_ bh IfaceListTc = putByte bh 4
918 put_ bh IfacePArrTc = putByte bh 5
919 put_ bh IfaceLiftedTypeKindTc = putByte bh 6
920 put_ bh IfaceOpenTypeKindTc = putByte bh 7
921 put_ bh IfaceUnliftedTypeKindTc = putByte bh 8
922 put_ bh IfaceUbxTupleKindTc = putByte bh 9
923 put_ bh IfaceArgTypeKindTc = putByte bh 10
924 put_ bh (IfaceTupTc bx ar) = do { putByte bh 11; put_ bh bx; put_ bh ar }
925 put_ bh (IfaceTc ext) = do { putByte bh 12; put_ bh ext }
930 1 -> return IfaceIntTc
931 2 -> return IfaceBoolTc
932 3 -> return IfaceCharTc
933 4 -> return IfaceListTc
934 5 -> return IfacePArrTc
935 6 -> return IfaceLiftedTypeKindTc
936 7 -> return IfaceOpenTypeKindTc
937 8 -> return IfaceUnliftedTypeKindTc
938 9 -> return IfaceUbxTupleKindTc
939 10 -> return IfaceArgTypeKindTc
940 11 -> do { bx <- get bh; ar <- get bh; return (IfaceTupTc bx ar) }
941 _ -> do { ext <- get bh; return (IfaceTc ext) }
943 instance Binary IfacePredType where
944 put_ bh (IfaceClassP aa ab) = do
948 put_ bh (IfaceIParam ac ad) = do
952 put_ bh (IfaceEqPred ac ad) = do
961 return (IfaceClassP aa ab)
964 return (IfaceIParam ac ad)
967 return (IfaceEqPred ac ad)
968 _ -> panic ("get IfacePredType " ++ show h)
970 -------------------------------------------------------------------------
971 -- IfaceExpr and friends
972 -------------------------------------------------------------------------
974 instance Binary IfaceExpr where
975 put_ bh (IfaceLcl aa) = do
978 put_ bh (IfaceType ab) = do
981 put_ bh (IfaceTuple ac ad) = do
985 put_ bh (IfaceLam ae af) = do
989 put_ bh (IfaceApp ag ah) = do
994 put_ bh (IfaceCase ai aj al ak) = do
1001 put_ bh (IfaceLet al am) = do
1005 put_ bh (IfaceNote an ao) = do
1009 put_ bh (IfaceLit ap) = do
1012 put_ bh (IfaceFCall as at) = do
1016 put_ bh (IfaceExt aa) = do
1019 put_ bh (IfaceCast ie ico) = do
1023 put_ bh (IfaceTick m ix) = do
1030 0 -> do aa <- get bh
1031 return (IfaceLcl aa)
1032 1 -> do ab <- get bh
1033 return (IfaceType ab)
1034 2 -> do ac <- get bh
1036 return (IfaceTuple ac ad)
1037 3 -> do ae <- get bh
1039 return (IfaceLam ae af)
1040 4 -> do ag <- get bh
1042 return (IfaceApp ag ah)
1043 5 -> do ai <- get bh
1049 return (IfaceCase ai aj al ak)
1050 6 -> do al <- get bh
1052 return (IfaceLet al am)
1053 7 -> do an <- get bh
1055 return (IfaceNote an ao)
1056 8 -> do ap <- get bh
1057 return (IfaceLit ap)
1058 9 -> do as <- get bh
1060 return (IfaceFCall as at)
1061 10 -> do aa <- get bh
1062 return (IfaceExt aa)
1063 11 -> do ie <- get bh
1065 return (IfaceCast ie ico)
1066 12 -> do m <- get bh
1068 return (IfaceTick m ix)
1069 _ -> panic ("get IfaceExpr " ++ show h)
1071 instance Binary IfaceConAlt where
1072 put_ bh IfaceDefault = do
1074 put_ bh (IfaceDataAlt aa) = do
1077 put_ bh (IfaceTupleAlt ab) = do
1080 put_ bh (IfaceLitAlt ac) = do
1086 0 -> do return IfaceDefault
1087 1 -> do aa <- get bh
1088 return (IfaceDataAlt aa)
1089 2 -> do ab <- get bh
1090 return (IfaceTupleAlt ab)
1091 _ -> do ac <- get bh
1092 return (IfaceLitAlt ac)
1094 instance Binary IfaceBinding where
1095 put_ bh (IfaceNonRec aa ab) = do
1099 put_ bh (IfaceRec ac) = do
1105 0 -> do aa <- get bh
1107 return (IfaceNonRec aa ab)
1108 _ -> do ac <- get bh
1109 return (IfaceRec ac)
1111 instance Binary IfaceIdDetails where
1112 put_ bh IfVanillaId = putByte bh 0
1113 put_ bh (IfRecSelId a b) = do { putByte bh 1; put_ bh a; put_ bh b }
1114 put_ bh IfDFunId = putByte bh 2
1118 0 -> return IfVanillaId
1121 return (IfRecSelId a b)
1122 _ -> return IfDFunId
1124 instance Binary IfaceIdInfo where
1125 put_ bh NoInfo = putByte bh 0
1126 put_ bh (HasInfo i) = do
1128 lazyPut bh i -- NB lazyPut
1134 _ -> do info <- lazyGet bh -- NB lazyGet
1135 return (HasInfo info)
1137 instance Binary IfaceInfoItem where
1138 put_ bh (HsArity aa) = do
1141 put_ bh (HsStrictness ab) = do
1144 put_ bh (HsUnfold ad) = do
1147 put_ bh (HsInline ad) = do
1150 put_ bh HsNoCafRefs = do
1152 put_ bh (HsWorker ae af) = do
1159 0 -> do aa <- get bh
1161 1 -> do ab <- get bh
1162 return (HsStrictness ab)
1163 2 -> do ad <- get bh
1164 return (HsUnfold ad)
1165 3 -> do ad <- get bh
1166 return (HsInline ad)
1167 4 -> do return HsNoCafRefs
1168 _ -> do ae <- get bh
1170 return (HsWorker ae af)
1172 instance Binary IfaceNote where
1173 put_ bh (IfaceSCC aa) = do
1176 put_ bh IfaceInlineMe = do
1178 put_ bh (IfaceCoreNote s) = do
1184 0 -> do aa <- get bh
1185 return (IfaceSCC aa)
1186 3 -> do return IfaceInlineMe
1187 4 -> do ac <- get bh
1188 return (IfaceCoreNote ac)
1189 _ -> panic ("get IfaceNote " ++ show h)
1191 -------------------------------------------------------------------------
1192 -- IfaceDecl and friends
1193 -------------------------------------------------------------------------
1195 -- A bit of magic going on here: there's no need to store the OccName
1196 -- for a decl on the disk, since we can infer the namespace from the
1197 -- context; however it is useful to have the OccName in the IfaceDecl
1198 -- to avoid re-building it in various places. So we build the OccName
1199 -- when de-serialising.
1201 instance Binary IfaceDecl where
1202 put_ bh (IfaceId name ty details idinfo) = do
1204 put_ bh (occNameFS name)
1208 put_ _ (IfaceForeign _ _) =
1209 error "Binary.put_(IfaceDecl): IfaceForeign"
1210 put_ bh (IfaceData a1 a2 a3 a4 a5 a6 a7 a8) = do
1212 put_ bh (occNameFS a1)
1220 put_ bh (IfaceSyn a1 a2 a3 a4 a5) = do
1222 put_ bh (occNameFS a1)
1227 put_ bh (IfaceClass a1 a2 a3 a4 a5 a6 a7) = do
1230 put_ bh (occNameFS a2)
1239 0 -> do name <- get bh
1243 occ <- return $! mkOccNameFS varName name
1244 return (IfaceId occ ty details idinfo)
1245 1 -> error "Binary.get(TyClDecl): ForeignType"
1255 occ <- return $! mkOccNameFS tcName a1
1256 return (IfaceData occ a2 a3 a4 a5 a6 a7 a8)
1263 occ <- return $! mkOccNameFS tcName a1
1264 return (IfaceSyn occ a2 a3 a4 a5)
1273 occ <- return $! mkOccNameFS clsName a2
1274 return (IfaceClass a1 occ a3 a4 a5 a6 a7)
1276 instance Binary IfaceInst where
1277 put_ bh (IfaceInst cls tys dfun flag orph) = do
1283 get bh = do cls <- get bh
1288 return (IfaceInst cls tys dfun flag orph)
1290 instance Binary IfaceFamInst where
1291 put_ bh (IfaceFamInst fam tys tycon) = do
1295 get bh = do fam <- get bh
1298 return (IfaceFamInst fam tys tycon)
1300 instance Binary OverlapFlag where
1301 put_ bh NoOverlap = putByte bh 0
1302 put_ bh OverlapOk = putByte bh 1
1303 put_ bh Incoherent = putByte bh 2
1304 get bh = do h <- getByte bh
1306 0 -> return NoOverlap
1307 1 -> return OverlapOk
1308 2 -> return Incoherent
1309 _ -> panic ("get OverlapFlag " ++ show h)
1311 instance Binary IfaceConDecls where
1312 put_ bh IfAbstractTyCon = putByte bh 0
1313 put_ bh IfOpenDataTyCon = putByte bh 1
1314 put_ bh (IfDataTyCon cs) = do { putByte bh 2
1316 put_ bh (IfNewTyCon c) = do { putByte bh 3
1321 0 -> return IfAbstractTyCon
1322 1 -> return IfOpenDataTyCon
1323 2 -> do cs <- get bh
1324 return (IfDataTyCon cs)
1325 _ -> do aa <- get bh
1326 return (IfNewTyCon aa)
1328 instance Binary IfaceConDecl where
1329 put_ bh (IfCon a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) = do
1340 get bh = do a1 <- get bh
1350 return (IfCon a1 a2 a3 a4 a5 a6 a7 a8 a9 a10)
1352 instance Binary IfaceClassOp where
1353 put_ bh (IfaceClassOp n def ty) = do
1354 put_ bh (occNameFS n)
1361 occ <- return $! mkOccNameFS varName n
1362 return (IfaceClassOp occ def ty)
1364 instance Binary IfaceRule where
1365 put_ bh (IfaceRule a1 a2 a3 a4 a5 a6 a7) = do
1381 return (IfaceRule a1 a2 a3 a4 a5 a6 a7)
1383 instance Binary IfaceAnnotation where
1384 put_ bh (IfaceAnnotation a1 a2) = do
1390 return (IfaceAnnotation a1 a2)
1392 instance Binary name => Binary (AnnTarget name) where
1393 put_ bh (NamedTarget a) = do
1396 put_ bh (ModuleTarget a) = do
1403 return (NamedTarget a)
1405 return (ModuleTarget a)
1407 instance Binary IfaceVectInfo where
1408 put_ bh (IfaceVectInfo a1 a2 a3) = do
1416 return (IfaceVectInfo a1 a2 a3)