module Unison.Runtime.JIT.Config
( Mode (..),
Replacements (..),
ReplacementUse (..),
Config (..),
replacements,
setReplacements,
replacementActive,
readConfig,
jitLog,
jitDump,
)
where
import Control.Exception (throwIO)
import Data.Char (toLower)
import Data.IORef
import Data.List (stripPrefix)
import Data.Maybe (fromMaybe, isJust, mapMaybe)
import System.Environment (lookupEnv)
import System.IO (hFlush, hPutStrLn, stderr)
import System.IO.Unsafe (unsafePerformIO)
import Text.Read (readMaybe)
data Mode
=
Off
|
On
|
Eager
deriving (Int -> Mode -> ShowS
[Mode] -> ShowS
Mode -> [Char]
(Int -> Mode -> ShowS)
-> (Mode -> [Char]) -> ([Mode] -> ShowS) -> Show Mode
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Mode -> ShowS
showsPrec :: Int -> Mode -> ShowS
$cshow :: Mode -> [Char]
show :: Mode -> [Char]
$cshowList :: [Mode] -> ShowS
showList :: [Mode] -> ShowS
Show, Mode -> Mode -> Bool
(Mode -> Mode -> Bool) -> (Mode -> Mode -> Bool) -> Eq Mode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Mode -> Mode -> Bool
== :: Mode -> Mode -> Bool
$c/= :: Mode -> Mode -> Bool
/= :: Mode -> Mode -> Bool
Eq)
data Replacements
=
AllReplacements
|
TaggedReplacements
|
NoReplacements
deriving (Int -> Replacements -> ShowS
[Replacements] -> ShowS
Replacements -> [Char]
(Int -> Replacements -> ShowS)
-> (Replacements -> [Char])
-> ([Replacements] -> ShowS)
-> Show Replacements
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Replacements -> ShowS
showsPrec :: Int -> Replacements -> ShowS
$cshow :: Replacements -> [Char]
show :: Replacements -> [Char]
$cshowList :: [Replacements] -> ShowS
showList :: [Replacements] -> ShowS
Show, Replacements -> Replacements -> Bool
(Replacements -> Replacements -> Bool)
-> (Replacements -> Replacements -> Bool) -> Eq Replacements
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Replacements -> Replacements -> Bool
== :: Replacements -> Replacements -> Bool
$c/= :: Replacements -> Replacements -> Bool
/= :: Replacements -> Replacements -> Bool
Eq)
data ReplacementUse = Always | InterpreterOnly
deriving (Int -> ReplacementUse -> ShowS
[ReplacementUse] -> ShowS
ReplacementUse -> [Char]
(Int -> ReplacementUse -> ShowS)
-> (ReplacementUse -> [Char])
-> ([ReplacementUse] -> ShowS)
-> Show ReplacementUse
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ReplacementUse -> ShowS
showsPrec :: Int -> ReplacementUse -> ShowS
$cshow :: ReplacementUse -> [Char]
show :: ReplacementUse -> [Char]
$cshowList :: [ReplacementUse] -> ShowS
showList :: [ReplacementUse] -> ShowS
Show, ReplacementUse -> ReplacementUse -> Bool
(ReplacementUse -> ReplacementUse -> Bool)
-> (ReplacementUse -> ReplacementUse -> Bool) -> Eq ReplacementUse
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ReplacementUse -> ReplacementUse -> Bool
== :: ReplacementUse -> ReplacementUse -> Bool
$c/= :: ReplacementUse -> ReplacementUse -> Bool
/= :: ReplacementUse -> ReplacementUse -> Bool
Eq)
replacements :: Replacements
replacements :: Replacements
replacements = IO Replacements -> Replacements
forall a. IO a -> a
unsafePerformIO (IO Replacements -> Replacements)
-> IO Replacements -> Replacements
forall a b. (a -> b) -> a -> b
$ do
Maybe Replacements
chosen <- IORef (Maybe Replacements) -> IO (Maybe Replacements)
forall a. IORef a -> IO a
readIORef IORef (Maybe Replacements)
replacementsRef
Replacements
r <- IO Replacements
-> (Replacements -> IO Replacements)
-> Maybe Replacements
-> IO Replacements
forall b a. b -> (a -> b) -> Maybe a -> b
maybe IO Replacements
replacementsFromEnvironment Replacements -> IO Replacements
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Replacements
chosen
IORef (Maybe Replacements) -> Maybe Replacements -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef (Maybe Replacements)
replacementsRef (Replacements -> Maybe Replacements
forall a. a -> Maybe a
Just Replacements
r)
IORef Bool -> Bool -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef Bool
replacementsUsed Bool
True
pure Replacements
r
{-# NOINLINE replacements #-}
replacementsFromEnvironment :: IO Replacements
replacementsFromEnvironment :: IO Replacements
replacementsFromEnvironment = do
Maybe [Char]
mode <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT"
Maybe [Char]
repl <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_REPLACEMENTS"
pure $ case ((Char -> Char) -> ShowS
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower ShowS -> Maybe [Char] -> Maybe [Char]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe [Char]
repl, (Char -> Char) -> ShowS
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower ([Char] -> Maybe [Char] -> [Char]
forall a. a -> Maybe a -> a
fromMaybe [Char]
"off" Maybe [Char]
mode)) of
(Just [Char]
"on", [Char]
_) -> Replacements
AllReplacements
(Just [Char]
"off", [Char]
_) -> Replacements
NoReplacements
(Maybe [Char]
_, [Char]
"on") -> Replacements
TaggedReplacements
(Maybe [Char]
_, [Char]
"eager") -> Replacements
TaggedReplacements
(Maybe [Char], [Char])
_ -> Replacements
AllReplacements
replacementsRef :: IORef (Maybe Replacements)
replacementsRef :: IORef (Maybe Replacements)
replacementsRef = IO (IORef (Maybe Replacements)) -> IORef (Maybe Replacements)
forall a. IO a -> a
unsafePerformIO (Maybe Replacements -> IO (IORef (Maybe Replacements))
forall a. a -> IO (IORef a)
newIORef Maybe Replacements
forall a. Maybe a
Nothing)
{-# NOINLINE replacementsRef #-}
replacementsUsed :: IORef Bool
replacementsUsed :: IORef Bool
replacementsUsed = IO (IORef Bool) -> IORef Bool
forall a. IO a -> a
unsafePerformIO (Bool -> IO (IORef Bool)
forall a. a -> IO (IORef a)
newIORef Bool
False)
{-# NOINLINE replacementsUsed #-}
setReplacements :: Replacements -> IO ()
setReplacements :: Replacements -> IO ()
setReplacements Replacements
r = do
Bool
used <- IORef Bool -> IO Bool
forall a. IORef a -> IO a
readIORef IORef Bool
replacementsUsed
Maybe Replacements
chosen <- IORef (Maybe Replacements) -> IO (Maybe Replacements)
forall a. IORef a -> IO a
readIORef IORef (Maybe Replacements)
replacementsRef
case Maybe Replacements
chosen of
Just Replacements
r' | Bool
used Bool -> Bool -> Bool
&& Replacements
r' Replacements -> Replacements -> Bool
forall a. Eq a => a -> a -> Bool
/= Replacements
r -> IOError -> IO ()
forall e a. (HasCallStack, Exception e) => e -> IO a
throwIO ([Char] -> IOError
userError ([Char]
"the replacement setting is " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ Replacements -> [Char]
forall a. Show a => a -> [Char]
show Replacements
r' [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
" and already in use; it cannot be changed to " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ Replacements -> [Char]
forall a. Show a => a -> [Char]
show Replacements
r))
Maybe Replacements
_ -> IORef (Maybe Replacements) -> Maybe Replacements -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef (Maybe Replacements)
replacementsRef (Replacements -> Maybe Replacements
forall a. a -> Maybe a
Just Replacements
r)
replacementActive :: ReplacementUse -> Bool
replacementActive :: ReplacementUse -> Bool
replacementActive ReplacementUse
use = case Replacements
replacements of
Replacements
AllReplacements -> Bool
True
Replacements
NoReplacements -> Bool
False
Replacements
TaggedReplacements -> ReplacementUse
use ReplacementUse -> ReplacementUse -> Bool
forall a. Eq a => a -> a -> Bool
== ReplacementUse
Always
data Config = Config
{ Config -> Mode
mode :: Mode,
Config -> Int
threshold :: Int,
Config -> Int
batch :: Int,
Config -> Int
batchGate :: Int,
Config -> Int
sizeUnit :: Int,
Config -> [Char]
passes :: String,
Config -> Bool
exitCall :: Bool,
Config -> Double
copyBound :: Double,
Config -> Int
reentryWait :: Int,
Config -> Int
reentryAdHoc :: Int,
Config -> Double
exitCost :: Double,
Config -> Double
entryCost :: Double,
Config -> Bool
logging :: Bool,
Config -> Maybe [Char]
dumpIR :: Maybe FilePath,
Config -> Bool
dumpMCode :: Bool,
Config -> Bool
trace :: Bool,
Config -> Bool
stats :: Bool,
Config -> Bool
statsEach :: Bool,
Config -> Int
statsEvery :: Int,
Config -> Int
stressPoll :: Int,
Config -> Maybe Int
stressStack :: Maybe Int,
Config -> Int
stressCallee :: Int,
Config -> Int
stressCStack :: Int,
Config -> Int
stressAlloc :: Int,
Config -> Int
stressInstall :: Int,
Config -> Maybe Int
stressPool :: Maybe Int,
Config -> Int
stressLists :: Int,
Config -> Int
stressTexts :: Int,
Config -> Int
stressBytes :: Int,
Config -> [[Char]]
disabled :: [String]
}
deriving (Int -> Config -> ShowS
[Config] -> ShowS
Config -> [Char]
(Int -> Config -> ShowS)
-> (Config -> [Char]) -> ([Config] -> ShowS) -> Show Config
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Config -> ShowS
showsPrec :: Int -> Config -> ShowS
$cshow :: Config -> [Char]
show :: Config -> [Char]
$cshowList :: [Config] -> ShowS
showList :: [Config] -> ShowS
Show)
readConfig :: IO Config
readConfig :: IO Config
readConfig = do
Bool
debug <- Maybe [Char] -> Bool
forall a. Maybe a -> Bool
isJust (Maybe [Char] -> Bool) -> IO (Maybe [Char]) -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT_DEBUG"
let gated :: [Char] -> IO (Maybe [Char])
gated [Char]
name = if Bool
debug then [Char] -> IO (Maybe [Char])
lookupEnv [Char]
name else Maybe [Char] -> IO (Maybe [Char])
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe [Char]
forall a. Maybe a
Nothing
Maybe [Char]
mode <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT"
Maybe [Char]
logging <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT_LOG"
Maybe [Char]
dump <- [Char] -> IO (Maybe [Char])
gated [Char]
"UNISON_JIT_DUMP_IR"
Maybe [Char]
stats <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT_STATS"
Maybe [Char]
every <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT_STATS_EVERY"
Maybe [Char]
thresh <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT_THRESHOLD"
Maybe [Char]
batchSize <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT_BATCH"
Maybe [Char]
gate <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT_BATCH_GATE"
Maybe [Char]
sizeU <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT_SIZE_UNIT"
Maybe [Char]
pipeline <- [Char] -> IO (Maybe [Char])
gated [Char]
"UNISON_JIT_PASSES"
Maybe [Char]
exits <- [Char] -> IO (Maybe [Char])
gated [Char]
"UNISON_JIT_EXITS"
Maybe [Char]
copyB <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT_COPY"
Maybe [Char]
reWait <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT_REENTRY_WAIT"
Maybe [Char]
reAdHoc <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT_REENTRY_ADHOC"
Maybe [Char]
cost <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT_EXIT_COST"
Maybe [Char]
entry <- [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"UNISON_JIT_ENTRY_COST"
Maybe [Char]
mcode <- [Char] -> IO (Maybe [Char])
gated [Char]
"UNISON_JIT_DUMP_MCODE"
Maybe [Char]
tr <- [Char] -> IO (Maybe [Char])
gated [Char]
"UNISON_JIT_TRACE"
[[Char]]
stress <- [[Char]] -> ([Char] -> [[Char]]) -> Maybe [Char] -> [[Char]]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (Char -> [Char] -> [[Char]]
forall {t}. Eq t => t -> [t] -> [[t]]
splitOn Char
',') (Maybe [Char] -> [[Char]]) -> IO (Maybe [Char]) -> IO [[Char]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Char] -> IO (Maybe [Char])
gated [Char]
"UNISON_JIT_STRESS"
[[Char]]
disabledFeatures <- [[Char]] -> ([Char] -> [[Char]]) -> Maybe [Char] -> [[Char]]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (Char -> [Char] -> [[Char]]
forall {t}. Eq t => t -> [t] -> [[t]]
splitOn Char
',') (Maybe [Char] -> [[Char]]) -> IO (Maybe [Char]) -> IO [[Char]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Char] -> IO (Maybe [Char])
gated [Char]
"UNISON_JIT_DISABLE"
let setting :: [Char] -> Maybe Int
setting [Char]
key = [[Char]] -> Maybe [Char]
forall {a}. [a] -> Maybe a
listToMaybe' (([Char] -> Maybe [Char]) -> [[Char]] -> [[Char]]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe ([Char] -> [Char] -> Maybe [Char]
forall a. Eq a => [a] -> [a] -> Maybe [a]
stripPrefix ([Char]
key [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
"=")) [[Char]]
stress) Maybe [Char] -> ([Char] -> Maybe Int) -> Maybe Int
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> Maybe Int
forall a. Read a => [Char] -> Maybe a
readMaybe
pure
Config
{ mode :: Mode
mode = case (Char -> Char) -> ShowS
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower ([Char] -> Maybe [Char] -> [Char]
forall a. a -> Maybe a -> a
fromMaybe [Char]
"off" Maybe [Char]
mode) of
[Char]
"eager" -> Mode
Eager
[Char]
"on" -> Mode
On
[Char]
_ -> Mode
Off,
threshold :: Int
threshold = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
100 (Maybe [Char]
thresh Maybe [Char] -> ([Char] -> Maybe Int) -> Maybe Int
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> Maybe Int
forall a. Read a => [Char] -> Maybe a
readMaybe)),
batch :: Int
batch = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
32 (Maybe [Char]
batchSize Maybe [Char] -> ([Char] -> Maybe Int) -> Maybe Int
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> Maybe Int
forall a. Read a => [Char] -> Maybe a
readMaybe)),
batchGate :: Int
batchGate = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
100 (Maybe [Char]
thresh Maybe [Char] -> ([Char] -> Maybe Int) -> Maybe Int
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> Maybe Int
forall a. Read a => [Char] -> Maybe a
readMaybe)) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
4) (Maybe [Char]
gate Maybe [Char] -> ([Char] -> Maybe Int) -> Maybe Int
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> Maybe Int
forall a. Read a => [Char] -> Maybe a
readMaybe)),
sizeUnit :: Int
sizeUnit = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
500 (Maybe [Char]
sizeU Maybe [Char] -> ([Char] -> Maybe Int) -> Maybe Int
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> Maybe Int
forall a. Read a => [Char] -> Maybe a
readMaybe)),
passes :: [Char]
passes = [Char] -> Maybe [Char] -> [Char]
forall a. a -> Maybe a -> a
fromMaybe [Char]
defaultPasses Maybe [Char]
pipeline,
exitCall :: Bool
exitCall = ShowS -> Maybe [Char] -> Maybe [Char]
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Char -> Char) -> ShowS
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower) Maybe [Char]
exits Maybe [Char] -> Maybe [Char] -> Bool
forall a. Eq a => a -> a -> Bool
/= [Char] -> Maybe [Char]
forall a. a -> Maybe a
Just [Char]
"blocks",
copyBound :: Double
copyBound = Double -> Double -> Double
forall a. Ord a => a -> a -> a
max Double
0 (Double -> Maybe Double -> Double
forall a. a -> Maybe a -> a
fromMaybe Double
40 (Maybe [Char]
copyB Maybe [Char] -> ([Char] -> Maybe Double) -> Maybe Double
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> Maybe Double
forall a. Read a => [Char] -> Maybe a
readMaybe)),
reentryWait :: Int
reentryWait = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
20 (Maybe [Char]
reWait Maybe [Char] -> ([Char] -> Maybe Int) -> Maybe Int
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> Maybe Int
forall a. Read a => [Char] -> Maybe a
readMaybe)),
reentryAdHoc :: Int
reentryAdHoc = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
3 (Maybe [Char]
reAdHoc Maybe [Char] -> ([Char] -> Maybe Int) -> Maybe Int
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> Maybe Int
forall a. Read a => [Char] -> Maybe a
readMaybe)),
exitCost :: Double
exitCost = Double -> Double -> Double
forall a. Ord a => a -> a -> a
max Double
0 (Double -> Maybe Double -> Double
forall a. a -> Maybe a -> a
fromMaybe Double
7 (Maybe [Char]
cost Maybe [Char] -> ([Char] -> Maybe Double) -> Maybe Double
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> Maybe Double
forall a. Read a => [Char] -> Maybe a
readMaybe)),
entryCost :: Double
entryCost = Double -> Double -> Double
forall a. Ord a => a -> a -> a
max Double
0 (Double -> Maybe Double -> Double
forall a. a -> Maybe a -> a
fromMaybe Double
3 (Maybe [Char]
entry Maybe [Char] -> ([Char] -> Maybe Double) -> Maybe Double
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> Maybe Double
forall a. Read a => [Char] -> Maybe a
readMaybe)),
logging :: Bool
logging = Bool -> ([Char] -> Bool) -> Maybe [Char] -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (Bool -> Bool
not (Bool -> Bool) -> ([Char] -> Bool) -> [Char] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) Maybe [Char]
logging,
dumpIR :: Maybe [Char]
dumpIR = Maybe [Char]
dump,
dumpMCode :: Bool
dumpMCode = Bool -> ([Char] -> Bool) -> Maybe [Char] -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (Bool -> Bool
not (Bool -> Bool) -> ([Char] -> Bool) -> [Char] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) Maybe [Char]
mcode,
trace :: Bool
trace = Bool -> ([Char] -> Bool) -> Maybe [Char] -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (Bool -> Bool
not (Bool -> Bool) -> ([Char] -> Bool) -> [Char] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) Maybe [Char]
tr,
stats :: Bool
stats = Bool -> ([Char] -> Bool) -> Maybe [Char] -> Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (Bool -> Bool
not (Bool -> Bool) -> ([Char] -> Bool) -> [Char] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) Maybe [Char]
stats,
statsEach :: Bool
statsEach = Maybe [Char]
stats Maybe [Char] -> Maybe [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char] -> Maybe [Char]
forall a. a -> Maybe a
Just [Char]
"each",
stressPoll :: Int
stressPoll = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 ([Char] -> Maybe Int
setting [Char]
"poll"),
stressStack :: Maybe Int
stressStack = Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Int -> Int) -> Maybe Int -> Maybe Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Char] -> Maybe Int
setting [Char]
"ustack",
stressCallee :: Int
stressCallee = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 ([Char] -> Maybe Int
setting [Char]
"callee"),
stressCStack :: Int
stressCStack = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 ([Char] -> Maybe Int
setting [Char]
"cstack"),
stressAlloc :: Int
stressAlloc = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 ([Char] -> Maybe Int
setting [Char]
"alloc"),
stressInstall :: Int
stressInstall = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 ([Char] -> Maybe Int
setting [Char]
"install"),
stressPool :: Maybe Int
stressPool = [Char] -> Maybe Int
setting [Char]
"pool",
stressLists :: Int
stressLists = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 ([Char] -> Maybe Int
setting [Char]
"lists"),
stressTexts :: Int
stressTexts = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 ([Char] -> Maybe Int
setting [Char]
"texts"),
stressBytes :: Int
stressBytes = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 ([Char] -> Maybe Int
setting [Char]
"bytes"),
statsEvery :: Int
statsEvery = Int -> Maybe Int -> Int
forall a. a -> Maybe a -> a
fromMaybe Int
0 (Maybe [Char]
every Maybe [Char] -> ([Char] -> Maybe Int) -> Maybe Int
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Char] -> Maybe Int
forall a. Read a => [Char] -> Maybe a
readMaybe),
disabled :: [[Char]]
disabled = [[Char]]
disabledFeatures
}
where
splitOn :: t -> [t] -> [[t]]
splitOn t
c [t]
s = case (t -> Bool) -> [t] -> ([t], [t])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (t -> t -> Bool
forall a. Eq a => a -> a -> Bool
== t
c) [t]
s of
([t]
a, []) -> [[t]
a]
([t]
a, t
_ : [t]
rest) -> [t]
a [t] -> [[t]] -> [[t]]
forall a. a -> [a] -> [a]
: t -> [t] -> [[t]]
splitOn t
c [t]
rest
listToMaybe' :: [a] -> Maybe a
listToMaybe' [] = Maybe a
forall a. Maybe a
Nothing
listToMaybe' (a
x : [a]
_) = a -> Maybe a
forall a. a -> Maybe a
Just a
x
jitLog :: Config -> String -> IO ()
jitLog :: Config -> [Char] -> IO ()
jitLog Config
config [Char]
msg
| Config -> Bool
logging Config
config = Handle -> [Char] -> IO ()
hPutStrLn Handle
stderr ([Char]
"[jit] " [Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
msg)
| Bool
otherwise = () -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
jitDump :: String -> IO ()
jitDump :: [Char] -> IO ()
jitDump [Char]
msg = Handle -> [Char] -> IO ()
hPutStrLn Handle
stderr [Char]
msg IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Handle -> IO ()
hFlush Handle
stderr
defaultPasses :: String
defaultPasses :: [Char]
defaultPasses =
[Char]
"function(mem2reg,sroa,early-cse,simplifycfg,instcombine),ipsccp,"
[Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
"cgscc(inline,function-attrs,function(sroa,early-cse<memssa>,simplifycfg,instcombine,"
[Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
"jump-threading,correlated-propagation,loop-mssa(loop-rotate,licm,simple-loop-unswitch),"
[Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
"simplifycfg,instcombine,gvn,sccp,dse,loop-unroll,instcombine,adce,simplifycfg)),"
[Char] -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char]
"function(simplifycfg),globaldce"