{-# LANGUAGE RankNTypes, TypeFamilies #-}
module GHC.Driver.Hooks
( Hooks
, HasHooks (..)
, ContainsHooks (..)
, emptyHooks
, DsForeignsHook
, dsForeignsHook
, tcForeignImportsHook
, tcForeignExportsHook
, hscFrontendHook
, hscCompileCoreExprHook
, ghcPrimIfaceHook
, runPhaseHook
, runMetaHook
, linkHook
, runRnSpliceHook
, getValueSafelyHook
, createIservProcessHook
, stgToCmmHook
, cmmToRawCmmHook
)
where
import GHC.Prelude
import GHC.Driver.Env
import GHC.Driver.Session
import GHC.Driver.Pipeline.Phases
import GHC.Hs.Decls
import GHC.Hs.Binds
import GHC.Hs.Expr
import GHC.Hs.Extension
import GHC.Types.Name.Reader
import GHC.Types.Name
import GHC.Types.Id
import GHC.Types.SrcLoc
import GHC.Types.Basic
import GHC.Types.CostCentre
import GHC.Types.IPE
import GHC.Types.Meta
import GHC.Types.HpcInfo
import GHC.Unit.Module
import GHC.Unit.Module.ModSummary
import GHC.Unit.Module.ModIface
import GHC.Unit.Home.ModInfo
import GHC.Core
import GHC.Core.TyCon
import GHC.Core.Type
import GHC.Tc.Types
import GHC.Stg.Syntax
import GHC.StgToCmm.Types (ModuleLFInfos)
import GHC.StgToCmm.Config
import GHC.Cmm
import GHCi.RemoteTypes
import GHC.Data.Stream
import GHC.Data.Bag
import qualified Data.Kind
import System.Process
import GHC.Linker.Types
emptyHooks :: Hooks
emptyHooks :: Hooks
emptyHooks = Hooks
{ dsForeignsHook :: Maybe DsForeignsHook
dsForeignsHook = forall a. Maybe a
Nothing
, tcForeignImportsHook :: Maybe
([LForeignDecl GhcRn]
-> TcM ([Id], [LForeignDecl GhcTc], Bag GlobalRdrElt))
tcForeignImportsHook = forall a. Maybe a
Nothing
, tcForeignExportsHook :: Maybe
([LForeignDecl GhcRn]
-> TcM (LHsBinds GhcTc, [LForeignDecl GhcTc], Bag GlobalRdrElt))
tcForeignExportsHook = forall a. Maybe a
Nothing
, hscFrontendHook :: Maybe (ModSummary -> Hsc FrontendResult)
hscFrontendHook = forall a. Maybe a
Nothing
, hscCompileCoreExprHook :: Maybe
(HscEnv
-> SrcSpan
-> CoreExpr
-> IO (ForeignHValue, [Linkable], PkgsLoaded))
hscCompileCoreExprHook = forall a. Maybe a
Nothing
, ghcPrimIfaceHook :: Maybe ModIface
ghcPrimIfaceHook = forall a. Maybe a
Nothing
, runPhaseHook :: Maybe PhaseHook
runPhaseHook = forall a. Maybe a
Nothing
, runMetaHook :: Maybe (MetaHook TcM)
runMetaHook = forall a. Maybe a
Nothing
, linkHook :: Maybe
(GhcLink -> DynFlags -> Bool -> HomePackageTable -> IO SuccessFlag)
linkHook = forall a. Maybe a
Nothing
, runRnSpliceHook :: Maybe (HsUntypedSplice GhcRn -> RnM (HsUntypedSplice GhcRn))
runRnSpliceHook = forall a. Maybe a
Nothing
, getValueSafelyHook :: Maybe
(HscEnv
-> Name
-> Type
-> IO (Either Type (HValue, [Linkable], PkgsLoaded)))
getValueSafelyHook = forall a. Maybe a
Nothing
, createIservProcessHook :: Maybe (CreateProcess -> IO ProcessHandle)
createIservProcessHook = forall a. Maybe a
Nothing
, stgToCmmHook :: Maybe
(StgToCmmConfig
-> InfoTableProvMap
-> [TyCon]
-> CollectedCCs
-> [CgStgTopBinding]
-> HpcInfo
-> Stream IO CmmGroup ModuleLFInfos)
stgToCmmHook = forall a. Maybe a
Nothing
, cmmToRawCmmHook :: forall a.
Maybe
(DynFlags
-> Maybe Module
-> Stream IO CmmGroupSRTs a
-> IO (Stream IO RawCmmGroup a))
cmmToRawCmmHook = forall a. Maybe a
Nothing
}
type family DsForeignsHook :: Data.Kind.Type
data Hooks = Hooks
{ Hooks -> Maybe DsForeignsHook
dsForeignsHook :: !(Maybe DsForeignsHook)
, Hooks
-> Maybe
([LForeignDecl GhcRn]
-> TcM ([Id], [LForeignDecl GhcTc], Bag GlobalRdrElt))
tcForeignImportsHook :: !(Maybe ([LForeignDecl GhcRn]
-> TcM ([Id], [LForeignDecl GhcTc], Bag GlobalRdrElt)))
, Hooks
-> Maybe
([LForeignDecl GhcRn]
-> TcM (LHsBinds GhcTc, [LForeignDecl GhcTc], Bag GlobalRdrElt))
tcForeignExportsHook :: !(Maybe ([LForeignDecl GhcRn]
-> TcM (LHsBinds GhcTc, [LForeignDecl GhcTc], Bag GlobalRdrElt)))
, Hooks -> Maybe (ModSummary -> Hsc FrontendResult)
hscFrontendHook :: !(Maybe (ModSummary -> Hsc FrontendResult))
, Hooks
-> Maybe
(HscEnv
-> SrcSpan
-> CoreExpr
-> IO (ForeignHValue, [Linkable], PkgsLoaded))
hscCompileCoreExprHook :: !(Maybe (HscEnv -> SrcSpan -> CoreExpr -> IO (ForeignHValue, [Linkable], PkgsLoaded)))
, Hooks -> Maybe ModIface
ghcPrimIfaceHook :: !(Maybe ModIface)
, Hooks -> Maybe PhaseHook
runPhaseHook :: !(Maybe PhaseHook)
, Hooks -> Maybe (MetaHook TcM)
runMetaHook :: !(Maybe (MetaHook TcM))
, Hooks
-> Maybe
(GhcLink -> DynFlags -> Bool -> HomePackageTable -> IO SuccessFlag)
linkHook :: !(Maybe (GhcLink -> DynFlags -> Bool
-> HomePackageTable -> IO SuccessFlag))
, Hooks
-> Maybe (HsUntypedSplice GhcRn -> RnM (HsUntypedSplice GhcRn))
runRnSpliceHook :: !(Maybe (HsUntypedSplice GhcRn -> RnM (HsUntypedSplice GhcRn)))
, Hooks
-> Maybe
(HscEnv
-> Name
-> Type
-> IO (Either Type (HValue, [Linkable], PkgsLoaded)))
getValueSafelyHook :: !(Maybe (HscEnv -> Name -> Type
-> IO (Either Type (HValue, [Linkable], PkgsLoaded))))
, Hooks -> Maybe (CreateProcess -> IO ProcessHandle)
createIservProcessHook :: !(Maybe (CreateProcess -> IO ProcessHandle))
, Hooks
-> Maybe
(StgToCmmConfig
-> InfoTableProvMap
-> [TyCon]
-> CollectedCCs
-> [CgStgTopBinding]
-> HpcInfo
-> Stream IO CmmGroup ModuleLFInfos)
stgToCmmHook :: !(Maybe (StgToCmmConfig -> InfoTableProvMap -> [TyCon] -> CollectedCCs
-> [CgStgTopBinding] -> HpcInfo -> Stream IO CmmGroup ModuleLFInfos))
, Hooks
-> forall a.
Maybe
(DynFlags
-> Maybe Module
-> Stream IO CmmGroupSRTs a
-> IO (Stream IO RawCmmGroup a))
cmmToRawCmmHook :: !(forall a . Maybe (DynFlags -> Maybe Module -> Stream IO CmmGroupSRTs a
-> IO (Stream IO RawCmmGroup a)))
}
class HasHooks m where
getHooks :: m Hooks
class ContainsHooks a where
:: a -> Hooks