Add (a) CoreM monad, (b) new Annotations feature
[ghc-hetmet.git] / compiler / iface / BinIface.hs
1
2 {-# OPTIONS_GHC -O #-}
3 -- We always optimise this, otherwise performance of a non-optimised
4 -- compiler is severely affected
5
6 --
7 --  (c) The University of Glasgow 2002-2006
8 --
9 -- Binary interface file support.
10
11 module BinIface ( writeBinIface, readBinIface,
12                   CheckHiWay(..), TraceBinIFaceReading(..) ) where
13
14 #include "HsVersions.h"
15
16 import TcRnMonad
17 import IfaceEnv
18 import HscTypes
19 import BasicTypes
20 import NewDemand
21 import Annotations
22 import IfaceSyn
23 import Module
24 import Name
25 import OccName
26 import VarEnv
27 import InstEnv
28 import Class
29 import DynFlags
30 import UniqFM
31 import UniqSupply
32 import CostCentre
33 import StaticFlags
34 import Panic
35 import Binary
36 import SrcLoc
37 import ErrUtils
38 import Config
39 import FastMutInt
40 import Unique
41 import Outputable
42 import FastString
43
44 import Data.List
45 import Data.Word
46 import Data.Array
47 import Data.IORef
48 import Control.Monad
49
50 data CheckHiWay = CheckHiWay | IgnoreHiWay
51     deriving Eq
52
53 data TraceBinIFaceReading = TraceBinIFaceReading | QuietBinIFaceReading
54     deriving Eq
55
56 -- ---------------------------------------------------------------------------
57 -- Reading and writing binary interface files
58
59 readBinIface :: CheckHiWay -> TraceBinIFaceReading -> FilePath
60              -> TcRnIf a b ModIface
61 readBinIface checkHiWay traceBinIFaceReading hi_path = do
62   nc <- getNameCache
63   (new_nc, iface) <- liftIO $
64     readBinIface_ checkHiWay traceBinIFaceReading hi_path nc
65   setNameCache new_nc
66   return iface
67
68 readBinIface_ :: CheckHiWay -> TraceBinIFaceReading -> FilePath -> NameCache
69               -> IO (NameCache, ModIface)
70 readBinIface_ checkHiWay traceBinIFaceReading hi_path nc = do
71   let printer :: SDoc -> IO ()
72       printer = case traceBinIFaceReading of
73                 TraceBinIFaceReading -> \sd -> printSDoc sd defaultDumpStyle
74                 QuietBinIFaceReading -> \_ -> return ()
75       wantedGot :: Outputable a => String -> a -> a -> IO ()
76       wantedGot what wanted got
77           = printer (text what <> text ": " <>
78                      vcat [text "Wanted " <> ppr wanted <> text ",",
79                            text "got    " <> ppr got])
80
81       errorOnMismatch :: (Eq a, Show a) => String -> a -> a -> IO ()
82       errorOnMismatch what wanted got
83             -- This will be caught by readIface which will emit an error
84             -- msg containing the iface module name.
85           = when (wanted /= got) $ ghcError $ ProgramError
86                         (what ++ " (wanted " ++ show wanted
87                               ++ ", got "    ++ show got ++ ")")
88   bh <- Binary.readBinMem hi_path
89
90         -- Read the magic number to check that this really is a GHC .hi file
91         -- (This magic number does not change when we change
92         --  GHC interface file format)
93   magic <- get bh
94   wantedGot "Magic" binaryInterfaceMagic magic
95   errorOnMismatch "magic number mismatch: old/corrupt interface file?"
96       binaryInterfaceMagic magic
97
98         -- Get the dictionary pointer.  We won't attempt to actually
99         -- read the dictionary until we've done the version checks below,
100         -- just in case this isn't a valid interface.  In retrospect the
101         -- version should have come before the dictionary pointer, but this
102         -- is the way it was done originally, and we can't change it now.
103   dict_p <- Binary.get bh       -- Get the dictionary ptr
104
105         -- Check the interface file version and ways.
106   check_ver  <- get bh
107   let our_ver = show opt_HiVersion
108   wantedGot "Version" our_ver check_ver
109   errorOnMismatch "mismatched interface file versions" our_ver check_ver
110
111   check_way <- get bh
112   way_descr <- getWayDescr
113   wantedGot "Way" way_descr check_way
114   when (checkHiWay == CheckHiWay) $
115        errorOnMismatch "mismatched interface file ways" way_descr check_way
116
117         -- Read the dictionary
118         -- The next word in the file is a pointer to where the dictionary is
119         -- (probably at the end of the file)
120   data_p <- tellBin bh          -- Remember where we are now
121   seekBin bh dict_p
122   dict <- getDictionary bh
123   seekBin bh data_p             -- Back to where we were before
124
125         -- Initialise the user-data field of bh
126   ud <- newReadState dict
127   bh <- return (setUserData bh ud)
128         
129   symtab_p <- Binary.get bh     -- Get the symtab ptr
130   data_p <- tellBin bh          -- Remember where we are now
131   seekBin bh symtab_p
132   (nc', symtab) <- getSymbolTable bh nc
133   seekBin bh data_p             -- Back to where we were before
134   let ud = getUserData bh
135   bh <- return $! setUserData bh ud{ud_symtab = symtab}
136   iface <- get bh
137   return (nc', iface)
138
139
140 writeBinIface :: DynFlags -> FilePath -> ModIface -> IO ()
141 writeBinIface dflags hi_path mod_iface = do
142   bh <- openBinMem initBinMemSize
143   put_ bh binaryInterfaceMagic
144
145         -- Remember where the dictionary pointer will go
146   dict_p_p <- tellBin bh
147   put_ bh dict_p_p      -- Placeholder for ptr to dictionary
148
149         -- The version and way descriptor go next
150   put_ bh (show opt_HiVersion)
151   way_descr <- getWayDescr
152   put  bh way_descr
153
154         -- Remember where the symbol table pointer will go
155   symtab_p_p <- tellBin bh
156   put_ bh symtab_p_p
157
158         -- Make some intial state
159   symtab_next <- newFastMutInt
160   writeFastMutInt symtab_next 0
161   symtab_map <- newIORef emptyUFM
162   let bin_symtab = BinSymbolTable {
163                       bin_symtab_next = symtab_next,
164                       bin_symtab_map  = symtab_map }
165   dict_next_ref <- newFastMutInt
166   writeFastMutInt dict_next_ref 0
167   dict_map_ref <- newIORef emptyUFM
168   let bin_dict = BinDictionary {
169                       bin_dict_next = dict_next_ref,
170                       bin_dict_map  = dict_map_ref }
171   ud <- newWriteState (putName bin_symtab) (putFastString bin_dict)
172
173         -- Put the main thing, 
174   bh <- return $ setUserData bh ud
175   put_ bh mod_iface
176
177         -- Write the symtab pointer at the fornt of the file
178   symtab_p <- tellBin bh                -- This is where the symtab will start
179   putAt bh symtab_p_p symtab_p  -- Fill in the placeholder
180   seekBin bh symtab_p           -- Seek back to the end of the file
181
182         -- Write the symbol table itself
183   symtab_next <- readFastMutInt symtab_next
184   symtab_map  <- readIORef symtab_map
185   putSymbolTable bh symtab_next symtab_map
186   debugTraceMsg dflags 3 (text "writeBinIface:" <+> int symtab_next 
187                                 <+> text "Names")
188
189         -- NB. write the dictionary after the symbol table, because
190         -- writing the symbol table may create more dictionary entries.
191
192         -- Write the dictionary pointer at the fornt of the file
193   dict_p <- tellBin bh          -- This is where the dictionary will start
194   putAt bh dict_p_p dict_p      -- Fill in the placeholder
195   seekBin bh dict_p             -- Seek back to the end of the file
196
197         -- Write the dictionary itself
198   dict_next <- readFastMutInt dict_next_ref
199   dict_map  <- readIORef dict_map_ref
200   putDictionary bh dict_next dict_map
201   debugTraceMsg dflags 3 (text "writeBinIface:" <+> int dict_next
202                                  <+> text "dict entries")
203
204         -- And send the result to the file
205   writeBinMem bh hi_path
206
207 initBinMemSize :: Int
208 initBinMemSize = 1024 * 1024
209
210 -- The *host* architecture version:
211 #include "MachDeps.h"
212
213 binaryInterfaceMagic :: Word32
214 #if   WORD_SIZE_IN_BITS == 32
215 binaryInterfaceMagic = 0x1face
216 #elif WORD_SIZE_IN_BITS == 64
217 binaryInterfaceMagic = 0x1face64
218 #endif
219   
220 -- -----------------------------------------------------------------------------
221 -- The symbol table
222
223 putSymbolTable :: BinHandle -> Int -> UniqFM (Int,Name) -> IO ()
224 putSymbolTable bh next_off symtab = do
225   put_ bh next_off
226   let names = elems (array (0,next_off-1) (eltsUFM symtab))
227   mapM_ (\n -> serialiseName bh n symtab) names
228
229 getSymbolTable :: BinHandle -> NameCache -> IO (NameCache, Array Int Name)
230 getSymbolTable bh namecache = do
231   sz <- get bh
232   od_names <- sequence (replicate sz (get bh))
233   let 
234         arr = listArray (0,sz-1) names
235         (namecache', names) =    
236                 mapAccumR (fromOnDiskName arr) namecache od_names
237   --
238   return (namecache', arr)
239
240 type OnDiskName = (PackageId, ModuleName, OccName)
241
242 fromOnDiskName
243    :: Array Int Name
244    -> NameCache
245    -> OnDiskName
246    -> (NameCache, Name)
247 fromOnDiskName _ nc (pid, mod_name, occ) =
248   let 
249         mod   = mkModule pid mod_name
250         cache = nsNames nc
251   in
252   case lookupOrigNameCache cache  mod occ of
253      Just name -> (nc, name)
254      Nothing   -> 
255         let 
256                 us        = nsUniqs nc
257                 uniq      = uniqFromSupply us
258                 name      = mkExternalName uniq mod occ noSrcSpan
259                 new_cache = extendNameCache cache mod occ name
260         in        
261         case splitUniqSupply us of { (us',_) -> 
262         ( nc{ nsUniqs = us', nsNames = new_cache }, name )
263         }
264
265 serialiseName :: BinHandle -> Name -> UniqFM (Int,Name) -> IO ()
266 serialiseName bh name _ = do
267   let mod = ASSERT2( isExternalName name, ppr name ) nameModule name
268   put_ bh (modulePackageId mod, moduleName mod, nameOccName name)
269
270
271 putName :: BinSymbolTable -> BinHandle -> Name -> IO ()
272 putName BinSymbolTable{ 
273             bin_symtab_map = symtab_map_ref,
274             bin_symtab_next = symtab_next }    bh name
275   = do
276     symtab_map <- readIORef symtab_map_ref
277     case lookupUFM symtab_map name of
278       Just (off,_) -> put_ bh off
279       Nothing -> do
280          off <- readFastMutInt symtab_next
281          writeFastMutInt symtab_next (off+1)
282          writeIORef symtab_map_ref
283              $! addToUFM symtab_map name (off,name)
284          put_ bh off          
285
286
287 data BinSymbolTable = BinSymbolTable {
288         bin_symtab_next :: !FastMutInt, -- The next index to use
289         bin_symtab_map  :: !(IORef (UniqFM (Int,Name)))
290                                 -- indexed by Name
291   }
292
293
294 putFastString :: BinDictionary -> BinHandle -> FastString -> IO ()
295 putFastString BinDictionary { bin_dict_next = j_r,
296                               bin_dict_map  = out_r}  bh f
297   = do
298     out <- readIORef out_r
299     let uniq = getUnique f
300     case lookupUFM out uniq of
301         Just (j, _)  -> put_ bh j
302         Nothing -> do
303            j <- readFastMutInt j_r
304            put_ bh j
305            writeFastMutInt j_r (j + 1)
306            writeIORef out_r $! addToUFM out uniq (j, f)
307
308
309 data BinDictionary = BinDictionary {
310         bin_dict_next :: !FastMutInt, -- The next index to use
311         bin_dict_map  :: !(IORef (UniqFM (Int,FastString)))
312                                 -- indexed by FastString
313   }
314
315 -- -----------------------------------------------------------------------------
316 -- All the binary instances
317
318 -- BasicTypes
319 {-! for IPName derive: Binary !-}
320 {-! for Fixity derive: Binary !-}
321 {-! for FixityDirection derive: Binary !-}
322 {-! for Boxity derive: Binary !-}
323 {-! for StrictnessMark derive: Binary !-}
324 {-! for Activation derive: Binary !-}
325
326 -- NewDemand
327 {-! for Demand derive: Binary !-}
328 {-! for Demands derive: Binary !-}
329 {-! for DmdResult derive: Binary !-}
330 {-! for StrictSig derive: Binary !-}
331
332 -- Class
333 {-! for DefMeth derive: Binary !-}
334
335 -- HsTypes
336 {-! for HsPred derive: Binary !-}
337 {-! for HsType derive: Binary !-}
338 {-! for TupCon derive: Binary !-}
339 {-! for HsTyVarBndr derive: Binary !-}
340
341 -- HsCore
342 {-! for UfExpr derive: Binary !-}
343 {-! for UfConAlt derive: Binary !-}
344 {-! for UfBinding derive: Binary !-}
345 {-! for UfBinder derive: Binary !-}
346 {-! for HsIdInfo derive: Binary !-}
347 {-! for UfNote derive: Binary !-}
348
349 -- HsDecls
350 {-! for ConDetails derive: Binary !-}
351 {-! for BangType derive: Binary !-}
352
353 -- CostCentre
354 {-! for IsCafCC derive: Binary !-}
355 {-! for IsDupdCC derive: Binary !-}
356 {-! for CostCentre derive: Binary !-}
357
358
359
360 -- ---------------------------------------------------------------------------
361 -- Reading a binary interface into ParsedIface
362
363 instance Binary ModIface where
364    put_ bh (ModIface {
365                  mi_module    = mod,
366                  mi_boot      = is_boot,
367                  mi_iface_hash= iface_hash,
368                  mi_mod_hash  = mod_hash,
369                  mi_orphan    = orphan,
370                  mi_finsts    = hasFamInsts,
371                  mi_deps      = deps,
372                  mi_usages    = usages,
373                  mi_exports   = exports,
374                  mi_exp_hash  = exp_hash,
375                  mi_fixities  = fixities,
376                  mi_warns     = warns,
377                  mi_anns      = anns,
378                  mi_decls     = decls,
379                  mi_insts     = insts,
380                  mi_fam_insts = fam_insts,
381                  mi_rules     = rules,
382                  mi_orphan_hash = orphan_hash,
383                  mi_vect_info = vect_info,
384                  mi_hpc       = hpc_info }) = do
385         put_ bh mod
386         put_ bh is_boot
387         put_ bh iface_hash
388         put_ bh mod_hash
389         put_ bh orphan
390         put_ bh hasFamInsts
391         lazyPut bh deps
392         lazyPut bh usages
393         put_ bh exports
394         put_ bh exp_hash
395         put_ bh fixities
396         lazyPut bh warns
397         lazyPut bh anns
398         put_ bh decls
399         put_ bh insts
400         put_ bh fam_insts
401         lazyPut bh rules
402         put_ bh orphan_hash
403         put_ bh vect_info
404         put_ bh hpc_info
405
406    get bh = do
407         mod_name  <- get bh
408         is_boot   <- get bh
409         iface_hash <- get bh
410         mod_hash  <- get bh
411         orphan    <- get bh
412         hasFamInsts <- get bh
413         deps      <- lazyGet bh
414         usages    <- {-# SCC "bin_usages" #-} lazyGet bh
415         exports   <- {-# SCC "bin_exports" #-} get bh
416         exp_hash  <- get bh
417         fixities  <- {-# SCC "bin_fixities" #-} get bh
418         warns     <- {-# SCC "bin_warns" #-} lazyGet bh
419         anns      <- {-# SCC "bin_anns" #-} lazyGet bh
420         decls     <- {-# SCC "bin_tycldecls" #-} get bh
421         insts     <- {-# SCC "bin_insts" #-} get bh
422         fam_insts <- {-# SCC "bin_fam_insts" #-} get bh
423         rules     <- {-# SCC "bin_rules" #-} lazyGet bh
424         orphan_hash <- get bh
425         vect_info <- get bh
426         hpc_info  <- get bh
427         return (ModIface {
428                  mi_module    = mod_name,
429                  mi_boot      = is_boot,
430                  mi_iface_hash = iface_hash,
431                  mi_mod_hash  = mod_hash,
432                  mi_orphan    = orphan,
433                  mi_finsts    = hasFamInsts,
434                  mi_deps      = deps,
435                  mi_usages    = usages,
436                  mi_exports   = exports,
437                  mi_exp_hash  = exp_hash,
438                  mi_anns      = anns,
439                  mi_fixities  = fixities,
440                  mi_warns     = warns,
441                  mi_decls     = decls,
442                  mi_globals   = Nothing,
443                  mi_insts     = insts,
444                  mi_fam_insts = fam_insts,
445                  mi_rules     = rules,
446                  mi_orphan_hash = orphan_hash,
447                  mi_vect_info = vect_info,
448                  mi_hpc       = hpc_info,
449                         -- And build the cached values
450                  mi_warn_fn   = mkIfaceWarnCache warns,
451                  mi_fix_fn    = mkIfaceFixCache fixities,
452                  mi_hash_fn   = mkIfaceHashCache decls })
453
454 getWayDescr :: IO String
455 getWayDescr = do
456   tag <- readIORef v_Build_tag
457   if cGhcUnregisterised == "YES" then return ('u':tag) else return tag
458         -- if this is an unregisterised build, make sure our interfaces
459         -- can't be used by a registerised build.
460
461 -------------------------------------------------------------------------
462 --              Types from: HscTypes
463 -------------------------------------------------------------------------
464
465 instance Binary Dependencies where
466     put_ bh deps = do put_ bh (dep_mods deps)
467                       put_ bh (dep_pkgs deps)
468                       put_ bh (dep_orphs deps)
469                       put_ bh (dep_finsts deps)
470
471     get bh = do ms <- get bh 
472                 ps <- get bh
473                 os <- get bh
474                 fis <- get bh
475                 return (Deps { dep_mods = ms, dep_pkgs = ps, dep_orphs = os,
476                                dep_finsts = fis })
477
478 instance (Binary name) => Binary (GenAvailInfo name) where
479     put_ bh (Avail aa) = do
480             putByte bh 0
481             put_ bh aa
482     put_ bh (AvailTC ab ac) = do
483             putByte bh 1
484             put_ bh ab
485             put_ bh ac
486     get bh = do
487             h <- getByte bh
488             case h of
489               0 -> do aa <- get bh
490                       return (Avail aa)
491               _ -> do ab <- get bh
492                       ac <- get bh
493                       return (AvailTC ab ac)
494
495 instance Binary Usage where
496     put_ bh usg@UsagePackageModule{} = do 
497         putByte bh 0
498         put_ bh (usg_mod usg)
499         put_ bh (usg_mod_hash usg)
500     put_ bh usg@UsageHomeModule{} = do 
501         putByte bh 1
502         put_ bh (usg_mod_name usg)
503         put_ bh (usg_mod_hash usg)
504         put_ bh (usg_exports  usg)
505         put_ bh (usg_entities usg)
506
507     get bh = do
508         h <- getByte bh
509         case h of
510           0 -> do
511             nm    <- get bh
512             mod   <- get bh
513             return UsagePackageModule { usg_mod = nm, usg_mod_hash = mod }
514           _ -> do
515             nm    <- get bh
516             mod   <- get bh
517             exps  <- get bh
518             ents  <- get bh
519             return UsageHomeModule { usg_mod_name = nm, usg_mod_hash = mod,
520                             usg_exports = exps, usg_entities = ents }
521
522 instance Binary Warnings where
523     put_ bh NoWarnings     = putByte bh 0
524     put_ bh (WarnAll t) = do
525             putByte bh 1
526             put_ bh t
527     put_ bh (WarnSome ts) = do
528             putByte bh 2
529             put_ bh ts
530
531     get bh = do
532             h <- getByte bh
533             case h of
534               0 -> return NoWarnings
535               1 -> do aa <- get bh
536                       return (WarnAll aa)
537               _ -> do aa <- get bh
538                       return (WarnSome aa)
539
540 instance Binary WarningTxt where
541     put_ bh (WarningTxt w) = do
542             putByte bh 0
543             put_ bh w
544     put_ bh (DeprecatedTxt d) = do
545             putByte bh 1
546             put_ bh d
547
548     get bh = do
549             h <- getByte bh
550             case h of
551               0 -> do w <- get bh
552                       return (WarningTxt w)
553               _ -> do d <- get bh
554                       return (DeprecatedTxt d)
555
556 -------------------------------------------------------------------------
557 --              Types from: BasicTypes
558 -------------------------------------------------------------------------
559
560 instance Binary Activation where
561     put_ bh NeverActive = do
562             putByte bh 0
563     put_ bh AlwaysActive = do
564             putByte bh 1
565     put_ bh (ActiveBefore aa) = do
566             putByte bh 2
567             put_ bh aa
568     put_ bh (ActiveAfter ab) = do
569             putByte bh 3
570             put_ bh ab
571     get bh = do
572             h <- getByte bh
573             case h of
574               0 -> do return NeverActive
575               1 -> do return AlwaysActive
576               2 -> do aa <- get bh
577                       return (ActiveBefore aa)
578               _ -> do ab <- get bh
579                       return (ActiveAfter ab)
580
581 instance Binary StrictnessMark where
582     put_ bh MarkedStrict = do
583             putByte bh 0
584     put_ bh MarkedUnboxed = do
585             putByte bh 1
586     put_ bh NotMarkedStrict = do
587             putByte bh 2
588     get bh = do
589             h <- getByte bh
590             case h of
591               0 -> do return MarkedStrict
592               1 -> do return MarkedUnboxed
593               _ -> do return NotMarkedStrict
594
595 instance Binary Boxity where
596     put_ bh Boxed = do
597             putByte bh 0
598     put_ bh Unboxed = do
599             putByte bh 1
600     get bh = do
601             h <- getByte bh
602             case h of
603               0 -> do return Boxed
604               _ -> do return Unboxed
605
606 instance Binary TupCon where
607     put_ bh (TupCon ab ac) = do
608             put_ bh ab
609             put_ bh ac
610     get bh = do
611           ab <- get bh
612           ac <- get bh
613           return (TupCon ab ac)
614
615 instance Binary RecFlag where
616     put_ bh Recursive = do
617             putByte bh 0
618     put_ bh NonRecursive = do
619             putByte bh 1
620     get bh = do
621             h <- getByte bh
622             case h of
623               0 -> do return Recursive
624               _ -> do return NonRecursive
625
626 instance Binary DefMeth where
627     put_ bh NoDefMeth  = putByte bh 0
628     put_ bh DefMeth    = putByte bh 1
629     put_ bh GenDefMeth = putByte bh 2
630     get bh = do
631             h <- getByte bh
632             case h of
633               0 -> return NoDefMeth
634               1 -> return DefMeth
635               _ -> return GenDefMeth
636
637 instance Binary FixityDirection where
638     put_ bh InfixL = do
639             putByte bh 0
640     put_ bh InfixR = do
641             putByte bh 1
642     put_ bh InfixN = do
643             putByte bh 2
644     get bh = do
645             h <- getByte bh
646             case h of
647               0 -> do return InfixL
648               1 -> do return InfixR
649               _ -> do return InfixN
650
651 instance Binary Fixity where
652     put_ bh (Fixity aa ab) = do
653             put_ bh aa
654             put_ bh ab
655     get bh = do
656           aa <- get bh
657           ab <- get bh
658           return (Fixity aa ab)
659
660 instance (Binary name) => Binary (IPName name) where
661     put_ bh (IPName aa) = put_ bh aa
662     get bh = do aa <- get bh
663                 return (IPName aa)
664
665 -------------------------------------------------------------------------
666 --              Types from: Demand
667 -------------------------------------------------------------------------
668
669 instance Binary DmdType where
670         -- Ignore DmdEnv when spitting out the DmdType
671   put bh (DmdType _ ds dr) = do p <- put bh ds; put bh dr; return (castBin p)
672   get bh = do ds <- get bh; dr <- get bh; return (DmdType emptyVarEnv ds dr)
673
674 instance Binary Demand where
675     put_ bh Top = do
676             putByte bh 0
677     put_ bh Abs = do
678             putByte bh 1
679     put_ bh (Call aa) = do
680             putByte bh 2
681             put_ bh aa
682     put_ bh (Eval ab) = do
683             putByte bh 3
684             put_ bh ab
685     put_ bh (Defer ac) = do
686             putByte bh 4
687             put_ bh ac
688     put_ bh (Box ad) = do
689             putByte bh 5
690             put_ bh ad
691     put_ bh Bot = do
692             putByte bh 6
693     get bh = do
694             h <- getByte bh
695             case h of
696               0 -> do return Top
697               1 -> do return Abs
698               2 -> do aa <- get bh
699                       return (Call aa)
700               3 -> do ab <- get bh
701                       return (Eval ab)
702               4 -> do ac <- get bh
703                       return (Defer ac)
704               5 -> do ad <- get bh
705                       return (Box ad)
706               _ -> do return Bot
707
708 instance Binary Demands where
709     put_ bh (Poly aa) = do
710             putByte bh 0
711             put_ bh aa
712     put_ bh (Prod ab) = do
713             putByte bh 1
714             put_ bh ab
715     get bh = do
716             h <- getByte bh
717             case h of
718               0 -> do aa <- get bh
719                       return (Poly aa)
720               _ -> do ab <- get bh
721                       return (Prod ab)
722
723 instance Binary DmdResult where
724     put_ bh TopRes = do
725             putByte bh 0
726     put_ bh RetCPR = do
727             putByte bh 1
728     put_ bh BotRes = do
729             putByte bh 2
730     get bh = do
731             h <- getByte bh
732             case h of
733               0 -> do return TopRes
734               1 -> do return RetCPR     -- Really use RetCPR even if -fcpr-off
735                                         -- The wrapper was generated for CPR in 
736                                         -- the imported module!
737               _ -> do return BotRes
738
739 instance Binary StrictSig where
740     put_ bh (StrictSig aa) = do
741             put_ bh aa
742     get bh = do
743           aa <- get bh
744           return (StrictSig aa)
745
746
747 -------------------------------------------------------------------------
748 --              Types from: CostCentre
749 -------------------------------------------------------------------------
750
751 instance Binary IsCafCC where
752     put_ bh CafCC = do
753             putByte bh 0
754     put_ bh NotCafCC = do
755             putByte bh 1
756     get bh = do
757             h <- getByte bh
758             case h of
759               0 -> do return CafCC
760               _ -> do return NotCafCC
761
762 instance Binary IsDupdCC where
763     put_ bh OriginalCC = do
764             putByte bh 0
765     put_ bh DupdCC = do
766             putByte bh 1
767     get bh = do
768             h <- getByte bh
769             case h of
770               0 -> do return OriginalCC
771               _ -> do return DupdCC
772
773 instance Binary CostCentre where
774     put_ bh NoCostCentre = do
775             putByte bh 0
776     put_ bh (NormalCC aa ab ac ad) = do
777             putByte bh 1
778             put_ bh aa
779             put_ bh ab
780             put_ bh ac
781             put_ bh ad
782     put_ bh (AllCafsCC ae) = do
783             putByte bh 2
784             put_ bh ae
785     get bh = do
786             h <- getByte bh
787             case h of
788               0 -> do return NoCostCentre
789               1 -> do aa <- get bh
790                       ab <- get bh
791                       ac <- get bh
792                       ad <- get bh
793                       return (NormalCC aa ab ac ad)
794               _ -> do ae <- get bh
795                       return (AllCafsCC ae)
796
797 -------------------------------------------------------------------------
798 --              IfaceTypes and friends
799 -------------------------------------------------------------------------
800
801 instance Binary IfaceBndr where
802     put_ bh (IfaceIdBndr aa) = do
803             putByte bh 0
804             put_ bh aa
805     put_ bh (IfaceTvBndr ab) = do
806             putByte bh 1
807             put_ bh ab
808     get bh = do
809             h <- getByte bh
810             case h of
811               0 -> do aa <- get bh
812                       return (IfaceIdBndr aa)
813               _ -> do ab <- get bh
814                       return (IfaceTvBndr ab)
815
816 instance Binary IfaceLetBndr where
817     put_ bh (IfLetBndr a b c) = do
818             put_ bh a
819             put_ bh b
820             put_ bh c
821     get bh = do a <- get bh
822                 b <- get bh
823                 c <- get bh
824                 return (IfLetBndr a b c)           
825
826 instance Binary IfaceType where
827     put_ bh (IfaceForAllTy aa ab) = do
828             putByte bh 0
829             put_ bh aa
830             put_ bh ab
831     put_ bh (IfaceTyVar ad) = do
832             putByte bh 1
833             put_ bh ad
834     put_ bh (IfaceAppTy ae af) = do
835             putByte bh 2
836             put_ bh ae
837             put_ bh af
838     put_ bh (IfaceFunTy ag ah) = do
839             putByte bh 3
840             put_ bh ag
841             put_ bh ah
842     put_ bh (IfacePredTy aq) = do
843             putByte bh 5
844             put_ bh aq
845
846         -- Simple compression for common cases of TyConApp
847     put_ bh (IfaceTyConApp IfaceIntTc  [])   = putByte bh 6
848     put_ bh (IfaceTyConApp IfaceCharTc [])   = putByte bh 7
849     put_ bh (IfaceTyConApp IfaceBoolTc [])   = putByte bh 8
850     put_ bh (IfaceTyConApp IfaceListTc [ty]) = do { putByte bh 9; put_ bh ty }
851         -- Unit tuple and pairs
852     put_ bh (IfaceTyConApp (IfaceTupTc Boxed 0) [])      = putByte bh 10
853     put_ bh (IfaceTyConApp (IfaceTupTc Boxed 2) [t1,t2]) = do { putByte bh 11; put_ bh t1; put_ bh t2 }
854         -- Kind cases
855     put_ bh (IfaceTyConApp IfaceLiftedTypeKindTc [])   = putByte bh 12
856     put_ bh (IfaceTyConApp IfaceOpenTypeKindTc [])     = putByte bh 13
857     put_ bh (IfaceTyConApp IfaceUnliftedTypeKindTc []) = putByte bh 14
858     put_ bh (IfaceTyConApp IfaceUbxTupleKindTc [])     = putByte bh 15
859     put_ bh (IfaceTyConApp IfaceArgTypeKindTc [])      = putByte bh 16
860
861         -- Generic cases
862
863     put_ bh (IfaceTyConApp (IfaceTc tc) tys) = do { putByte bh 18; put_ bh tc; put_ bh tys }
864     put_ bh (IfaceTyConApp tc tys)           = do { putByte bh 19; put_ bh tc; put_ bh tys }
865
866     get bh = do
867             h <- getByte bh
868             case h of
869               0 -> do aa <- get bh
870                       ab <- get bh
871                       return (IfaceForAllTy aa ab)
872               1 -> do ad <- get bh
873                       return (IfaceTyVar ad)
874               2 -> do ae <- get bh
875                       af <- get bh
876                       return (IfaceAppTy ae af)
877               3 -> do ag <- get bh
878                       ah <- get bh
879                       return (IfaceFunTy ag ah)
880               5 -> do ap <- get bh
881                       return (IfacePredTy ap)
882
883                 -- Now the special cases for TyConApp
884               6 -> return (IfaceTyConApp IfaceIntTc [])
885               7 -> return (IfaceTyConApp IfaceCharTc [])
886               8 -> return (IfaceTyConApp IfaceBoolTc [])
887               9 -> do { ty <- get bh; return (IfaceTyConApp IfaceListTc [ty]) }
888               10 -> return (IfaceTyConApp (IfaceTupTc Boxed 0) [])
889               11 -> do { t1 <- get bh; t2 <- get bh; return (IfaceTyConApp (IfaceTupTc Boxed 2) [t1,t2]) }
890               12 -> return (IfaceTyConApp IfaceLiftedTypeKindTc [])
891               13 -> return (IfaceTyConApp IfaceOpenTypeKindTc [])
892               14 -> return (IfaceTyConApp IfaceUnliftedTypeKindTc [])
893               15 -> return (IfaceTyConApp IfaceUbxTupleKindTc [])
894               16 -> return (IfaceTyConApp IfaceArgTypeKindTc [])
895
896               18 -> do { tc <- get bh; tys <- get bh; return (IfaceTyConApp (IfaceTc tc) tys) }
897               _  -> do { tc <- get bh; tys <- get bh; return (IfaceTyConApp tc tys) }
898
899 instance Binary IfaceTyCon where
900         -- Int,Char,Bool can't show up here because they can't not be saturated
901
902    put_ bh IfaceIntTc         = putByte bh 1
903    put_ bh IfaceBoolTc        = putByte bh 2
904    put_ bh IfaceCharTc        = putByte bh 3
905    put_ bh IfaceListTc        = putByte bh 4
906    put_ bh IfacePArrTc        = putByte bh 5
907    put_ bh IfaceLiftedTypeKindTc   = putByte bh 6
908    put_ bh IfaceOpenTypeKindTc     = putByte bh 7
909    put_ bh IfaceUnliftedTypeKindTc = putByte bh 8
910    put_ bh IfaceUbxTupleKindTc     = putByte bh 9
911    put_ bh IfaceArgTypeKindTc      = putByte bh 10
912    put_ bh (IfaceTupTc bx ar) = do { putByte bh 11; put_ bh bx; put_ bh ar }
913    put_ bh (IfaceTc ext)      = do { putByte bh 12; put_ bh ext }
914
915    get bh = do
916         h <- getByte bh
917         case h of
918           1 -> return IfaceIntTc
919           2 -> return IfaceBoolTc
920           3 -> return IfaceCharTc
921           4 -> return IfaceListTc
922           5 -> return IfacePArrTc
923           6 -> return IfaceLiftedTypeKindTc 
924           7 -> return IfaceOpenTypeKindTc 
925           8 -> return IfaceUnliftedTypeKindTc
926           9 -> return IfaceUbxTupleKindTc
927           10 -> return IfaceArgTypeKindTc
928           11 -> do { bx <- get bh; ar <- get bh; return (IfaceTupTc bx ar) }
929           _ -> do { ext <- get bh; return (IfaceTc ext) }
930
931 instance Binary IfacePredType where
932     put_ bh (IfaceClassP aa ab) = do
933             putByte bh 0
934             put_ bh aa
935             put_ bh ab
936     put_ bh (IfaceIParam ac ad) = do
937             putByte bh 1
938             put_ bh ac
939             put_ bh ad
940     put_ bh (IfaceEqPred ac ad) = do
941             putByte bh 2
942             put_ bh ac
943             put_ bh ad
944     get bh = do
945             h <- getByte bh
946             case h of
947               0 -> do aa <- get bh
948                       ab <- get bh
949                       return (IfaceClassP aa ab)
950               1 -> do ac <- get bh
951                       ad <- get bh
952                       return (IfaceIParam ac ad)
953               2 -> do ac <- get bh
954                       ad <- get bh
955                       return (IfaceEqPred ac ad)
956               _ -> panic ("get IfacePredType " ++ show h)
957
958 -------------------------------------------------------------------------
959 --              IfaceExpr and friends
960 -------------------------------------------------------------------------
961
962 instance Binary IfaceExpr where
963     put_ bh (IfaceLcl aa) = do
964             putByte bh 0
965             put_ bh aa
966     put_ bh (IfaceType ab) = do
967             putByte bh 1
968             put_ bh ab
969     put_ bh (IfaceTuple ac ad) = do
970             putByte bh 2
971             put_ bh ac
972             put_ bh ad
973     put_ bh (IfaceLam ae af) = do
974             putByte bh 3
975             put_ bh ae
976             put_ bh af
977     put_ bh (IfaceApp ag ah) = do
978             putByte bh 4
979             put_ bh ag
980             put_ bh ah
981 -- gaw 2004
982     put_ bh (IfaceCase ai aj al ak) = do
983             putByte bh 5
984             put_ bh ai
985             put_ bh aj
986 -- gaw 2004
987             put_ bh al
988             put_ bh ak
989     put_ bh (IfaceLet al am) = do
990             putByte bh 6
991             put_ bh al
992             put_ bh am
993     put_ bh (IfaceNote an ao) = do
994             putByte bh 7
995             put_ bh an
996             put_ bh ao
997     put_ bh (IfaceLit ap) = do
998             putByte bh 8
999             put_ bh ap
1000     put_ bh (IfaceFCall as at) = do
1001             putByte bh 9
1002             put_ bh as
1003             put_ bh at
1004     put_ bh (IfaceExt aa) = do
1005             putByte bh 10
1006             put_ bh aa
1007     put_ bh (IfaceCast ie ico) = do
1008             putByte bh 11
1009             put_ bh ie
1010             put_ bh ico
1011     put_ bh (IfaceTick m ix) = do
1012             putByte bh 12
1013             put_ bh m
1014             put_ bh ix
1015     get bh = do
1016             h <- getByte bh
1017             case h of
1018               0 -> do aa <- get bh
1019                       return (IfaceLcl aa)
1020               1 -> do ab <- get bh
1021                       return (IfaceType ab)
1022               2 -> do ac <- get bh
1023                       ad <- get bh
1024                       return (IfaceTuple ac ad)
1025               3 -> do ae <- get bh
1026                       af <- get bh
1027                       return (IfaceLam ae af)
1028               4 -> do ag <- get bh
1029                       ah <- get bh
1030                       return (IfaceApp ag ah)
1031               5 -> do ai <- get bh
1032                       aj <- get bh
1033 -- gaw 2004
1034                       al <- get bh                   
1035                       ak <- get bh
1036 -- gaw 2004
1037                       return (IfaceCase ai aj al ak)
1038               6 -> do al <- get bh
1039                       am <- get bh
1040                       return (IfaceLet al am)
1041               7 -> do an <- get bh
1042                       ao <- get bh
1043                       return (IfaceNote an ao)
1044               8 -> do ap <- get bh
1045                       return (IfaceLit ap)
1046               9 -> do as <- get bh
1047                       at <- get bh
1048                       return (IfaceFCall as at)
1049               10 -> do aa <- get bh
1050                        return (IfaceExt aa)
1051               11 -> do ie <- get bh
1052                        ico <- get bh
1053                        return (IfaceCast ie ico)
1054               12 -> do m <- get bh
1055                        ix <- get bh
1056                        return (IfaceTick m ix)
1057               _ -> panic ("get IfaceExpr " ++ show h)
1058
1059 instance Binary IfaceConAlt where
1060     put_ bh IfaceDefault = do
1061             putByte bh 0
1062     put_ bh (IfaceDataAlt aa) = do
1063             putByte bh 1
1064             put_ bh aa
1065     put_ bh (IfaceTupleAlt ab) = do
1066             putByte bh 2
1067             put_ bh ab
1068     put_ bh (IfaceLitAlt ac) = do
1069             putByte bh 3
1070             put_ bh ac
1071     get bh = do
1072             h <- getByte bh
1073             case h of
1074               0 -> do return IfaceDefault
1075               1 -> do aa <- get bh
1076                       return (IfaceDataAlt aa)
1077               2 -> do ab <- get bh
1078                       return (IfaceTupleAlt ab)
1079               _ -> do ac <- get bh
1080                       return (IfaceLitAlt ac)
1081
1082 instance Binary IfaceBinding where
1083     put_ bh (IfaceNonRec aa ab) = do
1084             putByte bh 0
1085             put_ bh aa
1086             put_ bh ab
1087     put_ bh (IfaceRec ac) = do
1088             putByte bh 1
1089             put_ bh ac
1090     get bh = do
1091             h <- getByte bh
1092             case h of
1093               0 -> do aa <- get bh
1094                       ab <- get bh
1095                       return (IfaceNonRec aa ab)
1096               _ -> do ac <- get bh
1097                       return (IfaceRec ac)
1098
1099 instance Binary IfaceIdInfo where
1100     put_ bh NoInfo = putByte bh 0
1101     put_ bh (HasInfo i) = do
1102             putByte bh 1
1103             lazyPut bh i                        -- NB lazyPut
1104
1105     get bh = do
1106             h <- getByte bh
1107             case h of
1108               0 -> return NoInfo
1109               _ -> do info <- lazyGet bh        -- NB lazyGet
1110                       return (HasInfo info)
1111
1112 instance Binary IfaceInfoItem where
1113     put_ bh (HsArity aa) = do
1114             putByte bh 0
1115             put_ bh aa
1116     put_ bh (HsStrictness ab) = do
1117             putByte bh 1
1118             put_ bh ab
1119     put_ bh (HsUnfold ad) = do
1120             putByte bh 2
1121             put_ bh ad
1122     put_ bh (HsInline ad) = do
1123             putByte bh 3
1124             put_ bh ad
1125     put_ bh HsNoCafRefs = do
1126             putByte bh 4
1127     put_ bh (HsWorker ae af) = do
1128             putByte bh 5
1129             put_ bh ae
1130             put_ bh af
1131     get bh = do
1132             h <- getByte bh
1133             case h of
1134               0 -> do aa <- get bh
1135                       return (HsArity aa)
1136               1 -> do ab <- get bh
1137                       return (HsStrictness ab)
1138               2 -> do ad <- get bh
1139                       return (HsUnfold ad)
1140               3 -> do ad <- get bh
1141                       return (HsInline ad)
1142               4 -> do return HsNoCafRefs
1143               _ -> do ae <- get bh
1144                       af <- get bh
1145                       return (HsWorker ae af)
1146
1147 instance Binary IfaceNote where
1148     put_ bh (IfaceSCC aa) = do
1149             putByte bh 0
1150             put_ bh aa
1151     put_ bh IfaceInlineMe = do
1152             putByte bh 3
1153     put_ bh (IfaceCoreNote s) = do
1154             putByte bh 4
1155             put_ bh s
1156     get bh = do
1157             h <- getByte bh
1158             case h of
1159               0 -> do aa <- get bh
1160                       return (IfaceSCC aa)
1161               3 -> do return IfaceInlineMe
1162               4 -> do ac <- get bh
1163                       return (IfaceCoreNote ac)
1164               _ -> panic ("get IfaceNote " ++ show h)
1165
1166 -------------------------------------------------------------------------
1167 --              IfaceDecl and friends
1168 -------------------------------------------------------------------------
1169
1170 -- A bit of magic going on here: there's no need to store the OccName
1171 -- for a decl on the disk, since we can infer the namespace from the
1172 -- context; however it is useful to have the OccName in the IfaceDecl
1173 -- to avoid re-building it in various places.  So we build the OccName
1174 -- when de-serialising.
1175
1176 instance Binary IfaceDecl where
1177     put_ bh (IfaceId name ty idinfo) = do
1178             putByte bh 0
1179             put_ bh (occNameFS name)
1180             put_ bh ty
1181             put_ bh idinfo
1182     put_ _ (IfaceForeign _ _) = 
1183         error "Binary.put_(IfaceDecl): IfaceForeign"
1184     put_ bh (IfaceData a1 a2 a3 a4 a5 a6 a7 a8) = do
1185             putByte bh 2
1186             put_ bh (occNameFS a1)
1187             put_ bh a2
1188             put_ bh a3
1189             put_ bh a4
1190             put_ bh a5
1191             put_ bh a6
1192             put_ bh a7
1193             put_ bh a8
1194     put_ bh (IfaceSyn a1 a2 a3 a4 a5) = do
1195             putByte bh 3
1196             put_ bh (occNameFS a1)
1197             put_ bh a2
1198             put_ bh a3
1199             put_ bh a4
1200             put_ bh a5
1201     put_ bh (IfaceClass a1 a2 a3 a4 a5 a6 a7) = do
1202             putByte bh 4
1203             put_ bh a1
1204             put_ bh (occNameFS a2)
1205             put_ bh a3
1206             put_ bh a4
1207             put_ bh a5
1208             put_ bh a6
1209             put_ bh a7
1210     get bh = do
1211             h <- getByte bh
1212             case h of
1213               0 -> do name   <- get bh
1214                       ty     <- get bh
1215                       idinfo <- get bh
1216                       occ <- return $! mkOccNameFS varName name
1217                       return (IfaceId occ ty idinfo)
1218               1 -> error "Binary.get(TyClDecl): ForeignType"
1219               2 -> do
1220                     a1 <- get bh
1221                     a2 <- get bh
1222                     a3 <- get bh
1223                     a4 <- get bh
1224                     a5 <- get bh
1225                     a6 <- get bh
1226                     a7 <- get bh
1227                     a8 <- get bh
1228                     occ <- return $! mkOccNameFS tcName a1
1229                     return (IfaceData occ a2 a3 a4 a5 a6 a7 a8)
1230               3 -> do
1231                     a1 <- get bh
1232                     a2 <- get bh
1233                     a3 <- get bh
1234                     a4 <- get bh
1235                     a5 <- get bh
1236                     occ <- return $! mkOccNameFS tcName a1
1237                     return (IfaceSyn occ a2 a3 a4 a5)
1238               _ -> do
1239                     a1 <- get bh
1240                     a2 <- get bh
1241                     a3 <- get bh
1242                     a4 <- get bh
1243                     a5 <- get bh
1244                     a6 <- get bh
1245                     a7 <- get bh
1246                     occ <- return $! mkOccNameFS clsName a2
1247                     return (IfaceClass a1 occ a3 a4 a5 a6 a7)
1248
1249 instance Binary IfaceInst where
1250     put_ bh (IfaceInst cls tys dfun flag orph) = do
1251             put_ bh cls
1252             put_ bh tys
1253             put_ bh dfun
1254             put_ bh flag
1255             put_ bh orph
1256     get bh = do cls  <- get bh
1257                 tys  <- get bh
1258                 dfun <- get bh
1259                 flag <- get bh
1260                 orph <- get bh
1261                 return (IfaceInst cls tys dfun flag orph)
1262
1263 instance Binary IfaceFamInst where
1264     put_ bh (IfaceFamInst fam tys tycon) = do
1265             put_ bh fam
1266             put_ bh tys
1267             put_ bh tycon
1268     get bh = do fam   <- get bh
1269                 tys   <- get bh
1270                 tycon <- get bh
1271                 return (IfaceFamInst fam tys tycon)
1272
1273 instance Binary OverlapFlag where
1274     put_ bh NoOverlap  = putByte bh 0
1275     put_ bh OverlapOk  = putByte bh 1
1276     put_ bh Incoherent = putByte bh 2
1277     get bh = do h <- getByte bh
1278                 case h of
1279                   0 -> return NoOverlap
1280                   1 -> return OverlapOk
1281                   2 -> return Incoherent
1282                   _ -> panic ("get OverlapFlag " ++ show h)
1283
1284 instance Binary IfaceConDecls where
1285     put_ bh IfAbstractTyCon = putByte bh 0
1286     put_ bh IfOpenDataTyCon = putByte bh 1
1287     put_ bh (IfDataTyCon cs) = do { putByte bh 2
1288                                   ; put_ bh cs }
1289     put_ bh (IfNewTyCon c)  = do { putByte bh 3
1290                                   ; put_ bh c }
1291     get bh = do
1292             h <- getByte bh
1293             case h of
1294               0 -> return IfAbstractTyCon
1295               1 -> return IfOpenDataTyCon
1296               2 -> do cs <- get bh
1297                       return (IfDataTyCon cs)
1298               _ -> do aa <- get bh
1299                       return (IfNewTyCon aa)
1300
1301 instance Binary IfaceConDecl where
1302     put_ bh (IfCon a1 a2 a3 a4 a5 a6 a7 a8 a9) = do
1303             put_ bh a1
1304             put_ bh a2
1305             put_ bh a3
1306             put_ bh a4
1307             put_ bh a5
1308             put_ bh a6
1309             put_ bh a7
1310             put_ bh a8
1311             put_ bh a9
1312     get bh = do a1 <- get bh
1313                 a2 <- get bh
1314                 a3 <- get bh          
1315                 a4 <- get bh
1316                 a5 <- get bh
1317                 a6 <- get bh
1318                 a7 <- get bh
1319                 a8 <- get bh
1320                 a9 <- get bh
1321                 return (IfCon a1 a2 a3 a4 a5 a6 a7 a8 a9)
1322
1323 instance Binary IfaceClassOp where
1324    put_ bh (IfaceClassOp n def ty) = do 
1325         put_ bh (occNameFS n)
1326         put_ bh def     
1327         put_ bh ty
1328    get bh = do
1329         n <- get bh
1330         def <- get bh
1331         ty <- get bh
1332         occ <- return $! mkOccNameFS varName n
1333         return (IfaceClassOp occ def ty)
1334
1335 instance Binary IfaceRule where
1336     put_ bh (IfaceRule a1 a2 a3 a4 a5 a6 a7) = do
1337             put_ bh a1
1338             put_ bh a2
1339             put_ bh a3
1340             put_ bh a4
1341             put_ bh a5
1342             put_ bh a6
1343             put_ bh a7
1344     get bh = do
1345             a1 <- get bh
1346             a2 <- get bh
1347             a3 <- get bh
1348             a4 <- get bh
1349             a5 <- get bh
1350             a6 <- get bh
1351             a7 <- get bh
1352             return (IfaceRule a1 a2 a3 a4 a5 a6 a7)
1353
1354 instance Binary IfaceAnnotation where
1355     put_ bh (IfaceAnnotation a1 a2) = do
1356         put_ bh a1
1357         put_ bh a2
1358     get bh = do
1359         a1 <- get bh
1360         a2 <- get bh
1361         return (IfaceAnnotation a1 a2)
1362
1363 instance Binary name => Binary (AnnTarget name) where
1364     put_ bh (NamedTarget a) = do
1365         putByte bh 0
1366         put_ bh a
1367     put_ bh (ModuleTarget a) = do
1368         putByte bh 1
1369         put_ bh a
1370     get bh = do
1371         h <- getByte bh
1372         case h of
1373           0 -> do a <- get bh
1374                   return (NamedTarget a)
1375           _ -> do a <- get bh
1376                   return (ModuleTarget a)
1377
1378 instance Binary IfaceVectInfo where
1379     put_ bh (IfaceVectInfo a1 a2 a3) = do
1380             put_ bh a1
1381             put_ bh a2
1382             put_ bh a3
1383     get bh = do
1384             a1 <- get bh
1385             a2 <- get bh
1386             a3 <- get bh
1387             return (IfaceVectInfo a1 a2 a3)
1388
1389