ghc-lib-0.20210228: The GHC API, decoupled from GHC versions
Safe HaskellNone
LanguageHaskell2010

GHC.Cmm.Graph

Synopsis

Documentation

type CmmAGraph = OrdList CgStmt Source #

CmmAGraph is a chunk of code consisting of:

  • ordinary statements (assignments, stores etc.)
  • jumps
  • labels
  • out-of-line labelled blocks

The semantics is that control falls through labels and out-of-line blocks. Everything after a jump up to the next label is by definition unreachable code, and will be discarded.

Two CmmAGraphs can be stuck together with *, with the meaning that control flows from the first to the second.

A CmmAGraph can be turned into a CmmGraph (closed at both ends) by providing a label for the entry point and a tick scope; see labelAGraph.

type CmmAGraphScoped = (CmmAGraph, CmmTickScope) Source #

Unlabeled graph with tick scope

data CgStmt Source #

Constructors

CgLabel BlockId CmmTickScope 
CgStmt (CmmNode O O) 
CgLast (CmmNode O C) 
CgFork BlockId CmmAGraph CmmTickScope 

mkLabel :: BlockId -> CmmTickScope -> CmmAGraph Source #

creates a sequence "goto id; id:" as an AGraph

mkMiddle :: CmmNode O O -> CmmAGraph Source #

creates an open AGraph from a given node

mkLast :: CmmNode O C -> CmmAGraph Source #

creates a closed AGraph from a given node

outOfLine :: BlockId -> CmmAGraphScoped -> CmmAGraph Source #

A labelled code block; should end in a last node

lgraphOfAGraph :: CmmAGraphScoped -> UniqSM CmmGraph Source #

allocate a fresh label for the entry point

labelAGraph :: BlockId -> CmmAGraphScoped -> CmmGraph Source #

use the given BlockId as the label of the entry point

stackStubExpr :: Width -> CmmExpr Source #

mkAssign :: CmmReg -> CmmExpr -> CmmAGraph Source #

mkStore :: CmmExpr -> CmmExpr -> CmmAGraph Source #

mkUnsafeCall :: ForeignTarget -> [CmmFormal] -> [CmmActual] -> CmmAGraph Source #

mkFinalCall :: Profile -> CmmExpr -> CCallConv -> [CmmExpr] -> UpdFrameOffset -> CmmAGraph Source #

mkCallReturnsTo :: Profile -> CmmExpr -> Convention -> [CmmExpr] -> BlockId -> ByteOff -> UpdFrameOffset -> [CmmExpr] -> CmmAGraph Source #

mkJumpReturnsTo :: Profile -> CmmExpr -> Convention -> [CmmExpr] -> BlockId -> ByteOff -> UpdFrameOffset -> CmmAGraph Source #

mkJump :: Profile -> Convention -> CmmExpr -> [CmmExpr] -> UpdFrameOffset -> CmmAGraph Source #

mkJumpExtra :: Profile -> Convention -> CmmExpr -> [CmmExpr] -> UpdFrameOffset -> [CmmExpr] -> CmmAGraph Source #

mkRawJump :: Profile -> CmmExpr -> UpdFrameOffset -> [GlobalReg] -> CmmAGraph Source #

A jump where the caller says what the live GlobalRegs are. Used for low-level hand-written Cmm.

mkCbranch :: CmmExpr -> BlockId -> BlockId -> Maybe Bool -> CmmAGraph Source #

mkSwitch :: CmmExpr -> SwitchTargets -> CmmAGraph Source #

mkReturn :: Profile -> CmmExpr -> [CmmExpr] -> UpdFrameOffset -> CmmAGraph Source #

mkComment :: FastString -> CmmAGraph Source #

mkCallEntry :: Profile -> Convention -> [CmmFormal] -> [CmmFormal] -> (Int, [GlobalReg], CmmAGraph) Source #

mkBranch :: BlockId -> CmmAGraph Source #

mkUnwind :: GlobalReg -> CmmExpr -> CmmAGraph Source #

Construct a CmmUnwind node for the given register and unwinding expression.

copyInOflow :: Profile -> Convention -> Area -> [CmmFormal] -> [CmmFormal] -> (Int, [GlobalReg], CmmAGraph) Source #

copyOutOflow :: Profile -> Convention -> Transfer -> Area -> [CmmExpr] -> UpdFrameOffset -> [CmmExpr] -> (Int, [GlobalReg], CmmAGraph) Source #

noExtraStack :: [CmmExpr] Source #

toCall :: CmmExpr -> Maybe BlockId -> UpdFrameOffset -> ByteOff -> ByteOff -> [GlobalReg] -> CmmAGraph Source #

data Transfer Source #

Constructors

Call 
JumpRet 
Jump 
Ret 

Instances

Instances details
Eq Transfer Source # 
Instance details

Defined in GHC.Cmm.Graph