-- | Configuration of compiler behaviour that is universal to all backends.
module Futhark.Compiler.Config
  ( FutharkConfig (..),
    newFutharkConfig,
    Verbosity (..),
    CompilerMode (..),
  )
where

import Futhark.IR.Syntax.Core (Name)

-- | Are we compiling a library or an executable?
data CompilerMode
  = ToLibrary
  | ToExecutable
  | ToServer
  deriving (CompilerMode -> CompilerMode -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CompilerMode -> CompilerMode -> Bool
$c/= :: CompilerMode -> CompilerMode -> Bool
== :: CompilerMode -> CompilerMode -> Bool
$c== :: CompilerMode -> CompilerMode -> Bool
Eq, Eq CompilerMode
CompilerMode -> CompilerMode -> Bool
CompilerMode -> CompilerMode -> Ordering
CompilerMode -> CompilerMode -> CompilerMode
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CompilerMode -> CompilerMode -> CompilerMode
$cmin :: CompilerMode -> CompilerMode -> CompilerMode
max :: CompilerMode -> CompilerMode -> CompilerMode
$cmax :: CompilerMode -> CompilerMode -> CompilerMode
>= :: CompilerMode -> CompilerMode -> Bool
$c>= :: CompilerMode -> CompilerMode -> Bool
> :: CompilerMode -> CompilerMode -> Bool
$c> :: CompilerMode -> CompilerMode -> Bool
<= :: CompilerMode -> CompilerMode -> Bool
$c<= :: CompilerMode -> CompilerMode -> Bool
< :: CompilerMode -> CompilerMode -> Bool
$c< :: CompilerMode -> CompilerMode -> Bool
compare :: CompilerMode -> CompilerMode -> Ordering
$ccompare :: CompilerMode -> CompilerMode -> Ordering
Ord, Int -> CompilerMode -> ShowS
[CompilerMode] -> ShowS
CompilerMode -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CompilerMode] -> ShowS
$cshowList :: [CompilerMode] -> ShowS
show :: CompilerMode -> String
$cshow :: CompilerMode -> String
showsPrec :: Int -> CompilerMode -> ShowS
$cshowsPrec :: Int -> CompilerMode -> ShowS
Show)

-- | How much information to print to stderr while the compiler is running.
data Verbosity
  = -- | Silence is golden.
    NotVerbose
  | -- | Print messages about which pass is running.
    Verbose
  | -- | Also print logs from individual passes.
    VeryVerbose
  deriving (Verbosity -> Verbosity -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Verbosity -> Verbosity -> Bool
$c/= :: Verbosity -> Verbosity -> Bool
== :: Verbosity -> Verbosity -> Bool
$c== :: Verbosity -> Verbosity -> Bool
Eq, Eq Verbosity
Verbosity -> Verbosity -> Bool
Verbosity -> Verbosity -> Ordering
Verbosity -> Verbosity -> Verbosity
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Verbosity -> Verbosity -> Verbosity
$cmin :: Verbosity -> Verbosity -> Verbosity
max :: Verbosity -> Verbosity -> Verbosity
$cmax :: Verbosity -> Verbosity -> Verbosity
>= :: Verbosity -> Verbosity -> Bool
$c>= :: Verbosity -> Verbosity -> Bool
> :: Verbosity -> Verbosity -> Bool
$c> :: Verbosity -> Verbosity -> Bool
<= :: Verbosity -> Verbosity -> Bool
$c<= :: Verbosity -> Verbosity -> Bool
< :: Verbosity -> Verbosity -> Bool
$c< :: Verbosity -> Verbosity -> Bool
compare :: Verbosity -> Verbosity -> Ordering
$ccompare :: Verbosity -> Verbosity -> Ordering
Ord)

-- | The compiler configuration.  This only contains options related
-- to core compiler functionality, such as reading the initial program
-- and running passes.  Options related to code generation are handled
-- elsewhere.
data FutharkConfig = FutharkConfig
  { FutharkConfig -> (Verbosity, Maybe String)
futharkVerbose :: (Verbosity, Maybe FilePath),
    -- | Warn if True.
    FutharkConfig -> Bool
futharkWarn :: Bool,
    -- | If true, error on any warnings.
    FutharkConfig -> Bool
futharkWerror :: Bool,
    -- | If True, ignore @unsafe@.
    FutharkConfig -> Bool
futharkSafe :: Bool,
    -- | Additional functions that should be exposed as entry points.
    FutharkConfig -> [Name]
futharkEntryPoints :: [Name],
    -- | If false, disable type-checking
    FutharkConfig -> Bool
futharkTypeCheck :: Bool
  }

-- | The default compiler configuration.
newFutharkConfig :: FutharkConfig
newFutharkConfig :: FutharkConfig
newFutharkConfig =
  FutharkConfig
    { futharkVerbose :: (Verbosity, Maybe String)
futharkVerbose = (Verbosity
NotVerbose, forall a. Maybe a
Nothing),
      futharkWarn :: Bool
futharkWarn = Bool
True,
      futharkWerror :: Bool
futharkWerror = Bool
False,
      futharkSafe :: Bool
futharkSafe = Bool
False,
      futharkEntryPoints :: [Name]
futharkEntryPoints = [],
      futharkTypeCheck :: Bool
futharkTypeCheck = Bool
True
    }