From 5f97202498b3b6d0c98a98512260a9af8bf074be Mon Sep 17 00:00:00 2001 From: Leon Schoorl Date: Fri, 9 Nov 2018 18:11:49 +0100 Subject: [PATCH 1/3] WIP: Load (typechecker) plugins from language pragmas --- haddock-api/src/Haddock/Interface.hs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/haddock-api/src/Haddock/Interface.hs b/haddock-api/src/Haddock/Interface.hs index 759d5d039f..31b9e5482e 100644 --- a/haddock-api/src/Haddock/Interface.hs +++ b/haddock-api/src/Haddock/Interface.hs @@ -64,6 +64,7 @@ import Name (nameIsFromExternalPackage, nameOccName) import OccName (isTcOcc) import RdrName (unQualOK, gre_name, globalRdrEnvElts) import ErrUtils (withTiming) +import DynamicLoading (initializePlugins) #if defined(mingw32_HOST_OS) import System.IO @@ -177,8 +178,20 @@ createIfaces verbosity flags instIfaceMap mods = do processModule :: Verbosity -> ModSummary -> [Flag] -> IfaceMap -> InstIfaceMap -> Ghc (Maybe (Interface, ModuleSet)) processModule verbosity modsum flags modMap instIfaceMap = do out verbosity verbose $ "Checking module " ++ moduleString (ms_mod modsum) ++ "..." - tm <- {-# SCC "parse/typecheck/load" #-} loadModule =<< typecheckModule =<< parseModule modsum + -- tm <- {-# SCC "parse/typecheck/load" #-} loadModule =<< typecheckModule =<< parseModule modsum + parsed <- parseModule modsum + + let dynflags = ms_hspp_opts . pm_mod_summary $ parsed + + hscenv <- GHC.getSession + dynflags1 <- liftIO (initializePlugins hscenv dynflags) + + let mod_summary = (GHC.pm_mod_summary parsed) { GHC.ms_hspp_opts = dynflags1 } + parsed1 = parsed { GHC.pm_mod_summary = mod_summary } + + checked <- typecheckModule parsed1 + tm <- loadModule checked if not $ isBootSummary modsum then do out verbosity verbose "Creating interface..." (interface, msgs) <- {-# SCC createIterface #-} From 0a6cc033574533a81c1528106c515ececc71bf74 Mon Sep 17 00:00:00 2001 From: Alec Theriault Date: Thu, 20 Dec 2018 10:37:23 -0800 Subject: [PATCH 2/3] Revert "Load plugins when starting a GHC session (#905)" This reverts commit 72d82e52f2a6225686d9668790ac33c1d1743193. --- haddock-api/src/Haddock.hs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/haddock-api/src/Haddock.hs b/haddock-api/src/Haddock.hs index 7a2df3a220..43f600b4e2 100644 --- a/haddock-api/src/Haddock.hs +++ b/haddock-api/src/Haddock.hs @@ -76,7 +76,6 @@ import Packages import Panic (handleGhcException) import Module import FastString -import qualified DynamicLoading -------------------------------------------------------------------------------- -- * Exception handling @@ -450,10 +449,7 @@ withGhc' libDir flags ghcActs = runGhc (Just libDir) $ do -- that may need to be re-linked: Haddock doesn't do any -- dynamic or static linking at all! _ <- setSessionDynFlags dynflags'' - hscenv <- GHC.getSession - dynflags''' <- liftIO (DynamicLoading.initializePlugins hscenv dynflags'') - _ <- setSessionDynFlags dynflags''' - ghcActs dynflags''' + ghcActs dynflags'' where -- ignore sublists of flags that start with "+RTS" and end in "-RTS" From 3fdb7bd4a1f35b49412d84aabc42cdcf649f76f8 Mon Sep 17 00:00:00 2001 From: Alec Theriault Date: Thu, 20 Dec 2018 10:58:02 -0800 Subject: [PATCH 3/3] Simplify plugin initialization code --- haddock-api/src/Haddock/Interface.hs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/haddock-api/src/Haddock/Interface.hs b/haddock-api/src/Haddock/Interface.hs index 31b9e5482e..3d54970b50 100644 --- a/haddock-api/src/Haddock/Interface.hs +++ b/haddock-api/src/Haddock/Interface.hs @@ -178,20 +178,14 @@ createIfaces verbosity flags instIfaceMap mods = do processModule :: Verbosity -> ModSummary -> [Flag] -> IfaceMap -> InstIfaceMap -> Ghc (Maybe (Interface, ModuleSet)) processModule verbosity modsum flags modMap instIfaceMap = do out verbosity verbose $ "Checking module " ++ moduleString (ms_mod modsum) ++ "..." - -- tm <- {-# SCC "parse/typecheck/load" #-} loadModule =<< typecheckModule =<< parseModule modsum - parsed <- parseModule modsum + -- Since GHC 8.6, plugins are initialized on a per module basis + hsc_env' <- getSession + dynflags' <- liftIO (initializePlugins hsc_env' (GHC.ms_hspp_opts modsum)) + let modsum' = modsum { ms_hspp_opts = dynflags' } - let dynflags = ms_hspp_opts . pm_mod_summary $ parsed + tm <- {-# SCC "parse/typecheck/load" #-} loadModule =<< typecheckModule =<< parseModule modsum' - hscenv <- GHC.getSession - dynflags1 <- liftIO (initializePlugins hscenv dynflags) - - let mod_summary = (GHC.pm_mod_summary parsed) { GHC.ms_hspp_opts = dynflags1 } - parsed1 = parsed { GHC.pm_mod_summary = mod_summary } - - checked <- typecheckModule parsed1 - tm <- loadModule checked if not $ isBootSummary modsum then do out verbosity verbose "Creating interface..." (interface, msgs) <- {-# SCC createIterface #-}