diff options
author | Peter Wortmann <scpmw@leeds.ac.uk> | 2014-01-14 18:25:16 +0000 |
---|---|---|
committer | Austin Seipp <austin@well-typed.com> | 2014-12-16 15:02:19 -0600 |
commit | 4cdbf80250da2d3ba1c63451e5fbc9b5ca9cbfe9 (patch) | |
tree | 0cb8e99ff8202cf6873fd93c22383cdc7036c13f /compiler/codeGen/StgCmmExpr.hs | |
parent | 07d604fa1dba7caa39cdc4bc3d90844c600adb70 (diff) | |
download | haskell-4cdbf80250da2d3ba1c63451e5fbc9b5ca9cbfe9.tar.gz |
Source notes (CorePrep and Stg support)
This is basically just about continuing maintaining source notes after
the Core stage. Unfortunately, this is more involved as it might seem,
as there are more restrictions on where ticks are allowed to show up.
Notes:
* We replace the StgTick / StgSCC constructors with a unified StgTick
that can carry any tickish.
* For handling constructor or lambda applications, we generally float
ticks out.
* Note that thanks to the NonLam placement, we know that source notes
can never appear on lambdas. This means that as long as we are
careful to always use mkTick, we will never violate CorePrep
invariants.
* This is however not automatically true for eta expansion, which
needs to somewhat awkwardly strip, then re-tick the expression in
question.
* Where CorePrep floats out lets, we make sure to wrap them in the
same spirit as FloatOut.
* Detecting selector thunks becomes a bit more involved, as we can run
into ticks at multiple points.
(From Phabricator D169)
Diffstat (limited to 'compiler/codeGen/StgCmmExpr.hs')
-rw-r--r-- | compiler/codeGen/StgCmmExpr.hs | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/compiler/codeGen/StgCmmExpr.hs b/compiler/codeGen/StgCmmExpr.hs index b2b64f8650..9097e7fa12 100644 --- a/compiler/codeGen/StgCmmExpr.hs +++ b/compiler/codeGen/StgCmmExpr.hs @@ -66,10 +66,7 @@ cgExpr (StgOpApp (StgPrimOp SeqOp) [StgVarArg a, _] _res_ty) = cgExpr (StgOpApp op args ty) = cgOpApp op args ty cgExpr (StgConApp con args) = cgConApp con args -cgExpr (StgSCC cc tick push expr) = do { emitSetCCC cc tick push; cgExpr expr } -cgExpr (StgTick m n expr) = do dflags <- getDynFlags - emit (mkTickBox dflags m n) - cgExpr expr +cgExpr (StgTick t e) = cgTick t >> cgExpr e cgExpr (StgLit lit) = do cmm_lit <- cgLit lit emitReturn [CmmLit cmm_lit] @@ -852,3 +849,19 @@ emitEnter fun = do ; return (ReturnedTo lret off) } } + +------------------------------------------------------------------------ +-- Ticks +------------------------------------------------------------------------ + +-- | Generate Cmm code for a tick. Depending on the type of Tickish, +-- this will either generate actual Cmm instrumentation code, or +-- simply pass on the annotation as a @CmmTickish@. +cgTick :: Tickish Id -> FCode () +cgTick tick + = do { dflags <- getDynFlags + ; case tick of + ProfNote cc t p -> emitSetCCC cc t p + HpcTick m n -> emit (mkTickBox dflags m n) + _other -> return () -- ignore + } |