631a28660e8374d1df38fd7ce6e9552a4906992d
[ghc-hetmet.git] / compiler / iface / BinIface.hs
1 {-% DrIFT (Automatic class derivations for Haskell) v1.1 %-}
2 {-% DrIFT (Automatic class derivations for Haskell) v1.1 %-}
3 -- 
4 --  (c) The University of Glasgow 2002
5 -- 
6 -- Binary interface file support.
7
8 module BinIface ( writeBinIface, readBinIface, v_IgnoreHiWay ) where
9
10 #include "HsVersions.h"
11
12 import HscTypes
13 import BasicTypes
14 import NewDemand
15 import IfaceSyn
16 import VarEnv
17 import InstEnv          ( OverlapFlag(..) )
18 import Packages         ( PackageIdH(..) )
19 import Class            ( DefMeth(..) )
20 import CostCentre
21 import StaticFlags      ( opt_HiVersion, v_Build_tag )
22 import Kind             ( Kind(..) )
23 import Panic
24 import Binary
25 import Util
26 import Config           ( cGhcUnregisterised )
27
28 import DATA_IOREF
29 import EXCEPTION        ( throwDyn )
30 import Monad            ( when )
31 import Outputable
32
33 #include "HsVersions.h"
34
35 -- ---------------------------------------------------------------------------
36 writeBinIface :: FilePath -> ModIface -> IO ()
37 writeBinIface hi_path mod_iface
38   = putBinFileWithDict hi_path mod_iface
39
40 readBinIface :: FilePath -> IO ModIface
41 readBinIface hi_path = getBinFileWithDict hi_path
42
43
44 -- %*********************************************************
45 -- %*                                                       *
46 --              All the Binary instances
47 -- %*                                                       *
48 -- %*********************************************************
49
50 -- BasicTypes
51 {-! for IPName derive: Binary !-}
52 {-! for Fixity derive: Binary !-}
53 {-! for FixityDirection derive: Binary !-}
54 {-! for Boxity derive: Binary !-}
55 {-! for StrictnessMark derive: Binary !-}
56 {-! for Activation derive: Binary !-}
57
58 -- NewDemand
59 {-! for Demand derive: Binary !-}
60 {-! for Demands derive: Binary !-}
61 {-! for DmdResult derive: Binary !-}
62 {-! for StrictSig derive: Binary !-}
63
64 -- Class
65 {-! for DefMeth derive: Binary !-}
66
67 -- HsTypes
68 {-! for HsPred derive: Binary !-}
69 {-! for HsType derive: Binary !-}
70 {-! for TupCon derive: Binary !-}
71 {-! for HsTyVarBndr derive: Binary !-}
72
73 -- HsCore
74 {-! for UfExpr derive: Binary !-}
75 {-! for UfConAlt derive: Binary !-}
76 {-! for UfBinding derive: Binary !-}
77 {-! for UfBinder derive: Binary !-}
78 {-! for HsIdInfo derive: Binary !-}
79 {-! for UfNote derive: Binary !-}
80
81 -- HsDecls
82 {-! for ConDetails derive: Binary !-}
83 {-! for BangType derive: Binary !-}
84
85 -- CostCentre
86 {-! for IsCafCC derive: Binary !-}
87 {-! for IsDupdCC derive: Binary !-}
88 {-! for CostCentre derive: Binary !-}
89
90
91
92 -- ---------------------------------------------------------------------------
93 -- Reading a binary interface into ParsedIface
94
95 instance Binary ModIface where
96    put_ bh (ModIface {
97                  mi_module    = mod,
98                  mi_boot      = is_boot,
99                  mi_mod_vers  = mod_vers,
100                  mi_package   = _, -- we ignore the package on output
101                  mi_orphan    = orphan,
102                  mi_deps      = deps,
103                  mi_usages    = usages,
104                  mi_exports   = exports,
105                  mi_exp_vers  = exp_vers,
106                  mi_fixities  = fixities,
107                  mi_deprecs   = deprecs,
108                  mi_decls     = decls,
109                  mi_insts     = insts,
110                  mi_rules     = rules,
111                  mi_rule_vers = rule_vers }) = do
112         put_ bh (show opt_HiVersion)
113         way_descr <- getWayDescr
114         put  bh way_descr
115         put_ bh mod
116         put_ bh is_boot
117         put_ bh mod_vers
118         put_ bh orphan
119         lazyPut bh deps
120         lazyPut bh usages
121         put_ bh exports
122         put_ bh exp_vers
123         put_ bh fixities
124         lazyPut bh deprecs
125         put_ bh decls
126         put_ bh insts
127         lazyPut bh rules
128         put_ bh rule_vers
129
130    get bh = do
131         check_ver  <- get bh
132         let our_ver = show opt_HiVersion
133         when (check_ver /= our_ver) $
134            -- use userError because this will be caught by readIface
135            -- which will emit an error msg containing the iface module name.
136            throwDyn (ProgramError (
137                 "mismatched interface file versions: expected "
138                 ++ our_ver ++ ", found " ++ check_ver))
139
140         check_way <- get bh
141         ignore_way <- readIORef v_IgnoreHiWay
142         way_descr <- getWayDescr
143         when (not ignore_way && check_way /= way_descr) $
144            -- use userError because this will be caught by readIface
145            -- which will emit an error msg containing the iface module name.
146            throwDyn (ProgramError (
147                 "mismatched interface file ways: expected "
148                 ++ way_descr ++ ", found " ++ check_way))
149
150         mod_name  <- get bh
151         is_boot   <- get bh
152         mod_vers  <- get bh
153         orphan    <- get bh
154         deps      <- lazyGet bh
155         usages    <- {-# SCC "bin_usages" #-} lazyGet bh
156         exports   <- {-# SCC "bin_exports" #-} get bh
157         exp_vers  <- get bh
158         fixities  <- {-# SCC "bin_fixities" #-} get bh
159         deprecs   <- {-# SCC "bin_deprecs" #-} lazyGet bh
160         decls     <- {-# SCC "bin_tycldecls" #-} get bh
161         insts     <- {-# SCC "bin_insts" #-} get bh
162         rules     <- {-# SCC "bin_rules" #-} lazyGet bh
163         rule_vers <- get bh
164         return (ModIface {
165                  mi_package   = HomePackage, -- to be filled in properly later
166                  mi_module    = mod_name,
167                  mi_boot      = is_boot,
168                  mi_mod_vers  = mod_vers,
169                  mi_orphan    = orphan,
170                  mi_deps      = deps,
171                  mi_usages    = usages,
172                  mi_exports   = exports,
173                  mi_exp_vers  = exp_vers,
174                  mi_fixities  = fixities,
175                  mi_deprecs   = deprecs,
176                  mi_decls     = decls,
177                  mi_globals   = Nothing,
178                  mi_insts     = insts,
179                  mi_rules     = rules,
180                  mi_rule_vers = rule_vers,
181                         -- And build the cached values
182                  mi_dep_fn = mkIfaceDepCache deprecs,
183                  mi_fix_fn = mkIfaceFixCache fixities,
184                  mi_ver_fn = mkIfaceVerCache decls })
185
186 GLOBAL_VAR(v_IgnoreHiWay, False, Bool)
187
188 getWayDescr :: IO String
189 getWayDescr = do
190   tag <- readIORef v_Build_tag
191   if cGhcUnregisterised == "YES" then return ('u':tag) else return tag
192         -- if this is an unregisterised build, make sure our interfaces
193         -- can't be used by a registerised build.
194
195 -------------------------------------------------------------------------
196 --              Types from: HscTypes
197 -------------------------------------------------------------------------
198
199 instance Binary Dependencies where
200     put_ bh deps = do put_ bh (dep_mods deps)
201                       put_ bh (dep_pkgs deps)
202                       put_ bh (dep_orphs deps)
203
204     get bh = do ms <- get bh 
205                 ps <- get bh
206                 os <- get bh
207                 return (Deps { dep_mods = ms, dep_pkgs = ps, dep_orphs = os })
208
209 instance (Binary name) => Binary (GenAvailInfo name) where
210     put_ bh (Avail aa) = do
211             putByte bh 0
212             put_ bh aa
213     put_ bh (AvailTC ab ac) = do
214             putByte bh 1
215             put_ bh ab
216             put_ bh ac
217     get bh = do
218             h <- getByte bh
219             case h of
220               0 -> do aa <- get bh
221                       return (Avail aa)
222               _ -> do ab <- get bh
223                       ac <- get bh
224                       return (AvailTC ab ac)
225
226 instance Binary Usage where
227     put_ bh usg = do 
228         put_ bh (usg_name     usg)
229         put_ bh (usg_mod      usg)
230         put_ bh (usg_exports  usg)
231         put_ bh (usg_entities usg)
232         put_ bh (usg_rules    usg)
233
234     get bh = do
235         nm    <- get bh
236         mod   <- get bh
237         exps  <- get bh
238         ents  <- get bh
239         rules <- get bh
240         return (Usage { usg_name = nm, usg_mod = mod,
241                         usg_exports = exps, usg_entities = ents,
242                         usg_rules = rules })
243
244 instance Binary a => Binary (Deprecs a) where
245     put_ bh NoDeprecs     = putByte bh 0
246     put_ bh (DeprecAll t) = do
247             putByte bh 1
248             put_ bh t
249     put_ bh (DeprecSome ts) = do
250             putByte bh 2
251             put_ bh ts
252
253     get bh = do
254             h <- getByte bh
255             case h of
256               0 -> return NoDeprecs
257               1 -> do aa <- get bh
258                       return (DeprecAll aa)
259               _ -> do aa <- get bh
260                       return (DeprecSome aa)
261
262 -------------------------------------------------------------------------
263 --              Types from: BasicTypes
264 -------------------------------------------------------------------------
265
266 instance Binary Activation where
267     put_ bh NeverActive = do
268             putByte bh 0
269     put_ bh AlwaysActive = do
270             putByte bh 1
271     put_ bh (ActiveBefore aa) = do
272             putByte bh 2
273             put_ bh aa
274     put_ bh (ActiveAfter ab) = do
275             putByte bh 3
276             put_ bh ab
277     get bh = do
278             h <- getByte bh
279             case h of
280               0 -> do return NeverActive
281               1 -> do return AlwaysActive
282               2 -> do aa <- get bh
283                       return (ActiveBefore aa)
284               _ -> do ab <- get bh
285                       return (ActiveAfter ab)
286
287 instance Binary StrictnessMark where
288     put_ bh MarkedStrict = do
289             putByte bh 0
290     put_ bh MarkedUnboxed = do
291             putByte bh 1
292     put_ bh NotMarkedStrict = do
293             putByte bh 2
294     get bh = do
295             h <- getByte bh
296             case h of
297               0 -> do return MarkedStrict
298               1 -> do return MarkedUnboxed
299               _ -> do return NotMarkedStrict
300
301 instance Binary Boxity where
302     put_ bh Boxed = do
303             putByte bh 0
304     put_ bh Unboxed = do
305             putByte bh 1
306     get bh = do
307             h <- getByte bh
308             case h of
309               0 -> do return Boxed
310               _ -> do return Unboxed
311
312 instance Binary TupCon where
313     put_ bh (TupCon ab ac) = do
314             put_ bh ab
315             put_ bh ac
316     get bh = do
317           ab <- get bh
318           ac <- get bh
319           return (TupCon ab ac)
320
321 instance Binary RecFlag where
322     put_ bh Recursive = do
323             putByte bh 0
324     put_ bh NonRecursive = do
325             putByte bh 1
326     get bh = do
327             h <- getByte bh
328             case h of
329               0 -> do return Recursive
330               _ -> do return NonRecursive
331
332 instance Binary DefMeth where
333     put_ bh NoDefMeth  = putByte bh 0
334     put_ bh DefMeth    = putByte bh 1
335     put_ bh GenDefMeth = putByte bh 2
336     get bh = do
337             h <- getByte bh
338             case h of
339               0 -> return NoDefMeth
340               1 -> return DefMeth
341               _ -> return GenDefMeth
342
343 instance Binary FixityDirection where
344     put_ bh InfixL = do
345             putByte bh 0
346     put_ bh InfixR = do
347             putByte bh 1
348     put_ bh InfixN = do
349             putByte bh 2
350     get bh = do
351             h <- getByte bh
352             case h of
353               0 -> do return InfixL
354               1 -> do return InfixR
355               _ -> do return InfixN
356
357 instance Binary Fixity where
358     put_ bh (Fixity aa ab) = do
359             put_ bh aa
360             put_ bh ab
361     get bh = do
362           aa <- get bh
363           ab <- get bh
364           return (Fixity aa ab)
365
366 instance (Binary name) => Binary (IPName name) where
367     put_ bh (Dupable aa) = do
368             putByte bh 0
369             put_ bh aa
370     put_ bh (Linear ab) = do
371             putByte bh 1
372             put_ bh ab
373     get bh = do
374             h <- getByte bh
375             case h of
376               0 -> do aa <- get bh
377                       return (Dupable aa)
378               _ -> do ab <- get bh
379                       return (Linear ab)
380
381 -------------------------------------------------------------------------
382 --              Types from: Demand
383 -------------------------------------------------------------------------
384
385 instance Binary DmdType where
386         -- Ignore DmdEnv when spitting out the DmdType
387   put bh (DmdType _ ds dr) = do p <- put bh ds; put bh dr; return (castBin p)
388   get bh = do ds <- get bh; dr <- get bh; return (DmdType emptyVarEnv ds dr)
389
390 instance Binary Demand where
391     put_ bh Top = do
392             putByte bh 0
393     put_ bh Abs = do
394             putByte bh 1
395     put_ bh (Call aa) = do
396             putByte bh 2
397             put_ bh aa
398     put_ bh (Eval ab) = do
399             putByte bh 3
400             put_ bh ab
401     put_ bh (Defer ac) = do
402             putByte bh 4
403             put_ bh ac
404     put_ bh (Box ad) = do
405             putByte bh 5
406             put_ bh ad
407     put_ bh Bot = do
408             putByte bh 6
409     get bh = do
410             h <- getByte bh
411             case h of
412               0 -> do return Top
413               1 -> do return Abs
414               2 -> do aa <- get bh
415                       return (Call aa)
416               3 -> do ab <- get bh
417                       return (Eval ab)
418               4 -> do ac <- get bh
419                       return (Defer ac)
420               5 -> do ad <- get bh
421                       return (Box ad)
422               _ -> do return Bot
423
424 instance Binary Demands where
425     put_ bh (Poly aa) = do
426             putByte bh 0
427             put_ bh aa
428     put_ bh (Prod ab) = do
429             putByte bh 1
430             put_ bh ab
431     get bh = do
432             h <- getByte bh
433             case h of
434               0 -> do aa <- get bh
435                       return (Poly aa)
436               _ -> do ab <- get bh
437                       return (Prod ab)
438
439 instance Binary DmdResult where
440     put_ bh TopRes = do
441             putByte bh 0
442     put_ bh RetCPR = do
443             putByte bh 1
444     put_ bh BotRes = do
445             putByte bh 2
446     get bh = do
447             h <- getByte bh
448             case h of
449               0 -> do return TopRes
450               1 -> do return RetCPR     -- Really use RetCPR even if -fcpr-off
451                                         -- The wrapper was generated for CPR in 
452                                         -- the imported module!
453               _ -> do return BotRes
454
455 instance Binary StrictSig where
456     put_ bh (StrictSig aa) = do
457             put_ bh aa
458     get bh = do
459           aa <- get bh
460           return (StrictSig aa)
461
462
463 -------------------------------------------------------------------------
464 --              Types from: CostCentre
465 -------------------------------------------------------------------------
466
467 instance Binary IsCafCC where
468     put_ bh CafCC = do
469             putByte bh 0
470     put_ bh NotCafCC = do
471             putByte bh 1
472     get bh = do
473             h <- getByte bh
474             case h of
475               0 -> do return CafCC
476               _ -> do return NotCafCC
477
478 instance Binary IsDupdCC where
479     put_ bh OriginalCC = do
480             putByte bh 0
481     put_ bh DupdCC = do
482             putByte bh 1
483     get bh = do
484             h <- getByte bh
485             case h of
486               0 -> do return OriginalCC
487               _ -> do return DupdCC
488
489 instance Binary CostCentre where
490     put_ bh NoCostCentre = do
491             putByte bh 0
492     put_ bh (NormalCC aa ab ac ad) = do
493             putByte bh 1
494             put_ bh aa
495             put_ bh ab
496             put_ bh ac
497             put_ bh ad
498     put_ bh (AllCafsCC ae) = do
499             putByte bh 2
500             put_ bh ae
501     get bh = do
502             h <- getByte bh
503             case h of
504               0 -> do return NoCostCentre
505               1 -> do aa <- get bh
506                       ab <- get bh
507                       ac <- get bh
508                       ad <- get bh
509                       return (NormalCC aa ab ac ad)
510               _ -> do ae <- get bh
511                       return (AllCafsCC ae)
512
513 -------------------------------------------------------------------------
514 --              IfaceTypes and friends
515 -------------------------------------------------------------------------
516
517 instance Binary IfaceExtName where
518     put_ bh (ExtPkg mod occ) = do
519             putByte bh 0
520             put_ bh mod
521             put_ bh occ
522     put_ bh (HomePkg mod occ vers) = do
523             putByte bh 1
524             put_ bh mod
525             put_ bh occ
526             put_ bh vers
527     put_ bh (LocalTop occ) = do
528             putByte bh 2
529             put_ bh occ
530     put_ bh (LocalTopSub occ _) = do    -- Write LocalTopSub just like LocalTop
531             putByte bh 2
532             put_ bh occ
533
534     get bh = do
535             h <- getByte bh
536             case h of
537               0 -> do mod <- get bh
538                       occ <- get bh
539                       return (ExtPkg mod occ)
540               1 -> do mod <- get bh
541                       occ <- get bh
542                       vers <- get bh
543                       return (HomePkg mod occ vers)
544               _ -> do occ <- get bh
545                       return (LocalTop occ)
546
547 instance Binary IfaceBndr where
548     put_ bh (IfaceIdBndr aa) = do
549             putByte bh 0
550             put_ bh aa
551     put_ bh (IfaceTvBndr ab) = do
552             putByte bh 1
553             put_ bh ab
554     get bh = do
555             h <- getByte bh
556             case h of
557               0 -> do aa <- get bh
558                       return (IfaceIdBndr aa)
559               _ -> do ab <- get bh
560                       return (IfaceTvBndr ab)
561
562 instance Binary Kind where
563     put_ bh LiftedTypeKind   = putByte bh 0
564     put_ bh UnliftedTypeKind = putByte bh 1
565     put_ bh UnboxedTypeKind  = putByte bh 2
566     put_ bh OpenTypeKind     = putByte bh 3
567     put_ bh ArgTypeKind      = putByte bh 4
568     put_ bh UbxTupleKind     = putByte bh 5
569     put_ bh (FunKind k1 k2)  = do 
570             putByte bh 6
571             put_ bh k1
572             put_ bh k2
573     put_ bh (KindVar kv) = pprPanic "BinIface.put_: kind var" (ppr kv)
574
575     get bh = do
576             h <- getByte bh
577             case h of
578               0 -> return LiftedTypeKind 
579               1 -> return UnliftedTypeKind
580               2 -> return UnboxedTypeKind
581               3 -> return OpenTypeKind
582               4 -> return ArgTypeKind
583               5 -> return UbxTupleKind
584               _ -> do k1 <- get bh
585                       k2 <- get bh
586                       return (FunKind k1 k2)
587
588 instance Binary IfaceType where
589     put_ bh (IfaceForAllTy aa ab) = do
590             putByte bh 0
591             put_ bh aa
592             put_ bh ab
593     put_ bh (IfaceTyVar ad) = do
594             putByte bh 1
595             put_ bh ad
596     put_ bh (IfaceAppTy ae af) = do
597             putByte bh 2
598             put_ bh ae
599             put_ bh af
600     put_ bh (IfaceFunTy ag ah) = do
601             putByte bh 3
602             put_ bh ag
603             put_ bh ah
604     put_ bh (IfacePredTy aq) = do
605             putByte bh 5
606             put_ bh aq
607
608         -- Simple compression for common cases of TyConApp
609     put_ bh (IfaceTyConApp IfaceIntTc  [])   = putByte bh 6
610     put_ bh (IfaceTyConApp IfaceCharTc [])   = putByte bh 7
611     put_ bh (IfaceTyConApp IfaceBoolTc [])   = putByte bh 8
612     put_ bh (IfaceTyConApp IfaceListTc [ty]) = do { putByte bh 9; put_ bh ty }
613         -- Unit tuple and pairs
614     put_ bh (IfaceTyConApp (IfaceTupTc Boxed 0) [])      = putByte bh 10
615     put_ bh (IfaceTyConApp (IfaceTupTc Boxed 2) [t1,t2]) = do { putByte bh 11; put_ bh t1; put_ bh t2 }
616         -- Generic cases
617     put_ bh (IfaceTyConApp (IfaceTc tc) tys) = do { putByte bh 12; put_ bh tc; put_ bh tys }
618     put_ bh (IfaceTyConApp tc tys)           = do { putByte bh 13; put_ bh tc; put_ bh tys }
619
620     get bh = do
621             h <- getByte bh
622             case h of
623               0 -> do aa <- get bh
624                       ab <- get bh
625                       return (IfaceForAllTy aa ab)
626               1 -> do ad <- get bh
627                       return (IfaceTyVar ad)
628               2 -> do ae <- get bh
629                       af <- get bh
630                       return (IfaceAppTy ae af)
631               3 -> do ag <- get bh
632                       ah <- get bh
633                       return (IfaceFunTy ag ah)
634               5 -> do ap <- get bh
635                       return (IfacePredTy ap)
636
637                 -- Now the special cases for TyConApp
638               6 -> return (IfaceTyConApp IfaceIntTc [])
639               7 -> return (IfaceTyConApp IfaceCharTc [])
640               8 -> return (IfaceTyConApp IfaceBoolTc [])
641               9 -> do { ty <- get bh; return (IfaceTyConApp IfaceListTc [ty]) }
642               10 -> return (IfaceTyConApp (IfaceTupTc Boxed 0) [])
643               11 -> do { t1 <- get bh; t2 <- get bh; return (IfaceTyConApp (IfaceTupTc Boxed 2) [t1,t2]) }
644               12 -> do { tc <- get bh; tys <- get bh; return (IfaceTyConApp (IfaceTc tc) tys) }
645               _  -> do { tc <- get bh; tys <- get bh; return (IfaceTyConApp tc tys) }
646
647 instance Binary IfaceTyCon where
648         -- Int,Char,Bool can't show up here because they can't not be saturated
649
650    put_ bh IfaceIntTc         = putByte bh 1
651    put_ bh IfaceBoolTc        = putByte bh 2
652    put_ bh IfaceCharTc        = putByte bh 3
653    put_ bh IfaceListTc        = putByte bh 4
654    put_ bh IfacePArrTc        = putByte bh 5
655    put_ bh (IfaceTupTc bx ar) = do { putByte bh 6; put_ bh bx; put_ bh ar }
656    put_ bh (IfaceTc ext)      = do { putByte bh 7; put_ bh ext }
657
658    get bh = do
659         h <- getByte bh
660         case h of
661           1 -> return IfaceIntTc
662           2 -> return IfaceBoolTc
663           3 -> return IfaceCharTc
664           4 -> return IfaceListTc
665           5 -> return IfacePArrTc
666           6 -> do { bx <- get bh; ar <- get bh; return (IfaceTupTc bx ar) }
667           _ -> do { ext <- get bh; return (IfaceTc ext) }
668
669 instance Binary IfacePredType where
670     put_ bh (IfaceClassP aa ab) = do
671             putByte bh 0
672             put_ bh aa
673             put_ bh ab
674     put_ bh (IfaceIParam ac ad) = do
675             putByte bh 1
676             put_ bh ac
677             put_ bh ad
678     get bh = do
679             h <- getByte bh
680             case h of
681               0 -> do aa <- get bh
682                       ab <- get bh
683                       return (IfaceClassP aa ab)
684               _ -> do ac <- get bh
685                       ad <- get bh
686                       return (IfaceIParam ac ad)
687
688 -------------------------------------------------------------------------
689 --              IfaceExpr and friends
690 -------------------------------------------------------------------------
691
692 instance Binary IfaceExpr where
693     put_ bh (IfaceLcl aa) = do
694             putByte bh 0
695             put_ bh aa
696     put_ bh (IfaceType ab) = do
697             putByte bh 1
698             put_ bh ab
699     put_ bh (IfaceTuple ac ad) = do
700             putByte bh 2
701             put_ bh ac
702             put_ bh ad
703     put_ bh (IfaceLam ae af) = do
704             putByte bh 3
705             put_ bh ae
706             put_ bh af
707     put_ bh (IfaceApp ag ah) = do
708             putByte bh 4
709             put_ bh ag
710             put_ bh ah
711 -- gaw 2004
712     put_ bh (IfaceCase ai aj al ak) = do
713             putByte bh 5
714             put_ bh ai
715             put_ bh aj
716 -- gaw 2004
717             put_ bh al
718             put_ bh ak
719     put_ bh (IfaceLet al am) = do
720             putByte bh 6
721             put_ bh al
722             put_ bh am
723     put_ bh (IfaceNote an ao) = do
724             putByte bh 7
725             put_ bh an
726             put_ bh ao
727     put_ bh (IfaceLit ap) = do
728             putByte bh 8
729             put_ bh ap
730     put_ bh (IfaceFCall as at) = do
731             putByte bh 9
732             put_ bh as
733             put_ bh at
734     put_ bh (IfaceExt aa) = do
735             putByte bh 10
736             put_ bh aa
737     get bh = do
738             h <- getByte bh
739             case h of
740               0 -> do aa <- get bh
741                       return (IfaceLcl aa)
742               1 -> do ab <- get bh
743                       return (IfaceType ab)
744               2 -> do ac <- get bh
745                       ad <- get bh
746                       return (IfaceTuple ac ad)
747               3 -> do ae <- get bh
748                       af <- get bh
749                       return (IfaceLam ae af)
750               4 -> do ag <- get bh
751                       ah <- get bh
752                       return (IfaceApp ag ah)
753               5 -> do ai <- get bh
754                       aj <- get bh
755 -- gaw 2004
756                       al <- get bh                   
757                       ak <- get bh
758 -- gaw 2004
759                       return (IfaceCase ai aj al ak)
760               6 -> do al <- get bh
761                       am <- get bh
762                       return (IfaceLet al am)
763               7 -> do an <- get bh
764                       ao <- get bh
765                       return (IfaceNote an ao)
766               8 -> do ap <- get bh
767                       return (IfaceLit ap)
768               9 -> do as <- get bh
769                       at <- get bh
770                       return (IfaceFCall as at)
771               _ -> do aa <- get bh
772                       return (IfaceExt aa)
773
774 instance Binary IfaceConAlt where
775     put_ bh IfaceDefault = do
776             putByte bh 0
777     put_ bh (IfaceDataAlt aa) = do
778             putByte bh 1
779             put_ bh aa
780     put_ bh (IfaceTupleAlt ab) = do
781             putByte bh 2
782             put_ bh ab
783     put_ bh (IfaceLitAlt ac) = do
784             putByte bh 3
785             put_ bh ac
786     get bh = do
787             h <- getByte bh
788             case h of
789               0 -> do return IfaceDefault
790               1 -> do aa <- get bh
791                       return (IfaceDataAlt aa)
792               2 -> do ab <- get bh
793                       return (IfaceTupleAlt ab)
794               _ -> do ac <- get bh
795                       return (IfaceLitAlt ac)
796
797 instance Binary IfaceBinding where
798     put_ bh (IfaceNonRec aa ab) = do
799             putByte bh 0
800             put_ bh aa
801             put_ bh ab
802     put_ bh (IfaceRec ac) = do
803             putByte bh 1
804             put_ bh ac
805     get bh = do
806             h <- getByte bh
807             case h of
808               0 -> do aa <- get bh
809                       ab <- get bh
810                       return (IfaceNonRec aa ab)
811               _ -> do ac <- get bh
812                       return (IfaceRec ac)
813
814 instance Binary IfaceIdInfo where
815     put_ bh NoInfo = putByte bh 0
816     put_ bh (HasInfo i) = do
817             putByte bh 1
818             lazyPut bh i                        -- NB lazyPut
819
820     get bh = do
821             h <- getByte bh
822             case h of
823               0 -> return NoInfo
824               _ -> do info <- lazyGet bh        -- NB lazyGet
825                       return (HasInfo info)
826
827 instance Binary IfaceInfoItem where
828     put_ bh (HsArity aa) = do
829             putByte bh 0
830             put_ bh aa
831     put_ bh (HsStrictness ab) = do
832             putByte bh 1
833             put_ bh ab
834     put_ bh (HsUnfold ad) = do
835             putByte bh 2
836             put_ bh ad
837     put_ bh (HsInline ad) = do
838             putByte bh 3
839             put_ bh ad
840     put_ bh HsNoCafRefs = do
841             putByte bh 4
842     put_ bh (HsWorker ae af) = do
843             putByte bh 5
844             put_ bh ae
845             put_ bh af
846     get bh = do
847             h <- getByte bh
848             case h of
849               0 -> do aa <- get bh
850                       return (HsArity aa)
851               1 -> do ab <- get bh
852                       return (HsStrictness ab)
853               2 -> do ad <- get bh
854                       return (HsUnfold ad)
855               3 -> do ad <- get bh
856                       return (HsInline ad)
857               4 -> do return HsNoCafRefs
858               _ -> do ae <- get bh
859                       af <- get bh
860                       return (HsWorker ae af)
861
862 instance Binary IfaceNote where
863     put_ bh (IfaceSCC aa) = do
864             putByte bh 0
865             put_ bh aa
866     put_ bh (IfaceCoerce ab) = do
867             putByte bh 1
868             put_ bh ab
869     put_ bh IfaceInlineMe = do
870             putByte bh 3
871     put_ bh (IfaceCoreNote s) = do
872             putByte bh 4
873             put_ bh s
874     get bh = do
875             h <- getByte bh
876             case h of
877               0 -> do aa <- get bh
878                       return (IfaceSCC aa)
879               1 -> do ab <- get bh
880                       return (IfaceCoerce ab)
881               3 -> do return IfaceInlineMe
882               _ -> do ac <- get bh
883                       return (IfaceCoreNote ac)
884
885
886 -------------------------------------------------------------------------
887 --              IfaceDecl and friends
888 -------------------------------------------------------------------------
889
890 instance Binary IfaceDecl where
891     put_ bh (IfaceId name ty idinfo) = do
892             putByte bh 0
893             put_ bh name
894             put_ bh ty
895             put_ bh idinfo
896     put_ bh (IfaceForeign ae af) = 
897         error "Binary.put_(IfaceDecl): IfaceForeign"
898     put_ bh (IfaceData a1 a2 a3 a4 a5 a6 a7) = do
899             putByte bh 2
900             put_ bh a1
901             put_ bh a2
902             put_ bh a3
903             put_ bh a4
904             put_ bh a5
905             put_ bh a6
906             put_ bh a7
907
908     put_ bh (IfaceSyn aq ar as at) = do
909             putByte bh 3
910             put_ bh aq
911             put_ bh ar
912             put_ bh as
913             put_ bh at
914     put_ bh (IfaceClass a1 a2 a3 a4 a5 a6 a7) = do
915             putByte bh 4
916             put_ bh a1
917             put_ bh a2
918             put_ bh a3
919             put_ bh a4
920             put_ bh a5
921             put_ bh a6
922             put_ bh a7
923     get bh = do
924             h <- getByte bh
925             case h of
926               0 -> do name   <- get bh
927                       ty     <- get bh
928                       idinfo <- get bh
929                       return (IfaceId name ty idinfo)
930               1 -> error "Binary.get(TyClDecl): ForeignType"
931               2 -> do
932                     a1 <- get bh
933                     a2 <- get bh
934                     a3 <- get bh
935                     a4 <- get bh
936                     a5 <- get bh
937                     a6 <- get bh
938                     a7 <- get bh
939                     return (IfaceData a1 a2 a3 a4 a5 a6 a7)
940               3 -> do
941                     aq <- get bh
942                     ar <- get bh
943                     as <- get bh
944                     at <- get bh
945                     return (IfaceSyn aq ar as at)
946               _ -> do
947                     a1 <- get bh
948                     a2 <- get bh
949                     a3 <- get bh
950                     a4 <- get bh
951                     a5 <- get bh
952                     a6 <- get bh
953                     a7 <- get bh
954                     return (IfaceClass a1 a2 a3 a4 a5 a6 a7)
955
956 instance Binary IfaceInst where
957     put_ bh (IfaceInst cls tys dfun flag orph) = do
958             put_ bh cls
959             put_ bh tys
960             put_ bh dfun
961             put_ bh flag
962             put_ bh orph
963     get bh = do cls  <- get bh
964                 tys  <- get bh
965                 dfun <- get bh
966                 flag <- get bh
967                 orph <- get bh
968                 return (IfaceInst cls tys dfun flag orph)
969
970 instance Binary OverlapFlag where
971     put_ bh NoOverlap  = putByte bh 0
972     put_ bh OverlapOk  = putByte bh 1
973     put_ bh Incoherent = putByte bh 2
974     get bh = do h <- getByte bh
975                 case h of
976                   0 -> return NoOverlap
977                   1 -> return OverlapOk
978                   2 -> return Incoherent
979
980 instance Binary IfaceConDecls where
981     put_ bh IfAbstractTyCon = putByte bh 0
982     put_ bh (IfDataTyCon cs) = do { putByte bh 1
983                                   ; put_ bh cs }
984     put_ bh (IfNewTyCon c)  = do { putByte bh 2
985                                   ; put_ bh c }
986     get bh = do
987             h <- getByte bh
988             case h of
989               0 -> return IfAbstractTyCon
990               1 -> do cs <- get bh
991                       return (IfDataTyCon cs)
992               _ -> do aa <- get bh
993                       return (IfNewTyCon aa)
994
995 instance Binary IfaceConDecl where
996     put_ bh (IfVanillaCon a1 a2 a3 a4 a5) = do
997             putByte bh 0
998             put_ bh a1
999             put_ bh a2
1000             put_ bh a3
1001             put_ bh a4
1002             put_ bh a5
1003     put_ bh (IfGadtCon a1 a2 a3 a4 a5 a6) = do
1004             putByte bh 1
1005             put_ bh a1
1006             put_ bh a2
1007             put_ bh a3
1008             put_ bh a4
1009             put_ bh a5
1010             put_ bh a6
1011     get bh = do
1012             h <- getByte bh
1013             case h of
1014               0 -> do a1 <- get bh
1015                       a2 <- get bh
1016                       a3 <- get bh            
1017                       a4 <- get bh
1018                       a5 <- get bh
1019                       return (IfVanillaCon a1 a2 a3 a4 a5)
1020               _ -> do a1 <- get bh
1021                       a2 <- get bh
1022                       a3 <- get bh            
1023                       a4 <- get bh
1024                       a5 <- get bh
1025                       a6 <- get bh
1026                       return (IfGadtCon a1 a2 a3 a4 a5 a6)
1027
1028 instance Binary IfaceClassOp where
1029    put_ bh (IfaceClassOp n def ty) = do 
1030         put_ bh n 
1031         put_ bh def     
1032         put_ bh ty
1033    get bh = do
1034         n <- get bh
1035         def <- get bh
1036         ty <- get bh
1037         return (IfaceClassOp n def ty)
1038
1039 instance Binary IfaceRule where
1040     put_ bh (IfaceRule a1 a2 a3 a4 a5 a6 a7) = do
1041             put_ bh a1
1042             put_ bh a2
1043             put_ bh a3
1044             put_ bh a4
1045             put_ bh a5
1046             put_ bh a6
1047             put_ bh a7
1048     get bh = do
1049             a1 <- get bh
1050             a2 <- get bh
1051             a3 <- get bh
1052             a4 <- get bh
1053             a5 <- get bh
1054             a6 <- get bh
1055             a7 <- get bh
1056             return (IfaceRule a1 a2 a3 a4 a5 a6 a7)
1057
1058