summaryrefslogtreecommitdiff
path: root/compiler/GHC/Types/CostCentre/State.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Types/CostCentre/State.hs')
-rw-r--r--compiler/GHC/Types/CostCentre/State.hs41
1 files changed, 41 insertions, 0 deletions
diff --git a/compiler/GHC/Types/CostCentre/State.hs b/compiler/GHC/Types/CostCentre/State.hs
new file mode 100644
index 0000000000..51c364f776
--- /dev/null
+++ b/compiler/GHC/Types/CostCentre/State.hs
@@ -0,0 +1,41 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module GHC.Types.CostCentre.State
+ ( CostCentreState
+ , newCostCentreState
+ , CostCentreIndex
+ , unCostCentreIndex
+ , getCCIndex
+ )
+where
+
+import GhcPrelude
+import FastString
+import FastStringEnv
+
+import Data.Data
+import Binary
+
+-- | Per-module state for tracking cost centre indices.
+--
+-- See documentation of 'CostCentre.cc_flavour' for more details.
+newtype CostCentreState = CostCentreState (FastStringEnv Int)
+
+-- | Initialize cost centre state.
+newCostCentreState :: CostCentreState
+newCostCentreState = CostCentreState emptyFsEnv
+
+-- | An index into a given cost centre module,name,flavour set
+newtype CostCentreIndex = CostCentreIndex { unCostCentreIndex :: Int }
+ deriving (Eq, Ord, Data, Binary)
+
+-- | Get a new index for a given cost centre name.
+getCCIndex :: FastString
+ -> CostCentreState
+ -> (CostCentreIndex, CostCentreState)
+getCCIndex nm (CostCentreState m) =
+ (CostCentreIndex idx, CostCentreState m')
+ where
+ m_idx = lookupFsEnv m nm
+ idx = maybe 0 id m_idx
+ m' = extendFsEnv m nm (idx + 1)