module DDC.Driver.Stage.Salt
( stageSaltLoad
, stageSaltOpt
, stageSaltToC
, stageSaltToLLVM
, stageCompileSalt
, stageCompileLLVM)
where
import DDC.Driver.Dump
import DDC.Driver.Config
import DDC.Interface.Source
import DDC.Build.Builder
import DDC.Build.Pipeline
import DDC.Core.Transform.Namify
import DDC.Base.Pretty
import System.FilePath
import Data.Maybe
import qualified DDC.Build.Language.Salt as Salt
import qualified DDC.Core.Salt.Name as Salt
import qualified DDC.Core.Salt.Convert as Salt
import qualified DDC.Core.Check as C
import qualified DDC.Core.Simplifier.Recipe as S
stageSaltLoad
:: Config -> Source
-> [PipeCore () Salt.Name]
-> PipeText Salt.Name Salt.Error
stageSaltLoad config source pipesSalt
= PipeTextLoadCore Salt.fragment
(if configInferTypes config then C.Synth else C.Recon)
SinkDiscard
[ PipeCoreReannotate (const ())
( PipeCoreOutput pprDefaultMode
(dump config source "dump.salt-load.dcl")
: pipesSalt ) ]
stageSaltOpt
:: Config -> Source
-> [PipeCore () Salt.Name]
-> PipeCore () Salt.Name
stageSaltOpt config source pipes
= PipeCoreSimplify
Salt.fragment
(0 :: Int)
(configSimplSalt config)
( PipeCoreOutput pprDefaultMode
(dump config source "dump.salt-opt.dcl")
: pipes )
stageSaltToC
:: Config -> Source
-> Sink
-> PipeCore () Salt.Name
stageSaltToC config source sink
= PipeCoreSimplify Salt.fragment 0 normalizeSalt
[ PipeCoreCheck Salt.fragment C.Recon SinkDiscard
[ PipeCoreOutput pprDefaultMode
(dump config source "dump.salt-normalized.dcs")
, PipeCoreAsSalt
[ PipeSaltTransfer
[ PipeSaltOutput (dump config source "dump.salt-transfer.dcs")
, PipeSaltPrint
(not $ configSuppressHashImports config)
(buildSpec $ configBuilder config)
sink ]]]]
where normalizeSalt
= S.anormalize (makeNamifier Salt.freshT)
(makeNamifier Salt.freshX)
stageSaltToLLVM
:: Config -> Source
-> [PipeLlvm]
-> PipeCore () Salt.Name
stageSaltToLLVM config source pipesLLVM
= PipeCoreSimplify Salt.fragment 0 normalizeSalt
[ PipeCoreCheck Salt.fragment C.Recon SinkDiscard
[ PipeCoreOutput pprDefaultMode
(dump config source "dump.salt-normalized.dcs")
, PipeCoreAsSalt
[ PipeSaltTransfer
[ PipeSaltOutput (dump config source "dump.salt-transfer.dcs")
, PipeSaltToLlvm (buildSpec $ configBuilder config)
pipesLLVM ]]]]
where normalizeSalt
= S.anormalize (makeNamifier Salt.freshT)
(makeNamifier Salt.freshX)
stageCompileSalt
:: Config -> Source
-> FilePath
-> Bool
-> PipeCore () Salt.Name
stageCompileSalt config source filePath shouldLinkExe
= let
outputDir = fromMaybe (takeDirectory filePath) (configOutputDir config)
outputDirBase = dropExtension (replaceDirectory filePath outputDir)
cPath = outputDirBase ++ ".ddc.c"
oPath = outputDirBase ++ ".o"
exePathDefault = outputDirBase
exePath = fromMaybe exePathDefault (configOutputFile config)
in
PipeCoreSimplify Salt.fragment 0 normalizeSalt
[ PipeCoreCheck Salt.fragment C.Recon SinkDiscard
[ PipeCoreOutput pprDefaultMode
(dump config source "dump.salt-normalized.dcs")
, PipeCoreAsSalt
[ PipeSaltTransfer
[ PipeSaltOutput (dump config source "dump.salt-transfer.dcs")
, PipeSaltCompile
(buildSpec $ configBuilder config)
(configBuilder config)
cPath
oPath
(if shouldLinkExe
then Just exePath
else Nothing)
(configKeepSeaFiles config)
]]]]
where normalizeSalt
= S.anormalize (makeNamifier Salt.freshT)
(makeNamifier Salt.freshX)
stageCompileLLVM
:: Config -> Source
-> FilePath
-> Bool
-> PipeLlvm
stageCompileLLVM config _source filePath shouldLinkExe
= let
outputDir = fromMaybe (takeDirectory filePath) (configOutputDir config)
outputDirBase = dropExtension (replaceDirectory filePath outputDir)
llPath = outputDirBase ++ ".ddc.ll"
sPath = outputDirBase ++ ".ddc.s"
oPath = outputDirBase ++ ".o"
exePathDefault = outputDirBase
exePath = fromMaybe exePathDefault (configOutputFile config)
in
PipeLlvmCompile
{ pipeBuilder = configBuilder config
, pipeFileLlvm = llPath
, pipeFileAsm = sPath
, pipeFileObject = oPath
, pipeFileExe = if shouldLinkExe
then Just exePath
else Nothing
, pipeKeepLlvmFiles = configKeepLlvmFiles config
, pipeKeepAsmFiles = configKeepAsmFiles config }