CoreMonad

ghc-8.8.2: The GHC API

Safe Haskell | None
Language | Haskell2010

CoreMonad

Contents

- Configuration of the core-to-core passes
- Plugins
- Counting
- The monad
  - Reading from the monad
  - Writing to the monad
  - Lifting into the monad
  - Global initialization
  - Dealing with annotations
  - Screen output

Synopsis

- data CoreToDo
  - = CoreDoSimplify Int SimplMode
  - | CoreDoPluginPass String CorePluginPass
  - | CoreDoFloatInwards
  - | CoreDoFloatOutwards FloatOutSwitches
  - | CoreLiberateCase
  - | CoreDoPrintCore
  - | CoreDoStaticArgs
  - | CoreDoCallArity
  - | CoreDoExitify
  - | CoreDoStrictness
  - | CoreDoWorkerWrapper
  - | CoreDoSpecialising
  - | CoreDoSpecConstr
  - | CoreCSE
  - | CoreDoRuleCheck CompilerPhase String
  - | CoreDoNothing
  - | CoreDoPasses [CoreToDo]
  - | CoreDesugar
  - | CoreDesugarOpt
  - | CoreTidy
  - | CorePrep
  - | CoreOccurAnal
- runWhen :: Bool -> CoreToDo -> CoreToDo
- runMaybe :: Maybe a -> (a -> CoreToDo) -> CoreToDo
- data SimplMode = SimplMode {
  - sm_names :: [String]
  - sm_phase :: CompilerPhase
  - sm_dflags :: DynFlags
  - sm_rules :: Bool
  - sm_inline :: Bool
  - sm_case_case :: Bool
  - sm_eta_expand :: Bool
  }
- data FloatOutSwitches = FloatOutSwitches {
  - floatOutLambdas :: Maybe Int
  - floatOutConstants :: Bool
  - floatOutOverSatApps :: Bool
  - floatToTopLevelOnly :: Bool
  }
- pprPassDetails :: CoreToDo -> SDoc
- type CorePluginPass = ModGuts -> CoreM ModGuts
- bindsOnlyPass :: (CoreProgram -> CoreM CoreProgram) -> ModGuts -> CoreM ModGuts
- data SimplCount
- doSimplTick :: DynFlags -> Tick -> SimplCount -> SimplCount
- doFreeSimplTick :: Tick -> SimplCount -> SimplCount
- simplCountN :: SimplCount -> Int
- pprSimplCount :: SimplCount -> SDoc
- plusSimplCount :: SimplCount -> SimplCount -> SimplCount
- zeroSimplCount :: DynFlags -> SimplCount
- isZeroSimplCount :: SimplCount -> Bool
- hasDetailedCounts :: SimplCount -> Bool
- data Tick
  - = PreInlineUnconditionally Id
  - | PostInlineUnconditionally Id
  - | UnfoldingDone Id
  - | RuleFired FastString
  - | LetFloatFromLet
  - | EtaExpansion Id
  - | EtaReduction Id
  - | BetaReduction Id
  - | CaseOfCase Id
  - | KnownBranch Id
  - | CaseMerge Id
  - | AltMerge Id
  - | CaseElim Id
  - | CaseIdentity Id
  - | FillInCaseDefault Id
  - | SimplifierDone
- data CoreM a
- runCoreM :: HscEnv -> RuleBase -> UniqSupply -> Module -> ModuleSet -> PrintUnqualified -> SrcSpan -> CoreM a -> IO (a, SimplCount)
- getHscEnv :: CoreM HscEnv
- getRuleBase :: CoreM RuleBase
- getModule :: HasModule m => m Module
- getDynFlags :: HasDynFlags m => m DynFlags
- getOrigNameCache :: CoreM OrigNameCache
- getPackageFamInstEnv :: CoreM PackageFamInstEnv
- getVisibleOrphanMods :: CoreM ModuleSet
- getPrintUnqualified :: CoreM PrintUnqualified
- getSrcSpanM :: CoreM SrcSpan
- addSimplCount :: SimplCount -> CoreM ()
- liftIO :: MonadIO m => IO a -> m a
- liftIOWithCount :: IO (SimplCount, a) -> CoreM a
- liftIO1 :: MonadIO m => (a -> IO b) -> a -> m b
- liftIO2 :: MonadIO m => (a -> b -> IO c) -> a -> b -> m c
- liftIO3 :: MonadIO m => (a -> b -> c -> IO d) -> a -> b -> c -> m d
- liftIO4 :: MonadIO m => (a -> b -> c -> d -> IO e) -> a -> b -> c -> d -> m e
- reinitializeGlobals :: CoreM ()
- getAnnotations :: Typeable a => ([Word8] -> a) -> ModGuts -> CoreM (UniqFM [a])
- getFirstAnnotations :: Typeable a => ([Word8] -> a) -> ModGuts -> CoreM (UniqFM a)
- putMsg :: SDoc -> CoreM ()
- putMsgS :: String -> CoreM ()
- errorMsg :: SDoc -> CoreM ()
- errorMsgS :: String -> CoreM ()
- warnMsg :: SDoc -> CoreM ()
- fatalErrorMsg :: SDoc -> CoreM ()
- fatalErrorMsgS :: String -> CoreM ()
- debugTraceMsg :: SDoc -> CoreM ()
- debugTraceMsgS :: String -> CoreM ()
- dumpIfSet_dyn :: DumpFlag -> String -> SDoc -> CoreM ()

# Configuration of the core-to-core passes

data CoreToDo Source #

Constructors

CoreDoSimplify Int SimplMode |
CoreDoPluginPass String CorePluginPass |
CoreDoFloatInwards |
CoreDoFloatOutwards FloatOutSwitches |
CoreLiberateCase |
CoreDoPrintCore |
CoreDoStaticArgs |
CoreDoCallArity |
CoreDoExitify |
CoreDoStrictness |
CoreDoWorkerWrapper |
CoreDoSpecialising |
CoreDoSpecConstr |
CoreCSE |
CoreDoRuleCheck CompilerPhase String |
CoreDoNothing |
CoreDoPasses [CoreToDo] |
CoreDesugar |
CoreDesugarOpt |
CoreTidy |
CorePrep |
CoreOccurAnal |

#### Instances

Instances details

Outputable CoreToDo # |
Instance details Defined in CoreMonad Methods ppr :: CoreToDo -> SDoc Source # pprPrec :: Rational -> CoreToDo -> SDoc Source #

runWhen :: Bool -> CoreToDo -> CoreToDo Source #

runMaybe :: Maybe a -> (a -> CoreToDo) -> CoreToDo Source #

data SimplMode Source #

Constructors

SimplMode |
Fields sm_names :: [String] sm_phase :: CompilerPhase sm_dflags :: DynFlags sm_rules :: Bool sm_inline :: Bool sm_case_case :: Bool sm_eta_expand :: Bool

#### Instances

Instances details

Outputable SimplMode # |
Instance details Defined in CoreMonad Methods ppr :: SimplMode -> SDoc Source # pprPrec :: Rational -> SimplMode -> SDoc Source #

data FloatOutSwitches Source #

Constructors

FloatOutSwitches |
Fields floatOutLambdas :: Maybe Int Just n = float lambdas to top level, if doing so will abstract over n or fewer value variables Nothing = float all lambdas to top level, regardless of how many free variables Just 0 is the vanilla case: float a lambda iff it has no free vars floatOutConstants :: Bool True = float constants to top level, even if they do not escape a lambda floatOutOverSatApps :: Bool True = float out over-saturated applications based on arity information. See Note [Floating over-saturated applications] in SetLevels floatToTopLevelOnly :: Bool Allow floating to the top level only.

#### Instances

Instances details

Outputable FloatOutSwitches # |
Instance details Defined in CoreMonad Methods ppr :: FloatOutSwitches -> SDoc Source # pprPrec :: Rational -> FloatOutSwitches -> SDoc Source #

pprPassDetails :: CoreToDo -> SDoc Source #

# Plugins

type CorePluginPass = ModGuts -> CoreM ModGuts Source #

A description of the plugin pass itself

bindsOnlyPass :: (CoreProgram -> CoreM CoreProgram) -> ModGuts -> CoreM ModGuts Source #

# Counting

data SimplCount Source #

doSimplTick :: DynFlags -> Tick -> SimplCount -> SimplCount Source #

doFreeSimplTick :: Tick -> SimplCount -> SimplCount Source #

simplCountN :: SimplCount -> Int Source #

pprSimplCount :: SimplCount -> SDoc Source #

plusSimplCount :: SimplCount -> SimplCount -> SimplCount Source #

zeroSimplCount :: DynFlags -> SimplCount Source #

isZeroSimplCount :: SimplCount -> Bool Source #

hasDetailedCounts :: SimplCount -> Bool Source #

data Tick Source #

Constructors

PreInlineUnconditionally Id |
PostInlineUnconditionally Id |
UnfoldingDone Id |
RuleFired FastString |
LetFloatFromLet |
EtaExpansion Id |
EtaReduction Id |
BetaReduction Id |
CaseOfCase Id |
KnownBranch Id |
CaseMerge Id |
AltMerge Id |
CaseElim Id |
CaseIdentity Id |
FillInCaseDefault Id |
SimplifierDone |

#### Instances

Instances details

Eq Tick # |
Instance details Defined in CoreMonad Methods (==) :: Tick -> Tick -> Bool # (/=) :: Tick -> Tick -> Bool #
Ord Tick # |
Instance details Defined in CoreMonad Methods compare :: Tick -> Tick -> Ordering # (<) :: Tick -> Tick -> Bool # (<=) :: Tick -> Tick -> Bool # (>) :: Tick -> Tick -> Bool # (>=) :: Tick -> Tick -> Bool # max :: Tick -> Tick -> Tick # min :: Tick -> Tick -> Tick #
Outputable Tick # |
Instance details Defined in CoreMonad Methods ppr :: Tick -> SDoc Source # pprPrec :: Rational -> Tick -> SDoc Source #

# The monad

data CoreM a Source #

The monad used by Core-to-Core passes to access common state, register simplification statistics and so on

#### Instances

Instances details

Monad CoreM # |
Instance details Defined in CoreMonad Methods (>>=) :: CoreM a -> (a -> CoreM b) -> CoreM b Source # (>>) :: CoreM a -> CoreM b -> CoreM b Source # return :: a -> CoreM a Source #
Functor CoreM # |
Instance details Defined in CoreMonad Methods fmap :: (a -> b) -> CoreM a -> CoreM b Source # (<$) :: a -> CoreM b -> CoreM a Source #
Applicative CoreM # |
Instance details Defined in CoreMonad Methods pure :: a -> CoreM a Source # (<*>) :: CoreM (a -> b) -> CoreM a -> CoreM b Source # liftA2 :: (a -> b -> c) -> CoreM a -> CoreM b -> CoreM c Source # (*>) :: CoreM a -> CoreM b -> CoreM b Source # (<*) :: CoreM a -> CoreM b -> CoreM a Source #
MonadIO CoreM # |
Instance details Defined in CoreMonad Methods liftIO :: IO a -> CoreM a Source #
Alternative CoreM # |
Instance details Defined in CoreMonad Methods empty :: CoreM a Source # (<|>) :: CoreM a -> CoreM a -> CoreM a Source # some :: CoreM a -> CoreM [a] Source # many :: CoreM a -> CoreM [a] Source #
MonadPlus CoreM # |
Instance details Defined in CoreMonad Methods mzero :: CoreM a Source # mplus :: CoreM a -> CoreM a -> CoreM a Source #
MonadUnique CoreM # |
Instance details Defined in CoreMonad Methods getUniqueSupplyM :: CoreM UniqSupply Source # getUniqueM :: CoreM Unique Source # getUniquesM :: CoreM [Unique] Source #
HasModule CoreM # |
Instance details Defined in CoreMonad Methods getModule :: CoreM Module Source #
HasDynFlags CoreM # |
Instance details Defined in CoreMonad Methods getDynFlags :: CoreM DynFlags Source #
MonadThings CoreM # |
Instance details Defined in GhcPlugins Methods lookupThing :: Name -> CoreM TyThing Source # lookupId :: Name -> CoreM Id Source # lookupDataCon :: Name -> CoreM DataCon Source # lookupTyCon :: Name -> CoreM TyCon Source #

runCoreM :: HscEnv -> RuleBase -> UniqSupply -> Module -> ModuleSet -> PrintUnqualified -> SrcSpan -> CoreM a -> IO (a, SimplCount) Source #

## Reading from the monad

getHscEnv :: CoreM HscEnv Source #

getRuleBase :: CoreM RuleBase Source #

getModule :: HasModule m => m Module Source #

getDynFlags :: HasDynFlags m => m DynFlags Source #

getOrigNameCache :: CoreM OrigNameCache Source #

The original name cache is the current mapping from `Module` and `OccName` to a compiler-wide unique `Name`

getPackageFamInstEnv :: CoreM PackageFamInstEnv Source #

getVisibleOrphanMods :: CoreM ModuleSet Source #

getPrintUnqualified :: CoreM PrintUnqualified Source #

getSrcSpanM :: CoreM SrcSpan Source #

## Writing to the monad

addSimplCount :: SimplCount -> CoreM () Source #

## Lifting into the monad

liftIO :: MonadIO m => IO a -> m a Source #

Lift a computation from the `IO` monad.

liftIOWithCount :: IO (SimplCount, a) -> CoreM a Source #

Lift an `IO` operation into `CoreM` while consuming its `SimplCount`

liftIO1 :: MonadIO m => (a -> IO b) -> a -> m b Source #

Lift an `IO` operation with 1 argument into another monad

liftIO2 :: MonadIO m => (a -> b -> IO c) -> a -> b -> m c Source #

Lift an `IO` operation with 2 arguments into another monad

liftIO3 :: MonadIO m => (a -> b -> c -> IO d) -> a -> b -> c -> m d Source #

Lift an `IO` operation with 3 arguments into another monad

liftIO4 :: MonadIO m => (a -> b -> c -> d -> IO e) -> a -> b -> c -> d -> m e Source #

Lift an `IO` operation with 4 arguments into another monad

## Global initialization

reinitializeGlobals :: CoreM () Source #

Deprecated: It is not necessary to call reinitializeGlobals. Since GHC 8.2, this function is a no-op and will be removed in GHC 8.4

## Dealing with annotations

getAnnotations :: Typeable a => ([Word8] -> a) -> ModGuts -> CoreM (UniqFM [a]) Source #

Get all annotations of a given type. This happens lazily, that is no deserialization will take place until the [a] is actually demanded and the [a] can also be empty (the UniqFM is not filtered).

This should be done once at the start of a Core-to-Core pass that uses annotations.

See Note [Annotations]

getFirstAnnotations :: Typeable a => ([Word8] -> a) -> ModGuts -> CoreM (UniqFM a) Source #

Get at most one annotation of a given type per Unique.

## Screen output

putMsg :: SDoc -> CoreM () Source #

Output a message to the screen

putMsgS :: String -> CoreM () Source #

Output a String message to the screen

errorMsg :: SDoc -> CoreM () Source #

Output an error to the screen. Does not cause the compiler to die.

errorMsgS :: String -> CoreM () Source #

Output an error to the screen. Does not cause the compiler to die.

warnMsg :: SDoc -> CoreM () Source #

fatalErrorMsg :: SDoc -> CoreM () Source #

Output a fatal error to the screen. Does not cause the compiler to die.

fatalErrorMsgS :: String -> CoreM () Source #

Output a fatal error to the screen. Does not cause the compiler to die.

debugTraceMsg :: SDoc -> CoreM () Source #

Outputs a debugging message at verbosity level of `-v` or higher

debugTraceMsgS :: String -> CoreM () Source #

Output a string debugging message at verbosity level of `-v` or higher

dumpIfSet_dyn :: DumpFlag -> String -> SDoc -> CoreM () Source #

Show some labelled `SDoc` if a particular flag is set or at a verbosity level of `-v -ddump-most` or higher