{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -funbox-strict-fields #-}
module GHC.ByteCode.Instr (
BCInstr(..), ProtoBCO(..), bciStackUse, LocalLabel(..)
) where
import GHC.Prelude
import GHC.ByteCode.Types
import GHCi.RemoteTypes
import GHCi.FFI (C_ffi_cif)
import GHC.StgToCmm.Layout ( ArgRep(..) )
import GHC.Utils.Outputable
import GHC.Types.Name
import GHC.Types.Unique
import GHC.Types.Literal
import GHC.Core.DataCon
import GHC.Builtin.PrimOps
import GHC.Runtime.Heap.Layout
import Data.Word
import GHC.Stack.CCS (CostCentre)
import GHC.Stg.Syntax
data ProtoBCO a
= ProtoBCO {
forall a. ProtoBCO a -> a
protoBCOName :: a,
forall a. ProtoBCO a -> [BCInstr]
protoBCOInstrs :: [BCInstr],
forall a. ProtoBCO a -> [StgWord]
protoBCOBitmap :: [StgWord],
forall a. ProtoBCO a -> Word16
protoBCOBitmapSize :: Word16,
forall a. ProtoBCO a -> Int
protoBCOArity :: Int,
forall a. ProtoBCO a -> Either [CgStgAlt] CgStgRhs
protoBCOExpr :: Either [CgStgAlt] CgStgRhs,
forall a. ProtoBCO a -> [FFIInfo]
protoBCOFFIs :: [FFIInfo]
}
newtype LocalLabel = LocalLabel { LocalLabel -> Word32
getLocalLabel :: Word32 }
deriving (LocalLabel -> LocalLabel -> Bool
(LocalLabel -> LocalLabel -> Bool)
-> (LocalLabel -> LocalLabel -> Bool) -> Eq LocalLabel
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LocalLabel -> LocalLabel -> Bool
== :: LocalLabel -> LocalLabel -> Bool
$c/= :: LocalLabel -> LocalLabel -> Bool
/= :: LocalLabel -> LocalLabel -> Bool
Eq, Eq LocalLabel
Eq LocalLabel =>
(LocalLabel -> LocalLabel -> Ordering)
-> (LocalLabel -> LocalLabel -> Bool)
-> (LocalLabel -> LocalLabel -> Bool)
-> (LocalLabel -> LocalLabel -> Bool)
-> (LocalLabel -> LocalLabel -> Bool)
-> (LocalLabel -> LocalLabel -> LocalLabel)
-> (LocalLabel -> LocalLabel -> LocalLabel)
-> Ord LocalLabel
LocalLabel -> LocalLabel -> Bool
LocalLabel -> LocalLabel -> Ordering
LocalLabel -> LocalLabel -> LocalLabel
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: LocalLabel -> LocalLabel -> Ordering
compare :: LocalLabel -> LocalLabel -> Ordering
$c< :: LocalLabel -> LocalLabel -> Bool
< :: LocalLabel -> LocalLabel -> Bool
$c<= :: LocalLabel -> LocalLabel -> Bool
<= :: LocalLabel -> LocalLabel -> Bool
$c> :: LocalLabel -> LocalLabel -> Bool
> :: LocalLabel -> LocalLabel -> Bool
$c>= :: LocalLabel -> LocalLabel -> Bool
>= :: LocalLabel -> LocalLabel -> Bool
$cmax :: LocalLabel -> LocalLabel -> LocalLabel
max :: LocalLabel -> LocalLabel -> LocalLabel
$cmin :: LocalLabel -> LocalLabel -> LocalLabel
min :: LocalLabel -> LocalLabel -> LocalLabel
Ord)
instance Outputable LocalLabel where
ppr :: LocalLabel -> SDoc
ppr (LocalLabel Word32
lbl) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"lbl:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> Word32 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word32
lbl
data BCInstr
= STKCHECK Word
| PUSH_L !Word16
| PUSH_LL !Word16 !Word16
| PUSH_LLL !Word16 !Word16 !Word16
| PUSH8 !Word16
| PUSH16 !Word16
| PUSH32 !Word16
| PUSH8_W !Word16
| PUSH16_W !Word16
| PUSH32_W !Word16
| PUSH_G Name
| PUSH_PRIMOP PrimOp
| PUSH_BCO (ProtoBCO Name)
| PUSH_ALTS (ProtoBCO Name)
| PUSH_ALTS_UNLIFTED (ProtoBCO Name) ArgRep
| PUSH_ALTS_TUPLE (ProtoBCO Name)
!TupleInfo
(ProtoBCO Name)
| PUSH_PAD8
| PUSH_PAD16
| PUSH_PAD32
| PUSH_UBX8 Literal
| PUSH_UBX16 Literal
| PUSH_UBX32 Literal
| PUSH_UBX Literal Word16
| PUSH_APPLY_N
| PUSH_APPLY_V
| PUSH_APPLY_F
| PUSH_APPLY_D
| PUSH_APPLY_L
| PUSH_APPLY_P
| PUSH_APPLY_PP
| PUSH_APPLY_PPP
| PUSH_APPLY_PPPP
| PUSH_APPLY_PPPPP
| PUSH_APPLY_PPPPPP
| SLIDE Word16 Word16
| ALLOC_AP !Word16
| ALLOC_AP_NOUPD !Word16
| ALLOC_PAP !Word16 !Word16
| MKAP !Word16 !Word16
| MKPAP !Word16 !Word16
| UNPACK !Word16
| PACK DataCon !Word16
| LABEL LocalLabel
| TESTLT_I Int LocalLabel
| TESTEQ_I Int LocalLabel
| TESTLT_W Word LocalLabel
| TESTEQ_W Word LocalLabel
| TESTLT_F Float LocalLabel
| TESTEQ_F Float LocalLabel
| TESTLT_D Double LocalLabel
| TESTEQ_D Double LocalLabel
| TESTLT_P Word16 LocalLabel
| TESTEQ_P Word16 LocalLabel
| CASEFAIL
| JMP LocalLabel
| CCALL Word16
(RemotePtr C_ffi_cif)
Word16
| SWIZZLE Word16
Word16
| ENTER
| RETURN
| RETURN_UNLIFTED ArgRep
| RETURN_TUPLE
| BRK_FUN Word16 Unique (RemotePtr CostCentre)
instance Outputable a => Outputable (ProtoBCO a) where
ppr :: ProtoBCO a -> SDoc
ppr (ProtoBCO { protoBCOName :: forall a. ProtoBCO a -> a
protoBCOName = a
name
, protoBCOInstrs :: forall a. ProtoBCO a -> [BCInstr]
protoBCOInstrs = [BCInstr]
instrs
, protoBCOBitmap :: forall a. ProtoBCO a -> [StgWord]
protoBCOBitmap = [StgWord]
bitmap
, protoBCOBitmapSize :: forall a. ProtoBCO a -> Word16
protoBCOBitmapSize = Word16
bsize
, protoBCOArity :: forall a. ProtoBCO a -> Int
protoBCOArity = Int
arity
, protoBCOExpr :: forall a. ProtoBCO a -> Either [CgStgAlt] CgStgRhs
protoBCOExpr = Either [CgStgAlt] CgStgRhs
origin
, protoBCOFFIs :: forall a. ProtoBCO a -> [FFIInfo]
protoBCOFFIs = [FFIInfo]
ffis })
= (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"ProtoBCO" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> a -> SDoc
forall a. Outputable a => a -> SDoc
ppr a
name SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> Char -> SDoc
forall doc. IsLine doc => Char -> doc
char Char
'#' SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> Int -> SDoc
forall doc. IsLine doc => Int -> doc
int Int
arity
SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text ([FFIInfo] -> String
forall a. Show a => a -> String
show [FFIInfo]
ffis) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
colon)
SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ Int -> SDoc -> SDoc
nest Int
3 (case Either [CgStgAlt] CgStgRhs
origin of
Left [CgStgAlt]
alts ->
[SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat ((SDoc -> SDoc -> SDoc) -> [SDoc] -> [SDoc] -> [SDoc]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
(<+>) (Char -> SDoc
forall doc. IsLine doc => Char -> doc
char Char
'{' SDoc -> [SDoc] -> [SDoc]
forall a. a -> [a] -> [a]
: SDoc -> [SDoc]
forall a. a -> [a]
repeat (Char -> SDoc
forall doc. IsLine doc => Char -> doc
char Char
';'))
((CgStgAlt -> SDoc) -> [CgStgAlt] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map (StgPprOpts -> CgStgAlt -> SDoc
forall (pass :: StgPass).
OutputablePass pass =>
StgPprOpts -> GenStgAlt pass -> SDoc
pprStgAltShort StgPprOpts
shortStgPprOpts) [CgStgAlt]
alts))
Right CgStgRhs
rhs ->
StgPprOpts -> CgStgRhs -> SDoc
forall (pass :: StgPass).
OutputablePass pass =>
StgPprOpts -> GenStgRhs pass -> SDoc
pprStgRhsShort StgPprOpts
shortStgPprOpts CgStgRhs
rhs
)
SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ Int -> SDoc -> SDoc
nest Int
3 (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"bitmap: " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text (Word16 -> String
forall a. Show a => a -> String
show Word16
bsize) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> [StgWord] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [StgWord]
bitmap)
SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ Int -> SDoc -> SDoc
nest Int
3 ([SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat ((BCInstr -> SDoc) -> [BCInstr] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map BCInstr -> SDoc
forall a. Outputable a => a -> SDoc
ppr [BCInstr]
instrs))
pprStgExprShort :: OutputablePass pass => StgPprOpts -> GenStgExpr pass -> SDoc
pprStgExprShort :: forall (pass :: StgPass).
OutputablePass pass =>
StgPprOpts -> GenStgExpr pass -> SDoc
pprStgExprShort StgPprOpts
_ (StgCase GenStgExpr pass
_expr BinderP pass
var AltType
_ty [GenStgAlt pass]
_alts) =
String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"case of" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> BinderP pass -> SDoc
forall a. Outputable a => a -> SDoc
ppr BinderP pass
var
pprStgExprShort StgPprOpts
_ (StgLet XLet pass
_ GenStgBinding pass
bnd GenStgExpr pass
_) =
String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"let" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> GenStgBinding pass -> SDoc
forall (pass :: StgPass).
OutputablePass pass =>
GenStgBinding pass -> SDoc
pprStgBindShort GenStgBinding pass
bnd SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"in ..."
pprStgExprShort StgPprOpts
_ (StgLetNoEscape XLetNoEscape pass
_ GenStgBinding pass
bnd GenStgExpr pass
_) =
String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"let-no-escape" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> GenStgBinding pass -> SDoc
forall (pass :: StgPass).
OutputablePass pass =>
GenStgBinding pass -> SDoc
pprStgBindShort GenStgBinding pass
bnd SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"in ..."
pprStgExprShort StgPprOpts
opts (StgTick StgTickish
t GenStgExpr pass
e) = StgTickish -> SDoc
forall a. Outputable a => a -> SDoc
ppr StgTickish
t SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> StgPprOpts -> GenStgExpr pass -> SDoc
forall (pass :: StgPass).
OutputablePass pass =>
StgPprOpts -> GenStgExpr pass -> SDoc
pprStgExprShort StgPprOpts
opts GenStgExpr pass
e
pprStgExprShort StgPprOpts
opts GenStgExpr pass
e = StgPprOpts -> GenStgExpr pass -> SDoc
forall (pass :: StgPass).
OutputablePass pass =>
StgPprOpts -> GenStgExpr pass -> SDoc
pprStgExpr StgPprOpts
opts GenStgExpr pass
e
pprStgBindShort :: OutputablePass pass => GenStgBinding pass -> SDoc
pprStgBindShort :: forall (pass :: StgPass).
OutputablePass pass =>
GenStgBinding pass -> SDoc
pprStgBindShort (StgNonRec BinderP pass
x GenStgRhs pass
_) =
BinderP pass -> SDoc
forall a. Outputable a => a -> SDoc
ppr BinderP pass
x SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"= ..."
pprStgBindShort (StgRec [(BinderP pass, GenStgRhs pass)]
bs) =
Char -> SDoc
forall doc. IsLine doc => Char -> doc
char Char
'{' SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> BinderP pass -> SDoc
forall a. Outputable a => a -> SDoc
ppr ((BinderP pass, GenStgRhs pass) -> BinderP pass
forall a b. (a, b) -> a
fst ([(BinderP pass, GenStgRhs pass)] -> (BinderP pass, GenStgRhs pass)
forall a. HasCallStack => [a] -> a
head [(BinderP pass, GenStgRhs pass)]
bs)) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"= ...; ... }"
pprStgAltShort :: OutputablePass pass => StgPprOpts -> GenStgAlt pass -> SDoc
pprStgAltShort :: forall (pass :: StgPass).
OutputablePass pass =>
StgPprOpts -> GenStgAlt pass -> SDoc
pprStgAltShort StgPprOpts
opts GenStgAlt{alt_con :: forall (pass :: StgPass). GenStgAlt pass -> AltCon
alt_con=AltCon
con, alt_bndrs :: forall (pass :: StgPass). GenStgAlt pass -> [BinderP pass]
alt_bndrs=[BinderP pass]
args, alt_rhs :: forall (pass :: StgPass). GenStgAlt pass -> GenStgExpr pass
alt_rhs=GenStgExpr pass
expr} =
AltCon -> SDoc
forall a. Outputable a => a -> SDoc
ppr AltCon
con SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> [SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
sep ((BinderP pass -> SDoc) -> [BinderP pass] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map BinderP pass -> SDoc
forall a. Outputable a => a -> SDoc
ppr [BinderP pass]
args) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"->" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> StgPprOpts -> GenStgExpr pass -> SDoc
forall (pass :: StgPass).
OutputablePass pass =>
StgPprOpts -> GenStgExpr pass -> SDoc
pprStgExprShort StgPprOpts
opts GenStgExpr pass
expr
pprStgRhsShort :: OutputablePass pass => StgPprOpts -> GenStgRhs pass -> SDoc
pprStgRhsShort :: forall (pass :: StgPass).
OutputablePass pass =>
StgPprOpts -> GenStgRhs pass -> SDoc
pprStgRhsShort StgPprOpts
opts (StgRhsClosure XRhsClosure pass
_ext CostCentreStack
_cc UpdateFlag
upd_flag [BinderP pass]
args GenStgExpr pass
body) =
SDoc -> Int -> SDoc -> SDoc
hang ([SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
hsep [ Char -> SDoc
forall doc. IsLine doc => Char -> doc
char Char
'\\' SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> UpdateFlag -> SDoc
forall a. Outputable a => a -> SDoc
ppr UpdateFlag
upd_flag, SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
brackets ([BinderP pass] -> SDoc
forall a. Outputable a => [a] -> SDoc
interppSP [BinderP pass]
args) ])
Int
4 (StgPprOpts -> GenStgExpr pass -> SDoc
forall (pass :: StgPass).
OutputablePass pass =>
StgPprOpts -> GenStgExpr pass -> SDoc
pprStgExprShort StgPprOpts
opts GenStgExpr pass
body)
pprStgRhsShort StgPprOpts
opts GenStgRhs pass
rhs = StgPprOpts -> GenStgRhs pass -> SDoc
forall (pass :: StgPass).
OutputablePass pass =>
StgPprOpts -> GenStgRhs pass -> SDoc
pprStgRhs StgPprOpts
opts GenStgRhs pass
rhs
instance Outputable BCInstr where
ppr :: BCInstr -> SDoc
ppr (STKCHECK Word
n) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"STKCHECK" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word
n
ppr (PUSH_L Word16
offset) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_L " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
offset
ppr (PUSH_LL Word16
o1 Word16
o2) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_LL " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
o1 SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
o2
ppr (PUSH_LLL Word16
o1 Word16
o2 Word16
o3) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_LLL" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
o1 SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
o2 SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
o3
ppr (PUSH8 Word16
offset) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH8 " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
offset
ppr (PUSH16 Word16
offset) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH16 " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
offset
ppr (PUSH32 Word16
offset) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH32 " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
offset
ppr (PUSH8_W Word16
offset) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH8_W " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
offset
ppr (PUSH16_W Word16
offset) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH16_W " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
offset
ppr (PUSH32_W Word16
offset) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH32_W " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
offset
ppr (PUSH_G Name
nm) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_G " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr Name
nm
ppr (PUSH_PRIMOP PrimOp
op) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_G " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"GHC.PrimopWrappers."
SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> PrimOp -> SDoc
forall a. Outputable a => a -> SDoc
ppr PrimOp
op
ppr (PUSH_BCO ProtoBCO Name
bco) = SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_BCO") Int
2 (ProtoBCO Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr ProtoBCO Name
bco)
ppr (PUSH_ALTS ProtoBCO Name
bco) = SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_ALTS") Int
2 (ProtoBCO Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr ProtoBCO Name
bco)
ppr (PUSH_ALTS_UNLIFTED ProtoBCO Name
bco ArgRep
pk) = SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_ALTS_UNLIFTED" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> ArgRep -> SDoc
forall a. Outputable a => a -> SDoc
ppr ArgRep
pk) Int
2 (ProtoBCO Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr ProtoBCO Name
bco)
ppr (PUSH_ALTS_TUPLE ProtoBCO Name
bco TupleInfo
tuple_info ProtoBCO Name
tuple_bco) =
SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_ALTS_TUPLE" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> TupleInfo -> SDoc
forall a. Outputable a => a -> SDoc
ppr TupleInfo
tuple_info)
Int
2
(ProtoBCO Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr ProtoBCO Name
tuple_bco SDoc -> SDoc -> SDoc
$+$ ProtoBCO Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr ProtoBCO Name
bco)
ppr BCInstr
PUSH_PAD8 = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_PAD8"
ppr BCInstr
PUSH_PAD16 = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_PAD16"
ppr BCInstr
PUSH_PAD32 = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_PAD32"
ppr (PUSH_UBX8 Literal
lit) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_UBX8" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Literal -> SDoc
forall a. Outputable a => a -> SDoc
ppr Literal
lit
ppr (PUSH_UBX16 Literal
lit) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_UBX16" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Literal -> SDoc
forall a. Outputable a => a -> SDoc
ppr Literal
lit
ppr (PUSH_UBX32 Literal
lit) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_UBX32" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Literal -> SDoc
forall a. Outputable a => a -> SDoc
ppr Literal
lit
ppr (PUSH_UBX Literal
lit Word16
nw) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_UBX" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
parens (Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
nw) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Literal -> SDoc
forall a. Outputable a => a -> SDoc
ppr Literal
lit
ppr BCInstr
PUSH_APPLY_N = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_APPLY_N"
ppr BCInstr
PUSH_APPLY_V = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_APPLY_V"
ppr BCInstr
PUSH_APPLY_F = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_APPLY_F"
ppr BCInstr
PUSH_APPLY_D = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_APPLY_D"
ppr BCInstr
PUSH_APPLY_L = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_APPLY_L"
ppr BCInstr
PUSH_APPLY_P = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_APPLY_P"
ppr BCInstr
PUSH_APPLY_PP = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_APPLY_PP"
ppr BCInstr
PUSH_APPLY_PPP = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_APPLY_PPP"
ppr BCInstr
PUSH_APPLY_PPPP = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_APPLY_PPPP"
ppr BCInstr
PUSH_APPLY_PPPPP = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_APPLY_PPPPP"
ppr BCInstr
PUSH_APPLY_PPPPPP = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PUSH_APPLY_PPPPPP"
ppr (SLIDE Word16
n Word16
d) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"SLIDE " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
n SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
d
ppr (ALLOC_AP Word16
sz) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"ALLOC_AP " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
sz
ppr (ALLOC_AP_NOUPD Word16
sz) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"ALLOC_AP_NOUPD " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
sz
ppr (ALLOC_PAP Word16
arity Word16
sz) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"ALLOC_PAP " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
arity SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
sz
ppr (MKAP Word16
offset Word16
sz) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"MKAP " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
sz SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"words,"
SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
offset SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"stkoff"
ppr (MKPAP Word16
offset Word16
sz) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"MKPAP " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
sz SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"words,"
SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
offset SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"stkoff"
ppr (UNPACK Word16
sz) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"UNPACK " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
sz
ppr (PACK DataCon
dcon Word16
sz) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"PACK " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> DataCon -> SDoc
forall a. Outputable a => a -> SDoc
ppr DataCon
dcon SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
sz
ppr (LABEL LocalLabel
lab) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"__" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> LocalLabel -> SDoc
forall a. Outputable a => a -> SDoc
ppr LocalLabel
lab SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
forall doc. IsLine doc => doc
colon
ppr (TESTLT_I Int
i LocalLabel
lab) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"TESTLT_I" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Int -> SDoc
forall doc. IsLine doc => Int -> doc
int Int
i SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"__" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> LocalLabel -> SDoc
forall a. Outputable a => a -> SDoc
ppr LocalLabel
lab
ppr (TESTEQ_I Int
i LocalLabel
lab) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"TESTEQ_I" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Int -> SDoc
forall doc. IsLine doc => Int -> doc
int Int
i SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"__" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> LocalLabel -> SDoc
forall a. Outputable a => a -> SDoc
ppr LocalLabel
lab
ppr (TESTLT_W Word
i LocalLabel
lab) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"TESTLT_W" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Int -> SDoc
forall doc. IsLine doc => Int -> doc
int (Word -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
i) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"__" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> LocalLabel -> SDoc
forall a. Outputable a => a -> SDoc
ppr LocalLabel
lab
ppr (TESTEQ_W Word
i LocalLabel
lab) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"TESTEQ_W" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Int -> SDoc
forall doc. IsLine doc => Int -> doc
int (Word -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
i) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"__" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> LocalLabel -> SDoc
forall a. Outputable a => a -> SDoc
ppr LocalLabel
lab
ppr (TESTLT_F Float
f LocalLabel
lab) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"TESTLT_F" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Float -> SDoc
forall doc. IsLine doc => Float -> doc
float Float
f SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"__" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> LocalLabel -> SDoc
forall a. Outputable a => a -> SDoc
ppr LocalLabel
lab
ppr (TESTEQ_F Float
f LocalLabel
lab) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"TESTEQ_F" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Float -> SDoc
forall doc. IsLine doc => Float -> doc
float Float
f SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"__" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> LocalLabel -> SDoc
forall a. Outputable a => a -> SDoc
ppr LocalLabel
lab
ppr (TESTLT_D Double
d LocalLabel
lab) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"TESTLT_D" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Double -> SDoc
forall doc. IsLine doc => Double -> doc
double Double
d SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"__" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> LocalLabel -> SDoc
forall a. Outputable a => a -> SDoc
ppr LocalLabel
lab
ppr (TESTEQ_D Double
d LocalLabel
lab) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"TESTEQ_D" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Double -> SDoc
forall doc. IsLine doc => Double -> doc
double Double
d SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"__" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> LocalLabel -> SDoc
forall a. Outputable a => a -> SDoc
ppr LocalLabel
lab
ppr (TESTLT_P Word16
i LocalLabel
lab) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"TESTLT_P" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
i SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"__" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> LocalLabel -> SDoc
forall a. Outputable a => a -> SDoc
ppr LocalLabel
lab
ppr (TESTEQ_P Word16
i LocalLabel
lab) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"TESTEQ_P" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
i SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"__" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> LocalLabel -> SDoc
forall a. Outputable a => a -> SDoc
ppr LocalLabel
lab
ppr BCInstr
CASEFAIL = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"CASEFAIL"
ppr (JMP LocalLabel
lab) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"JMP" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> LocalLabel -> SDoc
forall a. Outputable a => a -> SDoc
ppr LocalLabel
lab
ppr (CCALL Word16
off RemotePtr C_ffi_cif
marshal_addr Word16
flags) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"CCALL " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
off
SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"marshal code at"
SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text (RemotePtr C_ffi_cif -> String
forall a. Show a => a -> String
show RemotePtr C_ffi_cif
marshal_addr)
SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> (case Word16
flags of
Word16
0x1 -> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"(interruptible)"
Word16
0x2 -> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"(unsafe)"
Word16
_ -> SDoc
forall doc. IsOutput doc => doc
empty)
ppr (SWIZZLE Word16
stkoff Word16
n) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"SWIZZLE " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"stkoff" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
stkoff
SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"by" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
n
ppr BCInstr
ENTER = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"ENTER"
ppr BCInstr
RETURN = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"RETURN"
ppr (RETURN_UNLIFTED ArgRep
pk) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"RETURN_UNLIFTED " SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> ArgRep -> SDoc
forall a. Outputable a => a -> SDoc
ppr ArgRep
pk
ppr (BCInstr
RETURN_TUPLE) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"RETURN_TUPLE"
ppr (BRK_FUN Word16
index Unique
uniq RemotePtr CostCentre
_cc) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"BRK_FUN" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Word16 -> SDoc
forall a. Outputable a => a -> SDoc
ppr Word16
index SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Unique -> SDoc
forall a. Outputable a => a -> SDoc
ppr Unique
uniq SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"<cc>"
protoBCOStackUse :: ProtoBCO a -> Word
protoBCOStackUse :: forall a. ProtoBCO a -> Word
protoBCOStackUse ProtoBCO a
bco = [Word] -> Word
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ((BCInstr -> Word) -> [BCInstr] -> [Word]
forall a b. (a -> b) -> [a] -> [b]
map BCInstr -> Word
bciStackUse (ProtoBCO a -> [BCInstr]
forall a. ProtoBCO a -> [BCInstr]
protoBCOInstrs ProtoBCO a
bco))
bciStackUse :: BCInstr -> Word
bciStackUse :: BCInstr -> Word
bciStackUse STKCHECK{} = Word
0
bciStackUse PUSH_L{} = Word
1
bciStackUse PUSH_LL{} = Word
2
bciStackUse PUSH_LLL{} = Word
3
bciStackUse PUSH8{} = Word
1
bciStackUse PUSH16{} = Word
1
bciStackUse PUSH32{} = Word
1
bciStackUse PUSH8_W{} = Word
1
bciStackUse PUSH16_W{} = Word
1
bciStackUse PUSH32_W{} = Word
1
bciStackUse PUSH_G{} = Word
1
bciStackUse PUSH_PRIMOP{} = Word
1
bciStackUse PUSH_BCO{} = Word
1
bciStackUse (PUSH_ALTS ProtoBCO Name
bco) = Word
2 Word -> Word -> Word
forall a. Num a => a -> a -> a
+
Word
3 Word -> Word -> Word
forall a. Num a => a -> a -> a
+ ProtoBCO Name -> Word
forall a. ProtoBCO a -> Word
protoBCOStackUse ProtoBCO Name
bco
bciStackUse (PUSH_ALTS_UNLIFTED ProtoBCO Name
bco ArgRep
_) = Word
2 Word -> Word -> Word
forall a. Num a => a -> a -> a
+
Word
4 Word -> Word -> Word
forall a. Num a => a -> a -> a
+ ProtoBCO Name -> Word
forall a. ProtoBCO a -> Word
protoBCOStackUse ProtoBCO Name
bco
bciStackUse (PUSH_ALTS_TUPLE ProtoBCO Name
bco TupleInfo
info ProtoBCO Name
_) =
Word
1 Word -> Word -> Word
forall a. Num a => a -> a -> a
+
Word
7 Word -> Word -> Word
forall a. Num a => a -> a -> a
+ WordOff -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral (TupleInfo -> WordOff
tupleSize TupleInfo
info) Word -> Word -> Word
forall a. Num a => a -> a -> a
+ ProtoBCO Name -> Word
forall a. ProtoBCO a -> Word
protoBCOStackUse ProtoBCO Name
bco
bciStackUse (BCInstr
PUSH_PAD8) = Word
1
bciStackUse (BCInstr
PUSH_PAD16) = Word
1
bciStackUse (BCInstr
PUSH_PAD32) = Word
1
bciStackUse (PUSH_UBX8 Literal
_) = Word
1
bciStackUse (PUSH_UBX16 Literal
_) = Word
1
bciStackUse (PUSH_UBX32 Literal
_) = Word
1
bciStackUse (PUSH_UBX Literal
_ Word16
nw) = Word16 -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
nw
bciStackUse PUSH_APPLY_N{} = Word
1
bciStackUse PUSH_APPLY_V{} = Word
1
bciStackUse PUSH_APPLY_F{} = Word
1
bciStackUse PUSH_APPLY_D{} = Word
1
bciStackUse PUSH_APPLY_L{} = Word
1
bciStackUse PUSH_APPLY_P{} = Word
1
bciStackUse PUSH_APPLY_PP{} = Word
1
bciStackUse PUSH_APPLY_PPP{} = Word
1
bciStackUse PUSH_APPLY_PPPP{} = Word
1
bciStackUse PUSH_APPLY_PPPPP{} = Word
1
bciStackUse PUSH_APPLY_PPPPPP{} = Word
1
bciStackUse ALLOC_AP{} = Word
1
bciStackUse ALLOC_AP_NOUPD{} = Word
1
bciStackUse ALLOC_PAP{} = Word
1
bciStackUse (UNPACK Word16
sz) = Word16 -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
sz
bciStackUse LABEL{} = Word
0
bciStackUse TESTLT_I{} = Word
0
bciStackUse TESTEQ_I{} = Word
0
bciStackUse TESTLT_W{} = Word
0
bciStackUse TESTEQ_W{} = Word
0
bciStackUse TESTLT_F{} = Word
0
bciStackUse TESTEQ_F{} = Word
0
bciStackUse TESTLT_D{} = Word
0
bciStackUse TESTEQ_D{} = Word
0
bciStackUse TESTLT_P{} = Word
0
bciStackUse TESTEQ_P{} = Word
0
bciStackUse CASEFAIL{} = Word
0
bciStackUse JMP{} = Word
0
bciStackUse ENTER{} = Word
0
bciStackUse RETURN{} = Word
0
bciStackUse RETURN_UNLIFTED{} = Word
1
bciStackUse RETURN_TUPLE{} = Word
1
bciStackUse CCALL{} = Word
0
bciStackUse SWIZZLE{} = Word
0
bciStackUse BRK_FUN{} = Word
0
bciStackUse SLIDE{} = Word
0
bciStackUse MKAP{} = Word
0
bciStackUse MKPAP{} = Word
0
bciStackUse PACK{} = Word
1