module DDC.Driver.Stage.Salt
( stageSaltLoad
, stageSaltOpt
, stageSaltToC
, stageSaltToLLVM
, stageCompileSalt
, stageCompileLLVM)
where
import DDC.Driver.Dump
import DDC.Driver.Config
import DDC.Driver.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
oPath = objectPathOfConfig config filePath
exePath = exePathOfConfig config filePath
cPath = replaceExtension oPath ".ddc.c"
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
-> Maybe [FilePath]
-> PipeLlvm
stageCompileLLVM config _source filePath mOtherExeObjs
= let
oPath = objectPathOfConfig config filePath
exePath = exePathOfConfig config filePath
llPath = replaceExtension oPath ".ddc.ll"
sPath = replaceExtension oPath ".ddc.s"
in
PipeLlvmCompile
{ pipeBuilder = configBuilder config
, pipeFileLlvm = llPath
, pipeFileAsm = sPath
, pipeFileObject = oPath
, pipeFileExe = if isJust $ mOtherExeObjs then Just exePath else Nothing
, pipeLinkOtherObjects = concat $ maybeToList mOtherExeObjs
, pipeKeepLlvmFiles = configKeepLlvmFiles config
, pipeKeepAsmFiles = configKeepAsmFiles config }