1-----------------------------------------------------------------------------
2--
3-- Code generation for coverage
4--
5-- (c) Galois Connections, Inc. 2006
6--
7-----------------------------------------------------------------------------
8
9module GHC.StgToCmm.Hpc ( initHpc, mkTickBox ) where
10
11import GhcPrelude
12
13import GHC.StgToCmm.Monad
14
15import MkGraph
16import CmmExpr
17import CLabel
18import Module
19import CmmUtils
20import GHC.StgToCmm.Utils
21import HscTypes
22import DynFlags
23
24import Control.Monad
25
26mkTickBox :: DynFlags -> Module -> Int -> CmmAGraph
27mkTickBox dflags mod n
28  = mkStore tick_box (CmmMachOp (MO_Add W64)
29                                [ CmmLoad tick_box b64
30                                , CmmLit (CmmInt 1 W64)
31                                ])
32  where
33    tick_box = cmmIndex dflags W64
34                        (CmmLit $ CmmLabel $ mkHpcTicksLabel $ mod)
35                        n
36
37initHpc :: Module -> HpcInfo -> FCode ()
38-- Emit top-level tables for HPC and return code to initialise
39initHpc _ (NoHpcInfo {})
40  = return ()
41initHpc this_mod (HpcInfo tickCount _hashNo)
42  = do dflags <- getDynFlags
43       when (gopt Opt_Hpc dflags) $
44           do emitDataLits (mkHpcTicksLabel this_mod)
45                           [ (CmmInt 0 W64)
46                           | _ <- take tickCount [0 :: Int ..]
47                           ]
48
49