1 -----------------------------------------------------------------------------
3 -- Code generation for coverage
5 -- (c) Galois Connections, Inc. 2006
7 -----------------------------------------------------------------------------
9 module CgHpc (cgTickBox, initHpc, hpcTable) where
27 cgTickBox :: Module -> Int -> Code
29 let tick_box = (cmmIndex I64
30 (CmmLit $ CmmLabel $ mkHpcTicksLabel $ mod)
33 stmtsC [ CmmStore tick_box
34 (CmmMachOp (MO_Add I64)
35 [ CmmLoad tick_box I64
36 , CmmLit (CmmInt 1 I64)
40 hpcTable :: Module -> HpcInfo -> Code
41 hpcTable this_mod (HpcInfo hpc_tickCount _) = do
43 [ CmmDataLabel mkHpcModuleNameLabel
44 , CmmString $ map (fromIntegral . ord)
48 emitData Data $ [ CmmDataLabel (mkHpcTicksLabel this_mod)
50 [ CmmStaticLit (CmmInt 0 I64)
51 | _ <- take hpc_tickCount [0..]
54 module_name_str = moduleNameString (Module.moduleName this_mod)
55 full_name_str = if modulePackageId this_mod == mainPackageId
57 else packageIdString (modulePackageId this_mod) ++ "/" ++
60 hpcTable this_mod (NoHpcInfo) = error "TODO: impossible"
62 initHpc :: Module -> HpcInfo -> Code
63 initHpc this_mod (HpcInfo tickCount hashNo)
64 = do { id <- newNonPtrTemp wordRep -- TODO FIXME NOW
69 (CmmLit $ CmmLabel $ mkForeignLabel mod_alloc Nothing False)
72 [ (mkLblExpr mkHpcModuleNameLabel,PtrHint)
73 , (CmmLit $ mkIntCLit tickCount,NoHint)
74 , (CmmLit $ mkIntCLit hashNo,NoHint)
75 , (CmmLit $ CmmLabel $ mkHpcTicksLabel $ this_mod,PtrHint)
78 NoC_SRT -- No SRT b/c we PlayRisky
81 mod_alloc = mkFastString "hs_hpc_module"