summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2020-04-17 20:17:18 +0000
committerBen Gamari <ben@smart-cactus.org>2020-04-17 20:17:18 +0000
commit12decb2a4a78509ef6874c9e6111f9f0e2beeb0b (patch)
treeb1ea069e4099f382d93b36fe693f9510356d3fa2
parent0040f7ccaeb8a0f6945662c805eaa6c4bcc2023c (diff)
downloadhaskell-12decb2a4a78509ef6874c9e6111f9f0e2beeb0b.tar.gz
XXX: Tracing
-rw-r--r--compiler/GHC/StgToCmm/Bind.hs5
-rw-r--r--compiler/GHC/StgToCmm/Closure.hs9
-rw-r--r--compiler/GHC/StgToCmm/Env.hs16
3 files changed, 20 insertions, 10 deletions
diff --git a/compiler/GHC/StgToCmm/Bind.hs b/compiler/GHC/StgToCmm/Bind.hs
index 8db97d8083..25d3a92ffb 100644
--- a/compiler/GHC/StgToCmm/Bind.hs
+++ b/compiler/GHC/StgToCmm/Bind.hs
@@ -500,7 +500,8 @@ closureCodeBody top_lvl bndr cl_info cc args arity body fv_details
(CmmMachOp (mo_wordSub platform)
[ CmmReg (CmmLocal node) -- See [NodeReg clobbered with loopification]
, mkIntExpr platform (funTag dflags cl_info) ])
- ; fv_bindings <- mapM bind_fv fv_details
+ ; fv_bindings <- pprTrace "closureBodyBody" (ppr bndr $$ ppr body)
+ $ mapM bind_fv fv_details
-- Load free vars out of closure *after*
-- heap check, to reduce live vars over check
; when node_points $ load_fvs node lf_info fv_bindings
@@ -523,7 +524,7 @@ closureCodeBody top_lvl bndr cl_info cc args arity body fv_details
-- A function closure pointer may be tagged, so we
-- must take it into account when accessing the free variables.
-bind_fv :: (NonVoid Id, ByteOff) -> FCode (LocalReg, ByteOff)
+bind_fv :: HasCallStack => (NonVoid Id, ByteOff) -> FCode (LocalReg, ByteOff)
bind_fv (id, off) = do { reg <- rebindToReg id; return (reg, off) }
load_fvs :: LocalReg -> LambdaFormInfo -> [(LocalReg, ByteOff)] -> FCode ()
diff --git a/compiler/GHC/StgToCmm/Closure.hs b/compiler/GHC/StgToCmm/Closure.hs
index 8ab4fa6b0f..e947f35055 100644
--- a/compiler/GHC/StgToCmm/Closure.hs
+++ b/compiler/GHC/StgToCmm/Closure.hs
@@ -232,6 +232,13 @@ data LambdaFormInfo
| LFLetNoEscape -- See LetNoEscape module for precise description
+instance Outputable LambdaFormInfo where
+ ppr LFReEntrant{} = text "re-entrant"
+ ppr LFThunk{} = text "thunk"
+ ppr LFCon{} = text "data-con"
+ ppr LFUnknown{} = text "unknown"
+ ppr LFUnlifted = text "unlifted"
+ ppr LFLetNoEscape = text "let-no-escape"
-------------------------
-- StandardFormInfo tells whether this thunk has one of
@@ -626,7 +633,7 @@ getCallMethod _ _name _ LFLetNoEscape _n_args _v_args (LneLoc blk_id lne_regs)
_self_loop_info
= JumpToIt blk_id lne_regs
-getCallMethod _ name _ _lf_info _ _ _ _ = pprPanic "Unknown call method" (ppr name)
+getCallMethod _ name _ _lf_info _ _ _loc _ = pprPanic "Unknown call method" (ppr name $$ ppr _lf_info $$ ppr _loc)
-----------------------------------------------------------------------------
-- Data types for closure information
diff --git a/compiler/GHC/StgToCmm/Env.hs b/compiler/GHC/StgToCmm/Env.hs
index 047353b89a..a927608b03 100644
--- a/compiler/GHC/StgToCmm/Env.hs
+++ b/compiler/GHC/StgToCmm/Env.hs
@@ -60,7 +60,7 @@ mkCgIdInfo id lf expr
litIdInfo :: DynFlags -> Id -> LambdaFormInfo -> CmmLit -> CgIdInfo
litIdInfo dflags id lf lit
- = CgIdInfo { cg_id = id, cg_lf = lf
+ = pprTrace "litIdInfo" (ppr id) $ CgIdInfo { cg_id = id, cg_lf = lf
, cg_loc = CmmLoc (addDynTag platform (CmmLit lit) tag) }
where
tag = lfDynTag dflags lf
@@ -77,7 +77,8 @@ lneIdInfo platform id regs
rhsIdInfo :: Id -> LambdaFormInfo -> FCode (CgIdInfo, LocalReg)
rhsIdInfo id lf_info
- = do platform <- getPlatform
+ = pprTrace "rhsIdInfo" (ppr id) $
+ do platform <- getPlatform
reg <- newTemp (gcWord platform)
return (mkCgIdInfo id lf_info (CmmReg (CmmLocal reg)), reg)
@@ -177,25 +178,26 @@ getNonVoidArgAmodes (arg:args)
-- Interface functions for binding and re-binding names
------------------------------------------------------------------------
-bindToReg :: NonVoid Id -> LambdaFormInfo -> FCode LocalReg
+bindToReg :: HasCallStack => NonVoid Id -> LambdaFormInfo -> FCode LocalReg
-- Bind an Id to a fresh LocalReg
bindToReg nvid@(NonVoid id) lf_info
= do platform <- getPlatform
let reg = idToReg platform nvid
- addBindC (mkCgIdInfo id lf_info (CmmReg (CmmLocal reg)))
+ pprTrace "bindToReg" (ppr id $$ ppr lf_info $$ callStackDoc)
+ $ addBindC (mkCgIdInfo id lf_info (CmmReg (CmmLocal reg)))
return reg
-rebindToReg :: NonVoid Id -> FCode LocalReg
+rebindToReg :: HasCallStack => NonVoid Id -> FCode LocalReg
-- Like bindToReg, but the Id is already in scope, so
-- get its LF info from the envt
rebindToReg nvid@(NonVoid id)
= do { info <- getCgIdInfo id
; bindToReg nvid (cg_lf info) }
-bindArgToReg :: NonVoid Id -> FCode LocalReg
+bindArgToReg :: HasCallStack => NonVoid Id -> FCode LocalReg
bindArgToReg nvid@(NonVoid id) = bindToReg nvid (mkLFArgument id)
-bindArgsToRegs :: [NonVoid Id] -> FCode [LocalReg]
+bindArgsToRegs :: HasCallStack => [NonVoid Id] -> FCode [LocalReg]
bindArgsToRegs args = mapM bindArgToReg args
idToReg :: Platform -> NonVoid Id -> LocalReg