X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fghci%2FByteCodeInstr.lhs;h=1d629c0643b7bbf6a70722f69c4d19ba98443e5c;hb=0f66260b5afc88accb6af6a09b20c3a4de51c39a;hp=3f57d187dc4825308e22b6b3b87969a17034e327;hpb=cdce647711c0f46f5799b24de087622cb77e647f;p=ghc-hetmet.git diff --git a/compiler/ghci/ByteCodeInstr.lhs b/compiler/ghci/ByteCodeInstr.lhs index 3f57d18..1d629c0 100644 --- a/compiler/ghci/ByteCodeInstr.lhs +++ b/compiler/ghci/ByteCodeInstr.lhs @@ -4,6 +4,15 @@ ByteCodeInstrs: Bytecode instruction definitions \begin{code} +{-# OPTIONS_GHC -funbox-strict-fields #-} + +{-# OPTIONS -w #-} +-- The above warning supression flag is a temporary kludge. +-- While working on this module you are encouraged to remove it and fix +-- any warnings in the module. See +-- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings +-- for details + module ByteCodeInstr ( BCInstr(..), ProtoBCO(..), bciStackUse, BreakInfo (..) ) where @@ -13,6 +22,7 @@ module ByteCodeInstr ( import ByteCodeItbls ( ItblPtr ) +import Type import Outputable import Name import Id @@ -27,7 +37,7 @@ import SMRep import GHC.Ptr import Module (Module) -import GHC.Prim +import GHC.Exts -- ---------------------------------------------------------------------------- @@ -54,9 +64,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 @@ -94,12 +104,13 @@ 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_AP_NOUPD !Int -- make an AP_NOUPD 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 @@ -120,7 +131,7 @@ data BCInstr | CASEFAIL | JMP LocalLabel - -- For doing calls to C (via glue code generated by ByteCodeFFI) + -- For doing calls to C (via glue code generated by ByteCodeFFI, or libffi) | CCALL Int -- stack frame size (Ptr ()) -- addr of the glue code @@ -139,15 +150,17 @@ data BCInstr data BreakInfo = BreakInfo { breakInfo_module :: Module - , breakInfo_number :: Int + , 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_vars info) <+> + ppr (breakInfo_resty info)) -- ----------------------------------------------------------------------------- -- Printing bytecode instructions @@ -190,6 +203,7 @@ instance Outputable BCInstr where ppr (SLIDE n d) = text "SLIDE " <+> int n <+> int d ppr (ALLOC_AP sz) = text "ALLOC_AP " <+> int sz + ppr (ALLOC_AP_NOUPD sz) = text "ALLOC_AP_NOUPD " <+> int sz ppr (ALLOC_PAP arity sz) = text "ALLOC_PAP " <+> int arity <+> int sz ppr (MKAP offset sz) = text "MKAP " <+> int sz <+> text "words," <+> int offset <+> text "stkoff" @@ -254,6 +268,7 @@ bciStackUse PUSH_APPLY_PPPP{} = 1 bciStackUse PUSH_APPLY_PPPPP{} = 1 bciStackUse PUSH_APPLY_PPPPPP{} = 1 bciStackUse ALLOC_AP{} = 1 +bciStackUse ALLOC_AP_NOUPD{} = 1 bciStackUse ALLOC_PAP{} = 1 bciStackUse (UNPACK sz) = sz bciStackUse LABEL{} = 0