projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Derive some Typeable instances
[ghc-hetmet.git]
/
compiler
/
codeGen
/
CgMonad.lhs
diff --git
a/compiler/codeGen/CgMonad.lhs
b/compiler/codeGen/CgMonad.lhs
index
d40c511
..
8a3b664
100644
(file)
--- a/
compiler/codeGen/CgMonad.lhs
+++ b/
compiler/codeGen/CgMonad.lhs
@@
-13,7
+13,7
@@
module CgMonad (
FCode, -- type
initC, thenC, thenFC, listCs, listFCs, mapCs, mapFCs,
FCode, -- type
initC, thenC, thenFC, listCs, listFCs, mapCs, mapFCs,
- returnFC, fixC, checkedAbsC,
+ returnFC, fixC, fixC_, checkedAbsC,
stmtC, stmtsC, labelC, emitStmts, nopC, whenC, newLabelC,
newUnique, newUniqSupply,
stmtC, stmtsC, labelC, emitStmts, nopC, whenC, newLabelC,
newUnique, newUniqSupply,
@@
-47,7
+47,7
@@
module CgMonad (
Sequel(..), -- ToDo: unabstract?
-- ideally we wouldn't export these, but some other modules access internal state
Sequel(..), -- ToDo: unabstract?
-- ideally we wouldn't export these, but some other modules access internal state
- getState, setState, getInfoDown, getDynFlags, getThisPackage,
+ getState, setState, getInfoDown, getDynFlags, getThisPackage,
-- more localised access to monad state
getStkUsage, setStkUsage,
-- more localised access to monad state
getStkUsage, setStkUsage,
@@
-62,9
+62,9
@@
module CgMonad (
import {-# SOURCE #-} CgBindery ( CgBindings, nukeVolatileBinds )
import DynFlags
import {-# SOURCE #-} CgBindery ( CgBindings, nukeVolatileBinds )
import DynFlags
-import PackageConfig
-import Cmm
-import CmmUtils
+import BlockId
+import OldCmm
+import OldCmmUtils
import CLabel
import StgSyn (SRT)
import SMRep
import CLabel
import StgSyn (SRT)
import SMRep
@@
-73,12
+73,11
@@
import Id
import VarEnv
import OrdList
import Unique
import VarEnv
import OrdList
import Unique
-import Util
import UniqSupply
import UniqSupply
-import FastString
import Outputable
import Control.Monad
import Outputable
import Control.Monad
+import Data.List
infixr 9 `thenC` -- Right-associative!
infixr 9 `thenFC`
infixr 9 `thenC` -- Right-associative!
infixr 9 `thenFC`
@@
-157,6
+156,7
@@
data EndOfBlockInfo
-- by a case alternative.
Sequel
-- by a case alternative.
Sequel
+initEobInfo :: EndOfBlockInfo
initEobInfo = EndOfBlockInfo 0 OnStack
\end{code}
initEobInfo = EndOfBlockInfo 0 OnStack
\end{code}
@@
-167,7
+167,6
@@
block.
\begin{code}
data Sequel
= OnStack -- Continuation is on the stack
\begin{code}
data Sequel
= OnStack -- Continuation is on the stack
- | UpdateCode -- Continuation is update
| CaseAlts
CLabel -- Jump to this; if the continuation is for a vectored
| CaseAlts
CLabel -- Jump to this; if the continuation is for a vectored
@@
-233,6
+232,7
@@
flattenCgStmts id stmts =
where (block,blocks) = flatten stmts
(CgFork fork_id stmts : ss) ->
flatten (CgFork fork_id stmts : CgStmt stmt : ss)
where (block,blocks) = flatten stmts
(CgFork fork_id stmts : ss) ->
flatten (CgFork fork_id stmts : CgStmt stmt : ss)
+ (CgStmt {} : _) -> panic "CgStmt not seen as ordinary"
flatten (s:ss) =
case s of
flatten (s:ss) =
case s of
@@
-243,11
+243,14
@@
flattenCgStmts id stmts =
where (fork_block, fork_blocks) = flatten (fromOL stmts)
where (block,blocks) = flatten ss
where (fork_block, fork_blocks) = flatten (fromOL stmts)
where (block,blocks) = flatten ss
+isJump :: CmmStmt -> Bool
isJump (CmmJump _ _) = True
isJump (CmmBranch _) = True
isJump (CmmSwitch _ _) = True
isJump (CmmJump _ _) = True
isJump (CmmBranch _) = True
isJump (CmmSwitch _ _) = True
+isJump (CmmReturn _) = True
isJump _ = False
isJump _ = False
+isOrdinaryStmt :: CgStmt -> Bool
isOrdinaryStmt (CgStmt _) = True
isOrdinaryStmt _ = False
\end{code}
isOrdinaryStmt (CgStmt _) = True
isOrdinaryStmt _ = False
\end{code}
@@
-388,7
+391,7
@@
initC dflags mod (FCode code)
}
returnFC :: a -> FCode a
}
returnFC :: a -> FCode a
-returnFC val = FCode (\info_down state -> (val, state))
+returnFC val = FCode (\_ state -> (val, state))
\end{code}
\begin{code}
\end{code}
\begin{code}
@@
-437,6
+440,9
@@
fixC fcode = FCode (
in
result
)
in
result
)
+
+fixC_ :: (a -> FCode a) -> FCode ()
+fixC_ fcode = fixC fcode >> return ()
\end{code}
%************************************************************************
\end{code}
%************************************************************************
@@
-448,10
+454,10
@@
fixC fcode = FCode (
\begin{code}
getState :: FCode CgState
\begin{code}
getState :: FCode CgState
-getState = FCode $ \info_down state -> (state,state)
+getState = FCode $ \_ state -> (state,state)
setState :: CgState -> FCode ()
setState :: CgState -> FCode ()
-setState state = FCode $ \info_down _ -> ((),state)
+setState state = FCode $ \_ _ -> ((),state)
getStkUsage :: FCode StackUsage
getStkUsage = do
getStkUsage :: FCode StackUsage
getStkUsage = do
@@
-693,7
+699,7
@@
nopC = return ()
whenC :: Bool -> Code -> Code
whenC True code = code
whenC :: Bool -> Code -> Code
whenC True code = code
-whenC False code = nopC
+whenC False _ = nopC
stmtC :: CmmStmt -> Code
stmtC stmt = emitCgStmt (CgStmt stmt)
stmtC :: CmmStmt -> Code
stmtC stmt = emitCgStmt (CgStmt stmt)
@@
-702,7
+708,8
@@
labelC :: BlockId -> Code
labelC id = emitCgStmt (CgLabel id)
newLabelC :: FCode BlockId
labelC id = emitCgStmt (CgLabel id)
newLabelC :: FCode BlockId
-newLabelC = do { id <- newUnique; return (BlockId id) }
+newLabelC = do { u <- newUnique
+ ; return $ mkBlockId u }
checkedAbsC :: CmmStmt -> Code
-- Emit code, eliminating no-ops
checkedAbsC :: CmmStmt -> Code
-- Emit code, eliminating no-ops
@@
-735,25
+742,29
@@
emitData sect lits
data_block = CmmData sect lits
emitProc :: CmmInfo -> CLabel -> CmmFormals -> [CmmBasicBlock] -> Code
data_block = CmmData sect lits
emitProc :: CmmInfo -> CLabel -> CmmFormals -> [CmmBasicBlock] -> Code
-emitProc info lbl args blocks
- = do { let proc_block = CmmProc info lbl args blocks
+emitProc info lbl [] blocks
+ = do { let proc_block = CmmProc info lbl (ListGraph blocks)
; state <- getState
; setState $ state { cgs_tops = cgs_tops state `snocOL` proc_block } }
; state <- getState
; setState $ state { cgs_tops = cgs_tops state `snocOL` proc_block } }
+emitProc _ _ (_:_) _ = panic "emitProc called with nonempty args"
emitSimpleProc :: CLabel -> Code -> Code
-- Emit a procedure whose body is the specified code; no info table
emitSimpleProc lbl code
= do { stmts <- getCgStmts code
; blks <- cgStmtsToBlocks stmts
emitSimpleProc :: CLabel -> Code -> Code
-- Emit a procedure whose body is the specified code; no info table
emitSimpleProc lbl code
= do { stmts <- getCgStmts code
; blks <- cgStmtsToBlocks stmts
- ; emitProc (CmmNonInfo Nothing) lbl [] blks }
+ ; emitProc (CmmInfo Nothing Nothing CmmNonInfoTable) lbl [] blks }
getCmm :: Code -> FCode Cmm
-- Get all the CmmTops (there should be no stmts)
getCmm :: Code -> FCode Cmm
-- Get all the CmmTops (there should be no stmts)
+-- Return a single Cmm which may be split from other Cmms by
+-- object splitting (at a later stage)
getCmm code
= do { state1 <- getState
; ((), state2) <- withState code (state1 { cgs_tops = nilOL })
; setState $ state2 { cgs_tops = cgs_tops state1 }
getCmm code
= do { state1 <- getState
; ((), state2) <- withState code (state1 { cgs_tops = nilOL })
; setState $ state2 { cgs_tops = cgs_tops state1 }
- ; return (Cmm (fromOL (cgs_tops state2))) }
+ ; return (Cmm (fromOL (cgs_tops state2)))
+ }
-- ----------------------------------------------------------------------------
-- CgStmts
-- ----------------------------------------------------------------------------
-- CgStmts