1 {-# OPTIONS -Wall -fno-warn-name-shadowing #-}
3 -- This is the module to import to be able to build C-- programs.
4 -- It should not be necessary to import MkZipCfg or ZipCfgCmmRep.
5 -- If you find it necessary to import these other modules, please
6 -- complain to Norman Ramsey.
9 ( mkNop, mkAssign, mkStore, mkCall, mkUnsafeCall, mkFinalCall
10 , mkJump, mkCbranch, mkSwitch, mkReturn, mkComment, mkCmmIfThenElse
12 , (<*>), mkLabel, mkBranch
13 , emptyAGraph, withFreshLabel, withUnique, outOfLine
14 , lgraphOfAGraph, graphOfAGraph, labelAGraph
15 , CmmZ, CmmTopZ, CmmGraph, CmmBlock, CmmAGraph, Middle, Last, Convention(..)
19 #include "HsVersions.h"
22 import Cmm ( GenCmm(..), GenCmmTop(..), CmmStatic, CmmInfo
23 , CmmCallTarget(..), CmmActuals, CmmFormals
25 import ZipCfgCmmRep hiding (CmmGraph, CmmAGraph, CmmBlock, CmmZ, CmmTopZ)
26 -- ^ to make this module more self-contained, these definitions are duplicated below
35 type CmmGraph = LGraph Middle Last
36 type CmmAGraph = AGraph Middle Last
37 type CmmBlock = Block Middle Last
38 type CmmZ = GenCmm CmmStatic CmmInfo CmmGraph
39 type CmmTopZ = GenCmmTop CmmStatic CmmInfo CmmGraph
42 mkAssign :: CmmReg -> CmmExpr -> CmmAGraph
43 mkStore :: CmmExpr -> CmmExpr -> CmmAGraph
44 mkCall :: CmmExpr -> CCallConv -> CmmFormals -> CmmActuals -> C_SRT -> CmmAGraph
45 mkUnsafeCall :: CmmCallTarget -> CmmFormals -> CmmActuals -> CmmAGraph
46 mkFinalCall :: CmmExpr -> CCallConv -> CmmActuals -> CmmAGraph -- never returns
47 mkJump :: CmmExpr -> CmmActuals -> CmmAGraph
48 mkCbranch :: CmmExpr -> BlockId -> BlockId -> CmmAGraph
49 mkSwitch :: CmmExpr -> [Maybe BlockId] -> CmmAGraph
50 mkReturn :: CmmActuals -> CmmAGraph
51 mkComment :: FastString -> CmmAGraph
53 -- Not to be forgotten, but exported by MkZipCfg:
54 --mkBranch :: BlockId -> CmmAGraph
55 --mkLabel :: BlockId -> CmmAGraph
56 mkCmmIfThenElse :: CmmExpr -> CmmAGraph -> CmmAGraph -> CmmAGraph
57 mkCmmWhileDo :: CmmExpr -> CmmAGraph -> CmmAGraph
59 --------------------------------------------------------------------------
61 mkCmmIfThenElse e = mkIfThenElse (mkCbranch e)
62 mkCmmWhileDo e = mkWhileDo (mkCbranch e)
65 -- ================ IMPLEMENTATION ================--
67 mkNop = mkMiddle $ MidNop
68 mkComment fs = mkMiddle $ MidComment fs
69 mkAssign l r = mkMiddle $ MidAssign l r
70 mkStore l r = mkMiddle $ MidStore l r
72 mkCbranch pred ifso ifnot = mkLast $ LastCondBranch pred ifso ifnot
73 mkSwitch e tbl = mkLast $ LastSwitch e tbl
75 mkUnsafeCall tgt results actuals = mkMiddle $ MidUnsafeCall tgt results actuals
77 cmmArgConv, cmmResConv :: Convention
78 cmmArgConv = ConventionStandard CmmCallConv Arguments
79 cmmResConv = ConventionStandard CmmCallConv Arguments
81 mkJump e actuals = mkMiddle (CopyOut cmmArgConv actuals) <*> mkLast (LastJump e)
82 mkReturn actuals = mkMiddle (CopyOut cmmResConv actuals) <*> mkLast LastReturn
84 mkFinalCall f conv actuals =
85 mkMiddle (CopyOut (ConventionStandard conv Arguments) actuals) <*>
86 mkLast (LastCall f Nothing)
88 mkCall f conv results actuals srt =
89 withFreshLabel "call successor" $ \k ->
90 mkMiddle (CopyOut (ConventionStandard conv Arguments) actuals) <*>
91 mkLast (LastCall f (Just k)) <*>
93 mkMiddle (CopyIn (ConventionStandard conv Results) results srt)