ghc-9.6.3: The GHC API

Safe Haskell | Safe-Inferred
Language | Haskell2010

GHC.StgToCmm.Monad

Synopsis

- data FCode a
- initC :: IO CgState
- initFCodeState :: Platform -> FCodeState
- runC :: StgToCmmConfig -> FCodeState -> CgState -> FCode a -> (a, CgState)
- fixC :: (a -> FCode a) -> FCode a
- newUnique :: FCode Unique
- emitLabel :: BlockId -> FCode ()
- emit :: CmmAGraph -> FCode ()
- emitDecl :: CmmDecl -> FCode ()
- emitProcWithConvention :: Convention -> Maybe CmmInfoTable -> CLabel -> [CmmFormal] -> CmmAGraphScoped -> FCode ()
- emitProcWithStackFrame :: Convention -> Maybe CmmInfoTable -> CLabel -> [CmmFormal] -> [CmmFormal] -> CmmAGraphScoped -> Bool -> FCode ()
- emitOutOfLine :: BlockId -> CmmAGraphScoped -> FCode ()
- emitAssign :: CmmReg -> CmmExpr -> FCode ()
- emitStore :: CmmExpr -> CmmExpr -> FCode ()
- emitStore' :: AlignmentSpec -> CmmExpr -> CmmExpr -> FCode ()
- emitComment :: FastString -> FCode ()
- emitTick :: CmmTickish -> FCode ()
- emitUnwind :: [(GlobalReg, Maybe CmmExpr)] -> FCode ()
- newTemp :: MonadUnique m => CmmType -> m LocalReg
- getCmm :: FCode a -> FCode (a, CmmGroup)
- aGraphToGraph :: CmmAGraphScoped -> FCode CmmGraph
- getPlatform :: FCode Platform
- getProfile :: FCode Profile
- getCodeR :: FCode a -> FCode (a, CmmAGraph)
- getCode :: FCode a -> FCode CmmAGraph
- getCodeScoped :: FCode a -> FCode (a, CmmAGraphScoped)
- getHeapUsage :: (VirtualHpOffset -> FCode a) -> FCode a
- getContext :: FCode SDocContext
- mkCmmIfThenElse :: CmmExpr -> CmmAGraph -> CmmAGraph -> FCode CmmAGraph
- mkCmmIfThen :: CmmExpr -> CmmAGraph -> FCode CmmAGraph
- mkCmmIfGoto :: CmmExpr -> BlockId -> FCode CmmAGraph
- mkCmmIfThenElse' :: CmmExpr -> CmmAGraph -> CmmAGraph -> Maybe Bool -> FCode CmmAGraph
- mkCmmIfThen' :: CmmExpr -> CmmAGraph -> Maybe Bool -> FCode CmmAGraph
- mkCmmIfGoto' :: CmmExpr -> BlockId -> Maybe Bool -> FCode CmmAGraph
- mkCall :: CmmExpr -> (Convention, Convention) -> [CmmFormal] -> [CmmExpr] -> UpdFrameOffset -> [CmmExpr] -> FCode CmmAGraph
- mkCmmCall :: CmmExpr -> [CmmFormal] -> [CmmExpr] -> UpdFrameOffset -> FCode CmmAGraph
- forkClosureBody :: FCode () -> FCode ()
- forkLneBody :: FCode a -> FCode a
- forkAlts :: [FCode a] -> FCode [a]
- forkAltPair :: FCode a -> FCode a -> FCode (a, a)
- codeOnly :: FCode () -> FCode ()
- type ConTagZ = Int
- data Sequel
  - = Return
  - | AssignTo [LocalReg] Bool
- data ReturnKind
  - = AssignedDirectly
  - | ReturnedTo BlockId ByteOff
- withSequel :: Sequel -> FCode a -> FCode a
- getSequel :: FCode Sequel
- setTickyCtrLabel :: CLabel -> FCode a -> FCode a
- getTickyCtrLabel :: FCode CLabel
- tickScope :: FCode a -> FCode a
- getTickScope :: FCode CmmTickScope
- withUpdFrameOff :: UpdFrameOffset -> FCode a -> FCode a
- getUpdFrameOff :: FCode UpdFrameOffset
- data HeapUsage = HeapUsage {
  - virtHp :: VirtualHpOffset
  - realHp :: VirtualHpOffset
  }
- type VirtualHpOffset = WordOff
- initHpUsage :: HeapUsage
- getHpUsage :: FCode HeapUsage
- setHpUsage :: HeapUsage -> FCode ()
- heapHWM :: HeapUsage -> VirtualHpOffset
- setVirtHp :: VirtualHpOffset -> FCode ()
- getVirtHp :: FCode VirtualHpOffset
- setRealHp :: VirtualHpOffset -> FCode ()
- getModuleName :: FCode Module
- getState :: FCode CgState
- setState :: CgState -> FCode ()
- getSelfLoop :: FCode (Maybe SelfLoopInfo)
- withSelfLoop :: SelfLoopInfo -> FCode a -> FCode a
- getStgToCmmConfig :: FCode StgToCmmConfig
- data CgIdInfo = CgIdInfo {
  - cg_id :: Id
  - cg_lf :: LambdaFormInfo
  - cg_loc :: CgLoc
  }
- getBinds :: FCode CgBindings
- setBinds :: CgBindings -> FCode ()
- data StgToCmmConfig = StgToCmmConfig {
  - stgToCmmProfile :: !Profile
  - stgToCmmThisModule :: Module
  - stgToCmmTmpDir :: !TempDir
  - stgToCmmContext :: !SDocContext
  - stgToCmmEmitDebugInfo :: !Bool
  - stgToCmmBinBlobThresh :: !(Maybe Word)
  - stgToCmmMaxInlAllocSize :: !Int
  - stgToCmmDoTicky :: !Bool
  - stgToCmmTickyAllocd :: !Bool
  - stgToCmmTickyLNE :: !Bool
  - stgToCmmTickyDynThunk :: !Bool
  - stgToCmmTickyTag :: !Bool
  - stgToCmmLoopification :: !Bool
  - stgToCmmAlignCheck :: !Bool
  - stgToCmmOptHpc :: !Bool
  - stgToCmmFastPAPCalls :: !Bool
  - stgToCmmSCCProfiling :: !Bool
  - stgToCmmEagerBlackHole :: !Bool
  - stgToCmmInfoTableMap :: !Bool
  - stgToCmmInfoTableMapWithFallback :: !Bool
  - stgToCmmInfoTableMapWithStack :: !Bool
  - stgToCmmOmitYields :: !Bool
  - stgToCmmOmitIfPragmas :: !Bool
  - stgToCmmPIC :: !Bool
  - stgToCmmPIE :: !Bool
  - stgToCmmExtDynRefs :: !Bool
  - stgToCmmDoBoundsCheck :: !Bool
  - stgToCmmDoTagCheck :: !Bool
  - stgToCmmAllowBigArith :: !Bool
  - stgToCmmAllowQuotRemInstr :: !Bool
  - stgToCmmAllowQuotRem2 :: !Bool
  - stgToCmmAllowExtendedAddSubInstrs :: !Bool
  - stgToCmmAllowIntMul2Instr :: !Bool
  - stgToCmmTickyAP :: !Bool
  - stgToCmmVecInstrsErr :: Maybe String
  - stgToCmmAvx :: !Bool
  - stgToCmmAvx2 :: !Bool
  - stgToCmmAvx512f :: !Bool
  }
- data CgState = MkCgState {
  - cgs_stmts :: CmmAGraph
  - cgs_tops :: OrdList CmmDecl
  - cgs_binds :: CgBindings
  - cgs_hp_usg :: HeapUsage
  - cgs_uniqs :: UniqSupply
  }

# Documentation

data FCode a Source #

#### Instances

Instances details

Applicative FCode Source # |
Instance details Defined in GHC.StgToCmm.Monad Methods pure :: a -> FCode a Source # (<*>) :: FCode (a -> b) -> FCode a -> FCode b Source # liftA2 :: (a -> b -> c) -> FCode a -> FCode b -> FCode c Source # (*>) :: FCode a -> FCode b -> FCode b Source # (<*) :: FCode a -> FCode b -> FCode a Source #
Functor FCode Source # |
Instance details Defined in GHC.StgToCmm.Monad Methods fmap :: (a -> b) -> FCode a -> FCode b Source # (<$) :: a -> FCode b -> FCode a Source #
Monad FCode Source # |
Instance details Defined in GHC.StgToCmm.Monad Methods (>>=) :: FCode a -> (a -> FCode b) -> FCode b Source # (>>) :: FCode a -> FCode b -> FCode b Source # return :: a -> FCode a Source #
MonadUnique FCode Source # |
Instance details Defined in GHC.StgToCmm.Monad Methods getUniqueSupplyM :: FCode UniqSupply Source # getUniqueM :: FCode Unique Source # getUniquesM :: FCode [Unique] Source #

initC :: IO CgState Source #

initFCodeState :: Platform -> FCodeState Source #

runC :: StgToCmmConfig -> FCodeState -> CgState -> FCode a -> (a, CgState) Source #

fixC :: (a -> FCode a) -> FCode a Source #

newUnique :: FCode Unique Source #

emitLabel :: BlockId -> FCode () Source #

emit :: CmmAGraph -> FCode () Source #

emitDecl :: CmmDecl -> FCode () Source #

emitProcWithConvention :: Convention -> Maybe CmmInfoTable -> CLabel -> [CmmFormal] -> CmmAGraphScoped -> FCode () Source #

emitProcWithStackFrame :: Convention -> Maybe CmmInfoTable -> CLabel -> [CmmFormal] -> [CmmFormal] -> CmmAGraphScoped -> Bool -> FCode () Source #

emitOutOfLine :: BlockId -> CmmAGraphScoped -> FCode () Source #

emitAssign :: CmmReg -> CmmExpr -> FCode () Source #

emitStore :: CmmExpr -> CmmExpr -> FCode () Source #

Assumes natural alignment.

emitStore' :: AlignmentSpec -> CmmExpr -> CmmExpr -> FCode () Source #

emitComment :: FastString -> FCode () Source #

emitTick :: CmmTickish -> FCode () Source #

emitUnwind :: [(GlobalReg, Maybe CmmExpr)] -> FCode () Source #

newTemp :: MonadUnique m => CmmType -> m LocalReg Source #

getCmm :: FCode a -> FCode (a, CmmGroup) Source #

aGraphToGraph :: CmmAGraphScoped -> FCode CmmGraph Source #

getPlatform :: FCode Platform Source #

getProfile :: FCode Profile Source #

getCodeR :: FCode a -> FCode (a, CmmAGraph) Source #

getCode :: FCode a -> FCode CmmAGraph Source #

getCodeScoped :: FCode a -> FCode (a, CmmAGraphScoped) Source #

Generate code into a fresh tick (sub-)scope and gather generated code

getHeapUsage :: (VirtualHpOffset -> FCode a) -> FCode a Source #

getContext :: FCode SDocContext Source #

mkCmmIfThenElse :: CmmExpr -> CmmAGraph -> CmmAGraph -> FCode CmmAGraph Source #

mkCmmIfThen :: CmmExpr -> CmmAGraph -> FCode CmmAGraph Source #

mkCmmIfGoto :: CmmExpr -> BlockId -> FCode CmmAGraph Source #

mkCmmIfThenElse' :: CmmExpr -> CmmAGraph -> CmmAGraph -> Maybe Bool -> FCode CmmAGraph Source #

mkCmmIfThen' :: CmmExpr -> CmmAGraph -> Maybe Bool -> FCode CmmAGraph Source #

mkCmmIfGoto' :: CmmExpr -> BlockId -> Maybe Bool -> FCode CmmAGraph Source #

mkCall :: CmmExpr -> (Convention, Convention) -> [CmmFormal] -> [CmmExpr] -> UpdFrameOffset -> [CmmExpr] -> FCode CmmAGraph Source #

mkCmmCall :: CmmExpr -> [CmmFormal] -> [CmmExpr] -> UpdFrameOffset -> FCode CmmAGraph Source #

forkClosureBody :: FCode () -> FCode () Source #

forkLneBody :: FCode a -> FCode a Source #

forkAlts :: [FCode a] -> FCode [a] Source #

forkAltPair :: FCode a -> FCode a -> FCode (a, a) Source #

codeOnly :: FCode () -> FCode () Source #

type ConTagZ = Int Source #

A *zero-indexed* constructor tag

data Sequel Source #

A Sequel tells what to do with the result of this expression

Constructors

Return | Return result(s) to continuation found on the stack.
AssignTo |

Fields

- [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)

#### Instances

Instances details

Outputable Sequel Source # |
Instance details Defined in GHC.StgToCmm.Sequel Methods ppr :: Sequel -> SDoc Source #

data ReturnKind Source #

Constructors

AssignedDirectly |
ReturnedTo BlockId ByteOff |

withSequel :: Sequel -> FCode a -> FCode a Source #

getSequel :: FCode Sequel Source #

setTickyCtrLabel :: CLabel -> FCode a -> FCode a Source #

getTickyCtrLabel :: FCode CLabel Source #

tickScope :: FCode a -> FCode a Source #

Places blocks generated by the given code into a fresh (sub-)scope. This will make sure that Cmm annotations in our scope will apply to the Cmm blocks generated therein - but not the other way around.

getTickScope :: FCode CmmTickScope Source #

The current tick scope. We will assign this to generated blocks.

withUpdFrameOff :: UpdFrameOffset -> FCode a -> FCode a Source #

getUpdFrameOff :: FCode UpdFrameOffset Source #

data HeapUsage Source #

Constructors

HeapUsage |

Fields

- virtHp :: VirtualHpOffset
- realHp :: VirtualHpOffset

type VirtualHpOffset = WordOff Source #

initHpUsage :: HeapUsage Source #

getHpUsage :: FCode HeapUsage Source #

setHpUsage :: HeapUsage -> FCode () Source #

heapHWM :: HeapUsage -> VirtualHpOffset Source #

setVirtHp :: VirtualHpOffset -> FCode () Source #

getVirtHp :: FCode VirtualHpOffset Source #

setRealHp :: VirtualHpOffset -> FCode () Source #

getModuleName :: FCode Module Source #

getState :: FCode CgState Source #

setState :: CgState -> FCode () Source #

getSelfLoop :: FCode (Maybe SelfLoopInfo) Source #

withSelfLoop :: SelfLoopInfo -> FCode a -> FCode a Source #

getStgToCmmConfig :: FCode StgToCmmConfig Source #

data CgIdInfo Source #

Constructors

CgIdInfo |

Fields

- cg_id :: Id

  Id that this is the info for

- cg_lf :: LambdaFormInfo
- cg_loc :: CgLoc

  `CmmExpr` for the *tagged* value

#### Instances

Instances details

OutputableP Platform CgIdInfo Source # |
Instance details Defined in GHC.StgToCmm.Monad Methods pdoc :: Platform -> CgIdInfo -> SDoc Source #

getBinds :: FCode CgBindings Source #

setBinds :: CgBindings -> FCode () Source #

data StgToCmmConfig Source #

Constructors

StgToCmmConfig |

Fields

- stgToCmmProfile :: !Profile

  Current profile

- stgToCmmThisModule :: Module

  The module being compiled. This field kept lazy for Cmm/Parser.y which preloads it with a panic

- stgToCmmTmpDir :: !TempDir

  Temp Dir for files used in compilation

- stgToCmmContext :: !SDocContext

  Context for StgToCmm phase

- stgToCmmEmitDebugInfo :: !Bool

  Whether we wish to output debug information

- stgToCmmBinBlobThresh :: !(Maybe Word)

  Threshold at which Binary literals (e.g. strings) are either dumped to a file and a CmmFileEmbed literal is emitted (over threshold), or become a CmmString Literal (under or at threshold). CmmFileEmbed is only supported with the NCG, thus a Just means two things: We have a threshold, and will be using the NCG. Conversely, a Nothing implies we are not using NCG and disables CmmFileEmbed. See Note [Embedding large binary blobs] in GHC.CmmToAsm.Ppr, and `cgTopBinding` in GHC.StgToCmm.

- stgToCmmMaxInlAllocSize :: !Int

  Max size, in bytes, of inline array allocations.

- stgToCmmDoTicky :: !Bool

  Ticky profiling enabled (cf `-ticky`)

- stgToCmmTickyAllocd :: !Bool

  True indicates ticky prof traces allocs of each named thing in addition to allocs _by_ that thing

- stgToCmmTickyLNE :: !Bool

  True indicates ticky uses name-specific counters for join-points (let-no-escape)

- stgToCmmTickyDynThunk :: !Bool

  True indicates ticky uses name-specific counters for dynamic thunks

- stgToCmmTickyTag :: !Bool

  True indicates ticky will count number of avoided tag checks by tag inference.

- stgToCmmLoopification :: !Bool

  Loopification enabled (cf `-floopification`)

- stgToCmmAlignCheck :: !Bool

  Insert alignment check (cf `-falignment-sanitisation`)

- stgToCmmOptHpc :: !Bool

  perform code generation for code coverage

- stgToCmmFastPAPCalls :: !Bool
- stgToCmmSCCProfiling :: !Bool

  Check if cost-centre profiling is enabled

- stgToCmmEagerBlackHole :: !Bool
- stgToCmmInfoTableMap :: !Bool

  true means generate C Stub for IPE map, See Note [Mapping Info Tables to Source Positions]

- stgToCmmInfoTableMapWithFallback :: !Bool

  Include info tables with fallback source locations in the info table map

- stgToCmmInfoTableMapWithStack :: !Bool

  Include info tables for STACK closures in the info table map

- stgToCmmOmitYields :: !Bool

  true means omit heap checks when no allocation is performed

- stgToCmmOmitIfPragmas :: !Bool

  true means don't generate interface programs (implied by -O0)

- stgToCmmPIC :: !Bool

  true if `-fPIC`

- stgToCmmPIE :: !Bool

  true if `-fPIE`

- stgToCmmExtDynRefs :: !Bool

  true if `-fexternal-dynamic-refs`, meaning generate code for linking against dynamic libraries

- stgToCmmDoBoundsCheck :: !Bool

  decides whether to check array bounds in StgToCmm.Prim or not

- stgToCmmDoTagCheck :: !Bool

  Verify tag inference predictions.

- stgToCmmAllowBigArith :: !Bool

  Allowed to emit larger than native size arithmetic (only LLVM and C backends)

- stgToCmmAllowQuotRemInstr :: !Bool

  Allowed to generate QuotRem instructions

- stgToCmmAllowQuotRem2 :: !Bool

  Allowed to generate QuotRem

- stgToCmmAllowExtendedAddSubInstrs :: !Bool

  Allowed to generate AddWordC, SubWordC, Add2, etc.

- stgToCmmAllowIntMul2Instr :: !Bool

  Allowed to generate IntMul2 instruction

- stgToCmmTickyAP :: !Bool

  Disable use of precomputed standard thunks.

- stgToCmmVecInstrsErr :: Maybe String

  Error (if any) to raise when vector instructions are used, see `StgToCmm.Prim.checkVecCompatibility`

- stgToCmmAvx :: !Bool

  check for Advanced Vector Extensions

- stgToCmmAvx2 :: !Bool

  check for Advanced Vector Extensions 2

- stgToCmmAvx512f :: !Bool

  check for Advanced Vector 512-bit Extensions

data CgState Source #

Constructors

MkCgState |

Fields

- cgs_stmts :: CmmAGraph
- cgs_tops :: OrdList CmmDecl
- cgs_binds :: CgBindings
- cgs_hp_usg :: HeapUsage
- cgs_uniqs :: UniqSupply