ghc-7.0.2: The GHC API




(<*>) :: AGraph m l -> AGraph m l -> AGraph m lSource

emptyAGraph :: AGraph m lSource

A graph is built up by splicing together graphs each containing a single node (where a label is considered a first node. The empty graph is a left and right unit for splicing. All of the AGraph constructors (even complex ones like mkIfThenElse, as well as the splicing operation *, are constant-time operations.

withFreshLabel :: String -> (BlockId -> AGraph m l) -> AGraph m lSource

This function provides access to fresh labels without requiring clients to be programmed monadically.

outOfLine :: (LastNode l, Outputable m, Outputable l) => AGraph m l -> AGraph m lSource

The argument is an AGraph that has an empty entry sequence and no exit sequence. The result is a new AGraph that has an empty entry sequence connected to an empty exit sequence, with the original graph sitting to the side out-of-line.

Example: mkMiddle (x = 3) * outOfLine (mkLabel L * ...stuff...) * mkMiddle (y = x) Control will flow directly from x=3 to y=x; the block starting with L is on the side.

N.B. algebraically forall g g' : g * outOfLine g' == outOfLine g' * g



:: AGraph m l 
-> UniqSM (LGraph m l)

allocate a fresh label for the entry point

graphOfAGraph :: AGraph m l -> UniqSM (Graph m l)Source

Converting an abstract graph to a concrete form is expensive: the cost is linear in the number of nodes in the answer, plus N log N in the number of basic blocks. The conversion is also monadic because it may require the allocation of fresh, unique labels.



:: BlockId 
-> AGraph m l 
-> UniqSM (LGraph m l)

use the given BlockId as the label of the entry point

data Transfer Source