-- Right <=> Function or Proc point
CLabel -- Used to generate both info & entry labels
CmmFormalsWithoutKinds -- Argument locals live on entry (C-- procedure params)
- Bool -- ^ True <=> GC block so ignore stack size
+ Bool -- True <=> GC block so ignore stack size
[BrokenBlock] -- Code, may be empty. The first block is
-- the entry point. The order is otherwise initially
-- unimportant, but at some point the code gen will
main_stmts =
case entry of
FunctionEntry _ _ _ ->
- -- Ugh, the statements for an update frame must come
- -- *after* the GC check that was added at the beginning
- -- of the CPS pass. So we have do edit the statements
- -- a bit. This depends on the knowledge that the
- -- statements in the first block are only the GC check.
- -- That's fragile but it works for now.
+ -- The statements for an update frame must come /after/
+ -- the GC check that was added at the beginning of the
+ -- CPS pass. So we have do edit the statements a bit.
+ -- This depends on the knowledge that the statements in
+ -- the first block are only the GC check. That's
+ -- fragile but it works for now.
gc_stmts ++ stmts ++ update_stmts ++ postfix_stmts
ControlEntry -> stmts ++ postfix_stmts
ContinuationEntry _ _ _ -> stmts ++ postfix_stmts
isLoneBranch :: CmmBasicBlock -> Either (BlockId, BlockId) CmmBasicBlock
isLoneBranch (BasicBlock id [CmmBranch target]) | id /= target = Left (id, target)
isLoneBranch other_block = Right other_block
- -- ^ An infinite loop is not a link in a branch chain!
+ -- An infinite loop is not a link in a branch chain!
replaceLabels :: BlockEnv BlockId -> CmmBasicBlock -> CmmBasicBlock
replaceLabels env (BasicBlock id stmts)
isLoneBranchZ (G.Block id (G.ZLast (G.LastOther (LastBranch target))))
| id /= target = Left (id,target)
isLoneBranchZ other = Right other
- -- ^ An infinite loop is not a link in a branch chain!
+ -- An infinite loop is not a link in a branch chain!
replaceLabelsZ :: BlockEnv BlockId -> CmmGraph -> CmmGraph
replaceLabelsZ env = replace_eid . G.map_nodes id id last
data GCKind = GCKindPtr | GCKindNonPtr deriving (Eq)
data LocalReg
- = LocalReg
- !Unique -- ^ Identifier
- MachRep -- ^ Type
- GCKind -- ^ Should the GC follow as a pointer
-
--- | Sets of local registers
+ = LocalReg !Unique MachRep GCKind
+ -- ^ Parameters:
+ -- 1. Identifier
+ -- 2. Type
+ -- 3. Should the GC follow as a pointer
+-- Sets of local registers
type RegSet = UniqSet LocalReg
emptyRegSet :: RegSet
elemRegSet :: LocalReg -> RegSet -> Bool
mkInfoTable uniq (CmmData sec dat) = [CmmData sec dat]
mkInfoTable uniq (CmmProc (CmmInfo _ _ info) entry_label arguments blocks) =
case info of
- -- | Code without an info table. Easy.
+ -- Code without an info table. Easy.
CmmNonInfoTable -> [CmmProc [] entry_label arguments blocks]
CmmInfoTable (ProfilingInfo ty_prof cl_prof) type_tag type_info ->
ty_prof' = makeRelativeRefTo info_label ty_prof
cl_prof' = makeRelativeRefTo info_label cl_prof
in case type_info of
- -- | A function entry point.
+ -- A function entry point.
FunInfo (ptrs, nptrs) srt fun_type fun_arity pap_bitmap slow_entry ->
mkInfoTableAndCode info_label std_info fun_extra_bits entry_label
arguments blocks
(srt_label, srt_bitmap) = mkSRTLit info_label srt
layout = packHalfWordsCLit ptrs nptrs
- -- | A constructor.
+ -- A constructor.
ConstrInfo (ptrs, nptrs) con_tag descr ->
mkInfoTableAndCode info_label std_info [con_name] entry_label
arguments blocks
con_name = makeRelativeRefTo info_label descr
layout = packHalfWordsCLit ptrs nptrs
- -- | A thunk.
+ -- A thunk.
ThunkInfo (ptrs, nptrs) srt ->
mkInfoTableAndCode info_label std_info srt_label entry_label
arguments blocks
(srt_label, srt_bitmap) = mkSRTLit info_label srt
layout = packHalfWordsCLit ptrs nptrs
- -- | A selector thunk.
+ -- A selector thunk.
ThunkSelectorInfo offset srt ->
mkInfoTableAndCode info_label std_info [{- no SRT -}] entry_label
arguments blocks
-- TODO: combine with CgCallConv.mkLiveness (see comment there)
mkLiveness :: Unique
-> [Maybe LocalReg]
- -> (CmmLit, -- ^ The bitmap (literal value or label)
- [RawCmmTop], -- ^ Large bitmap CmmData if needed
- ClosureTypeTag) -- ^ rET_SMALL or rET_BIG
+ -> (CmmLit, [RawCmmTop], ClosureTypeTag)
+ -- ^ Returns:
+ -- 1. The bitmap (literal value or label)
+ -- 2. Large bitmap CmmData if needed
+ -- 3. rET_SMALL or rET_BIG
mkLiveness uniq live =
if length bits > mAX_SMALL_BITMAP_SIZE
-- does not fit in one word