-----------------------------------------------------------------------------
--
-- 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 :: Sequel -> SDoc
ppr Sequel
Return = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"Return"
    ppr (AssignTo [LocalReg]
regs Bool
b) = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"AssignTo" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> [LocalReg] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [LocalReg]
regs SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Bool -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bool
b

data SelfLoopInfo = MkSelfLoopInfo
  { SelfLoopInfo -> Id
sli_id :: !Id
  , SelfLoopInfo -> RepArity
sli_arity :: !RepArity
    -- ^ always equal to 'idFunRepArity' of sli_id,
    -- i.e. unarised arity, including void arguments
  , SelfLoopInfo -> [LocalReg]
sli_registers :: ![LocalReg]
    -- ^ Excludes void arguments (LocalReg is never void)
  , SelfLoopInfo -> BlockId
sli_header_block :: !BlockId
  }

--------------------------------------------------------------------------------