Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fix update frames for profiling

  • Loading branch information...
commit 5c3f13f0067491d4db044eb8159044c3ba715941 1 parent ddd6af0
@simonmar simonmar authored
Showing with 19 additions and 15 deletions.
  1. +16 −12 compiler/codeGen/StgCmmBind.hs
  2. +3 −3 compiler/codeGen/StgCmmProf.hs
View
28 compiler/codeGen/StgCmmBind.hs
@@ -578,7 +578,7 @@ setupUpdate closure_info node body
lbl | bh = mkBHUpdInfoLabel
| otherwise = mkUpdInfoLabel
- pushUpdateFrame [CmmReg (CmmLocal node), mkLblExpr lbl] body
+ pushUpdateFrame lbl (CmmReg (CmmLocal node)) body
| otherwise -- A static closure
= do { tickyUpdateBhCaf closure_info
@@ -586,8 +586,7 @@ setupUpdate closure_info node body
; if closureUpdReqd closure_info
then do -- Blackhole the (updatable) CAF:
{ upd_closure <- link_caf True
- ; pushUpdateFrame [upd_closure,
- mkLblExpr mkBHUpdInfoLabel] body }
+ ; pushUpdateFrame mkBHUpdInfoLabel upd_closure body }
else do {tickyUpdateFrameOmitted; body}
}
@@ -597,16 +596,21 @@ setupUpdate closure_info node body
-- Push the update frame on the stack in the Entry area,
-- leaving room for the return address that is already
-- at the old end of the area.
-pushUpdateFrame :: [CmmExpr] -> FCode () -> FCode ()
-pushUpdateFrame es body
- = do -- [EZY] I'm not sure if we need to special-case for BH too
+--
+pushUpdateFrame :: CLabel -> CmmExpr -> FCode () -> FCode ()
+pushUpdateFrame lbl updatee body
+ = do
updfr <- getUpdFrameOff
- offset <- foldM push updfr es
- withUpdFrameOff offset body
- where push off e =
- do emitStore (CmmStackSlot Old base) e
- return base
- where base = off + widthInBytes (cmmExprWidth e)
+ dflags <- getDynFlags
+ let
+ hdr = fixedHdrSize dflags * wORD_SIZE
+ frame = updfr + hdr + sIZEOF_StgUpdateFrame_NoHdr
+ off_updatee = hdr + oFFSET_StgUpdateFrame_updatee
+ --
+ emitStore (CmmStackSlot Old frame) (mkLblExpr lbl)
+ emitStore (CmmStackSlot Old (frame - off_updatee)) updatee
+ initUpdFrameProf frame
+ withUpdFrameOff frame body
-----------------------------------------------------------------------------
-- Entering a CAF
View
6 compiler/codeGen/StgCmmProf.hs
@@ -99,11 +99,11 @@ dynProfHdr :: DynFlags -> CmmExpr -> [CmmExpr]
-- Profiling header words in a dynamic closure
dynProfHdr dflags ccs = ifProfilingL dflags [ccs, dynLdvInit]
-initUpdFrameProf :: CmmExpr -> FCode ()
+initUpdFrameProf :: ByteOff -> FCode ()
-- Initialise the profiling field of an update frame
-initUpdFrameProf frame_amode
+initUpdFrameProf frame_off
= ifProfiling $ -- frame->header.prof.ccs = CCCS
- emitStore (cmmOffsetB frame_amode oFFSET_StgHeader_ccs) curCCS
+ emitStore (CmmStackSlot Old (frame_off - oFFSET_StgHeader_ccs)) curCCS
-- frame->header.prof.hp.rs = NULL (or frame-header.prof.hp.ldvw = 0)
-- is unnecessary because it is not used anyhow.
Please sign in to comment.
Something went wrong with that request. Please try again.