----------------------------------------------------------------------------- -- -- Sequel type for Stg to C-- code generation -- -- (c) The University of Glasgow 2004-2006 -- -- This module is just a bucket of types used in StgToCmm.Monad and -- StgToCmm.Closure. Its sole purpose is to break a cyclic dependency between -- StgToCmm.Monad and StgToCmm.Closure which derives from coupling around -- the BlockId and LocalReg types ----------------------------------------------------------------------------- module GHC.StgToCmm.Sequel ( Sequel(..) , SelfLoopInfo ) where import GHC.Cmm.BlockId import GHC.Cmm import GHC.Types.Id import GHC.Utils.Outputable import GHC.Prelude -------------------------------------------------------------------------------- -- | A Sequel tells what to do with the result of this expression data Sequel = Return -- ^ Return result(s) to continuation found on the stack. | AssignTo [LocalReg] -- ^ Put result(s) in these regs and fall through -- NB: no void arguments here -- Bool -- ^ Should we adjust the heap pointer back to recover -- space that's unused on this path? We need to do this -- only if the expression may allocate (e.g. it's a -- foreign call or allocating primOp) instance Outputable Sequel where ppr :: Sequel -> SDoc ppr Sequel Return = String -> SDoc text String "Return" ppr (AssignTo [LocalReg] regs Bool b) = String -> SDoc text String "AssignTo" SDoc -> SDoc -> SDoc <+> forall a. Outputable a => a -> SDoc ppr [LocalReg] regs SDoc -> SDoc -> SDoc <+> forall a. Outputable a => a -> SDoc ppr Bool b type SelfLoopInfo = (Id, BlockId, [LocalReg]) --------------------------------------------------------------------------------