1{-# LANGUAGE RecordWildCards, DeriveGeneric, GeneralizedNewtypeDeriving,
2    BangPatterns, CPP #-}
3module GHCi.ResolvedBCO
4  ( ResolvedBCO(..)
5  , ResolvedBCOPtr(..)
6  , isLittleEndian
7  ) where
8
9import Prelude -- See note [Why do we import Prelude here?]
10import SizedSeq
11import GHCi.RemoteTypes
12import GHCi.BreakArray
13
14import Data.Array.Unboxed
15import Data.Binary
16import GHC.Generics
17import GHCi.BinaryArray
18
19
20#include "MachDeps.h"
21
22isLittleEndian :: Bool
23#if defined(WORDS_BIGENDIAN)
24isLittleEndian = True
25#else
26isLittleEndian = False
27#endif
28
29-- -----------------------------------------------------------------------------
30-- ResolvedBCO
31
32-- | A 'ResolvedBCO' is one in which all the 'Name' references have been
33-- resolved to actual addresses or 'RemoteHValues'.
34--
35-- Note, all arrays are zero-indexed (we assume this when
36-- serializing/deserializing)
37data ResolvedBCO
38   = ResolvedBCO {
39        resolvedBCOIsLE   :: Bool,
40        resolvedBCOArity  :: {-# UNPACK #-} !Int,
41        resolvedBCOInstrs :: UArray Int Word16,         -- insns
42        resolvedBCOBitmap :: UArray Int Word64,         -- bitmap
43        resolvedBCOLits   :: UArray Int Word64,         -- non-ptrs
44        resolvedBCOPtrs   :: (SizedSeq ResolvedBCOPtr)  -- ptrs
45   }
46   deriving (Generic, Show)
47
48-- | The Binary instance for ResolvedBCOs.
49--
50-- Note, that we do encode the endianness, however there is no support for mixed
51-- endianness setups.  This is primarily to ensure that ghc and iserv share the
52-- same endianness.
53instance Binary ResolvedBCO where
54  put ResolvedBCO{..} = do
55    put resolvedBCOIsLE
56    put resolvedBCOArity
57    putArray resolvedBCOInstrs
58    putArray resolvedBCOBitmap
59    putArray resolvedBCOLits
60    put resolvedBCOPtrs
61  get = ResolvedBCO
62        <$> get <*> get <*> getArray <*> getArray <*> getArray <*> get
63
64data ResolvedBCOPtr
65  = ResolvedBCORef {-# UNPACK #-} !Int
66      -- ^ reference to the Nth BCO in the current set
67  | ResolvedBCOPtr {-# UNPACK #-} !(RemoteRef HValue)
68      -- ^ reference to a previously created BCO
69  | ResolvedBCOStaticPtr {-# UNPACK #-} !(RemotePtr ())
70      -- ^ reference to a static ptr
71  | ResolvedBCOPtrBCO ResolvedBCO
72      -- ^ a nested BCO
73  | ResolvedBCOPtrBreakArray {-# UNPACK #-} !(RemoteRef BreakArray)
74      -- ^ Resolves to the MutableArray# inside the BreakArray
75  deriving (Generic, Show)
76
77instance Binary ResolvedBCOPtr
78