Minor enhancements to printing machinery to aid debugging the BC generator.
seqRules, seqExpr, seqExprs, seqUnfolding,
-- Annotated expressions
- AnnExpr, AnnExpr'(..), AnnBind(..), AnnAlt, deAnnotate, deAnnotate',
+ AnnExpr, AnnExpr'(..), AnnBind(..), AnnAlt,
+ deAnnotate, deAnnotate', deAnnAlt,
-- Core rules
CoreRules(..), -- Representation needed by friends
deAnnotate' (AnnCase scrut v alts)
= Case (deAnnotate scrut) v (map deAnnAlt alts)
- where
- deAnnAlt (con,args,rhs) = (con,args,deAnnotate rhs)
+
+deAnnAlt :: AnnAlt bndr annot -> Alt bndr
+deAnnAlt (con,args,rhs) = (con,args,deAnnotate rhs)
\end{code}
module PprCore (
pprCoreExpr, pprParendExpr,
pprCoreBinding, pprCoreBindings, pprIdBndr,
- pprCoreBinding, pprCoreBindings,
+ pprCoreBinding, pprCoreBindings, pprCoreAlt,
pprCoreRules, pprCoreRule, pprIdCoreRule
) where
pprCoreExpr = ppr_noparend_expr pprCoreEnv
pprParendExpr = ppr_parend_expr pprCoreEnv
pprArg = ppr_arg pprCoreEnv
+pprCoreAlt = ppr_alt pprCoreEnv
pprCoreEnv = initCoreEnv pprCoreBinder
\end{code}
= add_par $
sep [sep [ptext SLIT("case") <+> ppr_noparend_expr pe expr,
ptext SLIT("of") <+> ppr_bndr var <+> char '{'],
- nest 4 (sep (punctuate semi (map ppr_alt alts))),
+ nest 4 (sep (punctuate semi (map (ppr_alt pe) alts))),
char '}'
]
where
ppr_bndr = pBndr pe CaseBind
- ppr_alt (con, args, rhs) = hang (ppr_case_pat pe con args)
- 4 (ppr_noparend_expr pe rhs)
-- special cases: let ... in let ...
-- ("disgusting" SLPJ)
ppr_expr add_par pe (Note InlineMe expr)
= add_par $ ptext SLIT("__inline_me") <+> ppr_parend_expr pe expr
+ppr_alt pe (con, args, rhs)
+ = hang (ppr_case_pat pe con args) 4 (ppr_noparend_expr pe rhs)
+
ppr_case_pat pe con@(DataAlt dc) args
| isTupleTyCon tc
= tupleParens (tupleTyConBoxity tc) (hsep (punctuate comma (map ppr_bndr args))) <+> arrow
import FiniteMap ( FiniteMap, addListToFM, listToFM,
addToFM, lookupFM, fmToList, emptyFM )
import CoreSyn
+import PprCore ( pprCoreExpr, pprCoreAlt )
import Literal ( Literal(..) )
import PrimRep ( PrimRep(..) )
import CoreFVs ( freeVars )
where f (discr, code) = ppr discr <> colon <+> vcat (map ppr (fromOL code))
instance Outputable a => Outputable (ProtoBCO a) where
- ppr (ProtoBCO name instrs)
+ ppr (ProtoBCO name instrs origin)
= (text "ProtoBCO" <+> ppr name <> colon)
$$ nest 6 (vcat (map ppr (fromOL instrs)))
-
+ $$ case origin of
+ Left alts -> vcat (map (pprCoreAlt.deAnnAlt) alts)
+ Right rhs -> pprCoreExpr (deAnnotate rhs)
\end{code}
%************************************************************************
type BCInstrList = OrdList BCInstr
-data ProtoBCO a = ProtoBCO a BCInstrList
+data ProtoBCO a
+ = ProtoBCO a -- name, in some sense
+ BCInstrList -- instrs
+ -- what the BCO came from
+ (Either [AnnAlt Id VarSet]
+ (AnnExpr Id VarSet))
+
type Sequel = Int -- back off to this depth before ENTER
argcheck = if null args then nilOL else unitOL (ARGCHECK szw_args)
in
schemeE szw_args 0 p_init body `thenBc` \ body_code ->
- emitBc (ProtoBCO (getName nm) (appOL argcheck body_code))
+ emitBc (ProtoBCO (getName nm) (appOL argcheck body_code) (Right body))
-- Compile code to apply the given expression to the remaining args
mkMultiBranch alt_stuff `thenBc` \ alt_final ->
let
alt_bco_name = getName bndr
- alt_bco = ProtoBCO alt_bco_name alt_final
+ alt_bco = ProtoBCO alt_bco_name alt_final (Left alts)
in
schemeE (d + ret_frame_sizeW)
(d + ret_frame_sizeW) p scrut `thenBc` \ scrut_code ->
-- Top level assembler fn.
assembleBCO :: ProtoBCO Name -> BCO Name
-assembleBCO (ProtoBCO nm instrs_ordlist)
+assembleBCO (ProtoBCO nm instrs_ordlist origin)
= let
-- pass 1: collect up the offsets of the local labels
instrs = fromOL instrs_ordlist