ghc-7.0.2: The GHC API




data BrokenBlock Source

Similar to a CmmBlock with a little extra information to help the CPS analysis.




brokenBlockId :: BlockId

The block's label like a CmmBasicBlock

brokenBlockEntry :: BlockEntryInfo

Ways this block can be entered

brokenBlockStmts :: [CmmStmt]

Body like a CmmBasicBlock (but without the last statement)

brokenBlockTargets :: [BlockId]

Blocks that this block could branch to either by conditional branches or via the last statement

brokenBlockExit :: FinalStmt

The final statement of the block

data BlockEntryInfo Source

How a block could be entered See Note [An example of CPS conversion]


FunctionEntry CmmInfo CLabel CmmFormals

Block is the beginning of a function, parameters are: 1. Function header info 2. The function name 3. Aguments to function Only the formal parameters are live

ContinuationEntry CmmFormals C_SRT Bool

Return point of a function call, parameters are: 1. return values (argument to continuation) 2. SRT for the continuation's info table 3. True = GC block so ignore stack size Live variables, other than the return values, are on the stack


Any other kind of block. Only entered due to control flow.

data FinalStmt Source

Final statement in a BlokenBlock. Constructors and arguments match those in Cmm, but are restricted to branches, returns, jumps, calls and switches


FinalBranch BlockId

Same as CmmBranch. Target must be a ControlEntry

FinalReturn HintedCmmActuals

Same as CmmReturn. Parameter is the return values.

FinalJump CmmExpr HintedCmmActuals

Same as CmmJump. Parameters: 1. The function to call, 2. Arguments of the call

FinalCall BlockId CmmCallTarget HintedCmmFormals HintedCmmActuals C_SRT CmmReturnInfo Bool

Same as CmmCallee followed by CmmGoto. Parameters: 1. Target of the CmmGoto (must be a ContinuationEntry) 2. The function to call 3. Results from call (redundant with ContinuationEntry) 4. Arguments to call 5. SRT for the continuation's info table 6. Does the function return? 7. True = GC block so ignore stack size

FinalSwitch CmmExpr [Maybe BlockId]

Same as a CmmSwitch. Paremeters: 1. Scrutinee (zero based) 2. Targets



:: [BlockId]

Any GC blocks that should be special

-> [Unique]

An infinite list of uniques to create names of the new blocks with

-> CmmBasicBlock

Input block to break apart

-> BlockEntryInfo

Info for the first created BrokenBlock

-> ([(BlockId, ContFormat)], [BrokenBlock]) 

Takes a CmmBasicBlock and breaks it up into a list of BrokenBlock by splitting on each CmmCall in the CmmBasicBlock.

cmmBlockFromBrokenBlock :: BrokenBlock -> CmmBasicBlockSource

Convert from a BrokenBlock back to an equivalent CmmBasicBlock Needed by liveness analysis

blocksToBlockEnv :: [BrokenBlock] -> BlockEnv BrokenBlockSource

Build a mapping so we can lookup a BrokenBlock by its BlockId