X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fghci%2FByteCodeInstr.lhs;h=2393f21f8eb888b6899eaf1a01b9edbb0aafacc3;hb=41cd72b3545c96c72816afb7b7627f3e744d9ab4;hp=5239139eb2234d60440a771d7e4314e36772d4c9;hpb=7cca410a40cccf0fbeda2155f307baa5619b8130;p=ghc-hetmet.git diff --git a/compiler/ghci/ByteCodeInstr.lhs b/compiler/ghci/ByteCodeInstr.lhs index 5239139..2393f21 100644 --- a/compiler/ghci/ByteCodeInstr.lhs +++ b/compiler/ghci/ByteCodeInstr.lhs @@ -4,8 +4,9 @@ ByteCodeInstrs: Bytecode instruction definitions \begin{code} +{-# OPTIONS_GHC -funbox-strict-fields #-} module ByteCodeInstr ( - BCInstr(..), ProtoBCO(..), bciStackUse + BCInstr(..), ProtoBCO(..), bciStackUse, BreakInfo (..) ) where #include "HsVersions.h" @@ -13,6 +14,7 @@ module ByteCodeInstr ( import ByteCodeItbls ( ItblPtr ) +import Type import Outputable import Name import Id @@ -26,6 +28,10 @@ import SMRep import GHC.Ptr +import Module (Module) +import GHC.Prim + + -- ---------------------------------------------------------------------------- -- Bytecode instructions @@ -50,9 +56,9 @@ data BCInstr = STKCHECK Int -- Push locals (existing bits of the stack) - | PUSH_L Int{-offset-} - | PUSH_LL Int Int{-2 offsets-} - | PUSH_LLL Int Int Int{-3 offsets-} + | PUSH_L !Int{-offset-} + | PUSH_LL !Int !Int{-2 offsets-} + | PUSH_LLL !Int !Int !Int{-3 offsets-} -- Push a ptr (these all map to PUSH_G really) | PUSH_G Name @@ -90,12 +96,12 @@ data BCInstr | SLIDE Int{-this many-} Int{-down by this much-} -- To do with the heap - | ALLOC_AP Int -- make an AP with this many payload words - | ALLOC_PAP Int Int -- make a PAP with this arity / payload words - | MKAP Int{-ptr to AP is this far down stack-} Int{-# words-} - | MKPAP Int{-ptr to PAP is this far down stack-} Int{-# words-} - | UNPACK Int -- unpack N words from t.o.s Constr - | PACK DataCon Int + | ALLOC_AP !Int -- make an AP with this many payload words + | ALLOC_PAP !Int !Int -- make a PAP with this arity / payload words + | MKAP !Int{-ptr to AP is this far down stack-} !Int{-# words-} + | MKPAP !Int{-ptr to PAP is this far down stack-} !Int{-# words-} + | UNPACK !Int -- unpack N words from t.o.s Constr + | PACK DataCon !Int -- after assembly, the DataCon is an index into the -- itbl array -- For doing case trees @@ -129,6 +135,24 @@ data BCInstr | RETURN -- return a lifted value | RETURN_UBX CgRep -- return an unlifted value, here's its rep + -- Breakpoints + | BRK_FUN (MutableByteArray# RealWorld) Int BreakInfo + +data BreakInfo + = BreakInfo + { breakInfo_module :: Module + , breakInfo_number :: {-# UNPACK #-} !Int + , breakInfo_vars :: [(Id,Int)] + , breakInfo_resty :: Type + } + +instance Outputable BreakInfo where + ppr info = text "BreakInfo" <+> + parens (ppr (breakInfo_module info) <+> + ppr (breakInfo_number info) <+> + ppr (breakInfo_vars info) <+> + ppr (breakInfo_resty info)) + -- ----------------------------------------------------------------------------- -- Printing bytecode instructions @@ -196,6 +220,7 @@ instance Outputable BCInstr where ppr ENTER = text "ENTER" ppr RETURN = text "RETURN" ppr (RETURN_UBX pk) = text "RETURN_UBX " <+> ppr pk + ppr (BRK_FUN breakArray index info) = text "BRK_FUN" <+> text "" <+> int index <+> ppr info -- ----------------------------------------------------------------------------- -- The stack use, in words, of each bytecode insn. These _must_ be @@ -251,6 +276,7 @@ bciStackUse RETURN{} = 0 bciStackUse RETURN_UBX{} = 1 bciStackUse CCALL{} = 0 bciStackUse SWIZZLE{} = 0 +bciStackUse BRK_FUN{} = 0 -- These insns actually reduce stack use, but we need the high-tide level, -- so can't use this info. Not that it matters much.