Commit 418175d3 authored by Michael D. Adams's avatar Michael D. Adams
Browse files

Make CmmProc take CmmFormals as argument

Since a CmmCall returns CmmFormals which may include
global registers (and indeed one place in the code
returns the results of a CmmCall into BaseReg) and
since CPS conversion will change those return slots
into formal arguments for the continuation of the call,
CmmProc has to have CmmFormals for the formal arguments.

Oddly, the old code never made use of procedure arguments
so this change only effects the types and not any of the code.
(Because [] is both of type [LocalReg] and CmmFormals.)
parent 77cc133d
...@@ -58,7 +58,7 @@ data GenCmmTop d i ...@@ -58,7 +58,7 @@ data GenCmmTop d i
= CmmProc = CmmProc
[d] -- Info table, may be empty [d] -- Info table, may be empty
CLabel -- Used to generate both info & entry labels CLabel -- Used to generate both info & entry labels
[LocalReg] -- Argument locals live on entry (C-- procedure params) CmmFormals -- Argument locals live on entry (C-- procedure params)
[GenBasicBlock i] -- Code, may be empty. The first block is [GenBasicBlock i] -- Code, may be empty. The first block is
-- the entry point. The order is otherwise initially -- the entry point. The order is otherwise initially
-- unimportant, but at some point the code gen will -- unimportant, but at some point the code gen will
...@@ -132,10 +132,10 @@ data CmmStmt ...@@ -132,10 +132,10 @@ data CmmStmt
-- Undefined outside range, and when there's a Nothing -- Undefined outside range, and when there's a Nothing
| CmmJump CmmExpr -- Jump to another function, | CmmJump CmmExpr -- Jump to another function,
CmmActuals -- with these parameters. CmmActuals -- with these parameters.
| CmmReturn -- Return from a function, | CmmReturn -- Return from a function,
CmmActuals -- with these return values. CmmActuals -- with these return values.
type CmmActuals = [(CmmExpr,MachHint)] type CmmActuals = [(CmmExpr,MachHint)]
type CmmFormals = [(CmmReg,MachHint)] type CmmFormals = [(CmmReg,MachHint)]
......
...@@ -80,6 +80,9 @@ instance Outputable CmmExpr where ...@@ -80,6 +80,9 @@ instance Outputable CmmExpr where
instance Outputable CmmReg where instance Outputable CmmReg where
ppr e = pprReg e ppr e = pprReg e
instance Outputable LocalReg where
ppr e = pprLocalReg e
instance Outputable GlobalReg where instance Outputable GlobalReg where
ppr e = pprGlobalReg e ppr e = pprGlobalReg e
...@@ -96,7 +99,7 @@ pprCmm (Cmm tops) = vcat $ intersperse (text "") $ map pprTop tops ...@@ -96,7 +99,7 @@ pprCmm (Cmm tops) = vcat $ intersperse (text "") $ map pprTop tops
pprTop :: CmmTop -> SDoc pprTop :: CmmTop -> SDoc
pprTop (CmmProc info lbl params blocks ) pprTop (CmmProc info lbl params blocks )
= vcat [ pprCLabel lbl <> parens (commafy $ map pprLocalReg params) <+> lbrace = vcat [ pprCLabel lbl <> parens (commafy $ map ppr params) <+> lbrace
, nest 8 $ pprInfo info lbl , nest 8 $ pprInfo info lbl
, nest 4 $ vcat (map ppr blocks) , nest 4 $ vcat (map ppr blocks)
, rbrace ] , rbrace ]
......
...@@ -70,7 +70,7 @@ import Constants ...@@ -70,7 +70,7 @@ import Constants
-- --
-- See includes/InfoTables.h -- See includes/InfoTables.h
emitClosureCodeAndInfoTable :: ClosureInfo -> [LocalReg] -> CgStmts -> Code emitClosureCodeAndInfoTable :: ClosureInfo -> CmmFormals -> CgStmts -> Code
emitClosureCodeAndInfoTable cl_info args body emitClosureCodeAndInfoTable cl_info args body
= do { ty_descr_lit <- = do { ty_descr_lit <-
if opt_SccProfilingOn if opt_SccProfilingOn
...@@ -396,7 +396,7 @@ emitInfoTableAndCode ...@@ -396,7 +396,7 @@ emitInfoTableAndCode
:: CLabel -- Label of info table :: CLabel -- Label of info table
-> [CmmLit] -- ...its invariant part -> [CmmLit] -- ...its invariant part
-> [CmmLit] -- ...and its variant part -> [CmmLit] -- ...and its variant part
-> [LocalReg] -- ...args -> CmmFormals -- ...args
-> [CmmBasicBlock] -- ...and body -> [CmmBasicBlock] -- ...and body
-> Code -> Code
......
...@@ -730,7 +730,7 @@ emitData sect lits ...@@ -730,7 +730,7 @@ emitData sect lits
where where
data_block = CmmData sect lits data_block = CmmData sect lits
emitProc :: [CmmLit] -> CLabel -> [LocalReg] -> [CmmBasicBlock] -> Code emitProc :: [CmmLit] -> CLabel -> CmmFormals -> [CmmBasicBlock] -> Code
emitProc lits lbl args blocks emitProc lits lbl args blocks
= do { let proc_block = CmmProc (map CmmStaticLit lits) lbl args blocks = do { let proc_block = CmmProc (map CmmStaticLit lits) lbl args blocks
; state <- getState ; state <- getState
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment