----------------------------------------------------------------------------- -- -- 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.Types.Basic (RepArity) 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 Return = text "Return" ppr (AssignTo regs b) = text "AssignTo" <+> ppr regs <+> ppr b data SelfLoopInfo = MkSelfLoopInfo { sli_id :: !Id , sli_arity :: !RepArity -- ^ always equal to 'idFunRepArity' of sli_id, -- i.e. unarised arity, including void arguments , sli_registers :: ![LocalReg] -- ^ Excludes void arguments (LocalReg is never void) , sli_header_block :: !BlockId } --------------------------------------------------------------------------------