ghc-6.10.1: The GHC APIContentsIndex
CmmBrokenBlock
Synopsis
data BrokenBlock = BrokenBlock {
brokenBlockId :: BlockId
brokenBlockEntry :: BlockEntryInfo
brokenBlockStmts :: [CmmStmt]
brokenBlockTargets :: [BlockId]
brokenBlockExit :: FinalStmt
}
data BlockEntryInfo
= FunctionEntry CmmInfo CLabel CmmFormalsWithoutKinds
| ContinuationEntry CmmFormalsWithoutKinds C_SRT Bool
| ControlEntry
data FinalStmt
= FinalBranch BlockId
| FinalReturn CmmActuals
| FinalJump CmmExpr CmmActuals
| FinalCall BlockId CmmCallTarget CmmFormals CmmActuals C_SRT CmmReturnInfo Bool
| FinalSwitch CmmExpr [Maybe BlockId]
breakBlock :: [BlockId] -> [Unique] -> CmmBasicBlock -> BlockEntryInfo -> ([(BlockId, ContFormat)], [BrokenBlock])
cmmBlockFromBrokenBlock :: BrokenBlock -> CmmBasicBlock
blocksToBlockEnv :: [BrokenBlock] -> BlockEnv BrokenBlock
adaptBlockToFormat :: [(BlockId, ContFormat)] -> Unique -> BrokenBlock -> [BrokenBlock]
selectContinuations :: [(BlockId, ContFormat)] -> [(BlockId, ContFormat)]
data ContFormat
Documentation
data BrokenBlock
Similar to a CmmBlock with a little extra information to help the CPS analysis.
Constructors
BrokenBlock
brokenBlockId :: BlockIdThe block's label like a CmmBasicBlock
brokenBlockEntry :: BlockEntryInfoWays 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 :: FinalStmtThe final statement of the block
data BlockEntryInfo
How a block could be entered See Note [An example of CPS conversion]
Constructors
FunctionEntry CmmInfo CLabel CmmFormalsWithoutKindsBlock 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 CmmFormalsWithoutKinds C_SRT BoolReturn 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
ControlEntryAny other kind of block. Only entered due to control flow.
data FinalStmt
Final statement in a BlokenBlock. Constructors and arguments match those in Cmm, but are restricted to branches, returns, jumps, calls and switches
Constructors
FinalBranch BlockIdSame as CmmBranch. Target must be a ControlEntry
FinalReturn CmmActualsSame as CmmReturn. Parameter is the return values.
FinalJump CmmExpr CmmActualsSame as CmmJump. Parameters: 1. The function to call, 2. Arguments of the call
FinalCall BlockId CmmCallTarget CmmFormals CmmActuals C_SRT CmmReturnInfo BoolSame 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
breakBlock
:: [BlockId]Any GC blocks that should be special
-> [Unique]An infinite list of uniques to create names of the new blocks with
-> CmmBasicBlockInput block to break apart
-> BlockEntryInfoInfo 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 -> CmmBasicBlock
Convert from a BrokenBlock back to an equivalent CmmBasicBlock Needed by liveness analysis
blocksToBlockEnv :: [BrokenBlock] -> BlockEnv BrokenBlock
Build a mapping so we can lookup a BrokenBlock by its BlockId
adaptBlockToFormat :: [(BlockId, ContFormat)] -> Unique -> BrokenBlock -> [BrokenBlock]
selectContinuations :: [(BlockId, ContFormat)] -> [(BlockId, ContFormat)]
data ContFormat
show/hide Instances
Produced by Haddock version 2.3.0