uhc-light-1.1.9.3: src/UHC/Light/Compiler/EHC/CompilePhase/Output.hs
module UHC.Light.Compiler.EHC.CompilePhase.Output
( cpOutputSomeModules
, cpOutputSomeModule
, cpOutputCore
, cpOutputHI )
where
import UHC.Util.Lens
import qualified UHC.Util.FastSeq as Seq
import qualified Data.Map as Map
import qualified Data.Set as Set
import Control.Monad.State
import UHC.Util.Lens
import UHC.Light.Compiler.EHC.Common
import UHC.Light.Compiler.EHC.CompileUnit
import UHC.Light.Compiler.EHC.CompileRun.Base
import qualified UHC.Light.Compiler.Config as Cfg
import UHC.Light.Compiler.EHC.ASTHandler.Instances
import qualified UHC.Light.Compiler.Core.ToGrin as Core2GrSem
import UHC.Light.Compiler.Core.Trf.EraseExtractTysigCore
import UHC.Util.Time
import System.Directory
import qualified UHC.Light.Compiler.SourceCodeSig as Sig
import qualified UHC.Light.Compiler.HI as HI
import qualified UHC.Util.Binary as Bin
import UHC.Util.Serialize
import UHC.Light.Compiler.Gam
import UHC.Light.Compiler.Module.ImportExport
import qualified UHC.Light.Compiler.EH.Main as EHSem
import UHC.Light.Compiler.Gam.Utils
{-# LINE 104 "src/ehc/EHC/CompilePhase/Output.chs" #-}
-- | Abstraction for writing some module to output with variation in suffices
cpOutputSomeModules
:: EHCCompileRunner m
=> Maybe EHCOpts
-> ASTHandler' mod -- (EHCOpts -> EHCompileUnit -> FPath -> FilePath -> mod -> IO Bool)
-> ASTFileContent
-> (Int -> String -> String)
-> String
-> HsName
-> [(String,mod)]
-> EHCompilePhaseT m [Maybe FPath]
cpOutputSomeModules mbOpts astHdlr how mknmsuff suff modNm mods = do
cr <- get
let (ecu,crsi,opts,fp) = crBaseInfo modNm cr
forM (zip [1..] mods) $ \(nr,(nmsuff,mod)) -> do
let fpC = _asthdlrMkOutputFPath astHdlr opts modNm fp (suff ++ mknmsuff nr nmsuff) -- for now nmsuff after suff, but should be inside name
fnC = fpathToStr fpC
okWrite <- if ecuSrcHasSuffix suff ecu
then return False
else liftIO $ do
-- fpathEnsureExists fpC
asthdlrOutputIO astHdlr how opts ecu modNm fpC fnC mod
return $ if okWrite then Just fpC else Nothing
{-# LINE 130 "src/ehc/EHC/CompilePhase/Output.chs" #-}
-- | Abstraction for writing a module, using cpOutputSomeModules
cpOutputSomeModule
:: EHCCompileRunner m
=> (EHCompileUnit -> mod)
-> ASTHandler' mod
-> ASTFileContent
-> String
-> String
-> HsName
-> EHCompilePhaseT m (Maybe FPath)
cpOutputSomeModule getMod astHdlr how nmsuff suff modNm
= do { cr <- get
; let (ecu,_,_,_) = crBaseInfo modNm cr
mod = getMod ecu
; cpMsg modNm VerboseALot $ "Emit " ++ _asthdlrName astHdlr
; fmap head $ cpOutputSomeModules Nothing astHdlr how (\_ nm -> nm) suff modNm [(nmsuff,mod)]
}
{-# LINE 154 "src/ehc/EHC/CompilePhase/Output.chs" #-}
cpOutputCore :: EHCCompileRunner m => ASTFileContent -> String -> String -> HsName -> EHCompilePhaseT m FPath
cpOutputCore how nmsuff suff modNm =
fmap (panicJust "cpOutputCore.cpOutputSomeModule") $
cpOutputSomeModule (^. ecuCore) astHandler'_Core how nmsuff suff modNm
{-# LINE 220 "src/ehc/EHC/CompilePhase/Output.chs" #-}
cpOutputHI :: EHCCompileRunner m => String -> HsName -> EHCompilePhaseT m ()
cpOutputHI suff modNm
= do { cr <- get
; let (ecu,crsi,opts,fp) = crBaseInfo modNm cr
mmi = panicJust "cpOutputHI.crsiModMp" $ Map.lookup modNm $ crsiModMp crsi
hii1 = ecu ^. ecuHIInfo
impNmS = ecuImpNmS ecu
hii2 = hii1 { HI.hiiValidity = HI.HIValidity_Ok
, HI.hiiModuleNm = modNm
, HI.hiiExps = mmiExps mmi
, HI.hiiHiddenExps = mmiHiddenExps mmi
, HI.hiiHasMain = ecuHasMain ecu
, HI.hiiTarget = ehcOptTarget opts
, HI.hiiTargetFlavor = ehcOptTargetFlavor opts
, HI.hiiSrcTimeStamp = Sig.timestamp
, HI.hiiSrcSig = Sig.sig
, HI.hiiSrcVersionMajor = Cfg.verMajor Cfg.version
, HI.hiiSrcVersionMinor = Cfg.verMinor Cfg.version
, HI.hiiSrcVersionMinorMinor = Cfg.verMinorMinor Cfg.version
, HI.hiiSrcVersionSvn = Cfg.verSvnRevision Cfg.version
, HI.hiiCompileFlags = optsDiscrRecompileRepr opts
, HI.hiiCompiler = Cfg.installVariant opts
, HI.hiiTransClosedUsedModMp = Map.unions $
Map.singleton modNm impNmS : [ ecuTransClosedUsedModMp $ crCU m cr | m <- Set.toList impNmS ]
, HI.hiiTransClosedOrphanModS= Set.unions $
[ Set.unions [if ecuIsOrphan me then Set.singleton m else Set.empty, ecuTransClosedOrphanModS me]
| m <- Set.toList impNmS
, let me = crCU m cr
]
}
hii3 = hii2
fpH = mkOutputFPath opts modNm fp suff
fnH = fpathToStr fpH
; cpMsg modNm VerboseALot "Emit HI"
; hiExists <- liftIO $ doesFileExist fnH
; when (hiExists)
(liftIO $ removeFile fnH)
; when (ehcOptVerbosity opts > VerboseALot)
(do { liftIO $ putPPLn ("hii3: " >#< hii3)
; liftIO $ putPPLn ("orph: " >#< vlist [ m >#< (fmap Set.toList $ HI.hiiMbOrphan $ me ^. ecuHIInfo) | m <- Set.toList impNmS, let me = crCU m cr ])
; liftIO $ putPPLn ("used nms: " >#< (pp $ show $ ecuUsedNames ecu))
})
{-
; liftIO $ do { fpathEnsureExists fpH
; putSerializeFile fnH hii3
}
-}
; liftIO $ asthdlrOutputIO astHandler'_HI ASTFileContent_Binary opts ecu modNm fpH fnH hii3
; now <- liftIO $ getClockTime
; cpUpdCU modNm ( ecuStoreHIInfoTime now
. ecuStoreHIInfo hii3
)
}