{- stackcollapse-ghc - fold GHC prof files into flamegraph input
Copyright (C) 2020 Marcin Rzeźnicki
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
module Trace
( Trace(..)
, CostCentre(..)
, Src(..)
, hasLocation
, isMain
, isCAF
, costCentre
, source
, inAnyModule) where
import Data.Text (Text)
import qualified Data.Text as T
data Trace = Trace { cc :: CostCentre
, modul :: Text
, src :: Src
, ticks :: Integer
, alloc :: Integer
}
data CostCentre = Main
| CAF (Maybe Text)
| SCC Text
data Src = BuiltIn
| EntireModule
| NoLocationInfo
| Location Text
hasLocation :: Trace -> Bool
hasLocation Trace { src = (Location _) } = True
hasLocation _ = False
isMain :: Trace -> Bool
isMain Trace { cc = Main } = True
isMain _ = False
isCAF :: Trace -> Bool
isCAF Trace { cc = (CAF _) } = True
isCAF _ = False
costCentre :: Trace -> Text
costCentre trace = case cc trace of
Main -> "MAIN"
CAF Nothing -> "CAF"
CAF (Just text) -> text
SCC text -> text
source :: Trace -> Text
source trace = case src trace of
BuiltIn -> ""
EntireModule -> ""
NoLocationInfo -> ""
Location l -> l
inAnyModule :: [Text] -> Trace -> Bool
inAnyModule modules Trace { modul } = any
(maybe False (\suffix -> T.null suffix || T.head suffix == '.')
. flip T.stripPrefix modul)
modules